DwarfCompileUnit.cpp revision f61dbc15750f0b1a9a089ac91e6f5e7235335c25
1//===-- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Unit ------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains support for constructing a dwarf compile unit. 11// 12//===----------------------------------------------------------------------===// 13 14#define DEBUG_TYPE "dwarfdebug" 15 16#include "DwarfCompileUnit.h" 17#include "DwarfAccelTable.h" 18#include "DwarfDebug.h" 19#include "llvm/ADT/APFloat.h" 20#include "llvm/DIBuilder.h" 21#include "llvm/IR/Constants.h" 22#include "llvm/IR/DataLayout.h" 23#include "llvm/IR/GlobalVariable.h" 24#include "llvm/IR/Instructions.h" 25#include "llvm/Support/Debug.h" 26#include "llvm/Support/ErrorHandling.h" 27#include "llvm/Target/Mangler.h" 28#include "llvm/Target/TargetFrameLowering.h" 29#include "llvm/Target/TargetMachine.h" 30#include "llvm/Target/TargetRegisterInfo.h" 31 32using namespace llvm; 33 34/// CompileUnit - Compile unit constructor. 35CompileUnit::CompileUnit(unsigned UID, unsigned L, DIE *D, const MDNode *N, 36 AsmPrinter *A, DwarfDebug *DW, DwarfUnits *DWU) 37 : UniqueID(UID), Language(L), CUDie(D), Asm(A), DD(DW), DU(DWU), 38 IndexTyDie(0), DebugInfoOffset(0) { 39 DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1); 40 insertDIE(N, D); 41} 42 43/// ~CompileUnit - Destructor for compile unit. 44CompileUnit::~CompileUnit() { 45 for (unsigned j = 0, M = DIEBlocks.size(); j < M; ++j) 46 DIEBlocks[j]->~DIEBlock(); 47} 48 49/// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 50/// information entry. 51DIEEntry *CompileUnit::createDIEEntry(DIE *Entry) { 52 DIEEntry *Value = new (DIEValueAllocator) DIEEntry(Entry); 53 return Value; 54} 55 56/// getDefaultLowerBound - Return the default lower bound for an array. If the 57/// DWARF version doesn't handle the language, return -1. 58int64_t CompileUnit::getDefaultLowerBound() const { 59 switch (Language) { 60 default: 61 break; 62 63 case dwarf::DW_LANG_C89: 64 case dwarf::DW_LANG_C99: 65 case dwarf::DW_LANG_C: 66 case dwarf::DW_LANG_C_plus_plus: 67 case dwarf::DW_LANG_ObjC: 68 case dwarf::DW_LANG_ObjC_plus_plus: 69 return 0; 70 71 case dwarf::DW_LANG_Fortran77: 72 case dwarf::DW_LANG_Fortran90: 73 case dwarf::DW_LANG_Fortran95: 74 return 1; 75 76 // The languages below have valid values only if the DWARF version >= 4. 77 case dwarf::DW_LANG_Java: 78 case dwarf::DW_LANG_Python: 79 case dwarf::DW_LANG_UPC: 80 case dwarf::DW_LANG_D: 81 if (dwarf::DWARF_VERSION >= 4) 82 return 0; 83 break; 84 85 case dwarf::DW_LANG_Ada83: 86 case dwarf::DW_LANG_Ada95: 87 case dwarf::DW_LANG_Cobol74: 88 case dwarf::DW_LANG_Cobol85: 89 case dwarf::DW_LANG_Modula2: 90 case dwarf::DW_LANG_Pascal83: 91 case dwarf::DW_LANG_PLI: 92 if (dwarf::DWARF_VERSION >= 4) 93 return 1; 94 break; 95 } 96 97 return -1; 98} 99 100/// addFlag - Add a flag that is true. 101void CompileUnit::addFlag(DIE *Die, unsigned Attribute) { 102 if (!DD->useDarwinGDBCompat()) 103 Die->addValue(Attribute, dwarf::DW_FORM_flag_present, 104 DIEIntegerOne); 105 else 106 addUInt(Die, Attribute, dwarf::DW_FORM_flag, 1); 107} 108 109/// addUInt - Add an unsigned integer attribute data and value. 110/// 111void CompileUnit::addUInt(DIE *Die, unsigned Attribute, 112 unsigned Form, uint64_t Integer) { 113 if (!Form) Form = DIEInteger::BestForm(false, Integer); 114 DIEValue *Value = Integer == 1 ? 115 DIEIntegerOne : new (DIEValueAllocator) DIEInteger(Integer); 116 Die->addValue(Attribute, Form, Value); 117} 118 119/// addSInt - Add an signed integer attribute data and value. 120/// 121void CompileUnit::addSInt(DIE *Die, unsigned Attribute, 122 unsigned Form, int64_t Integer) { 123 if (!Form) Form = DIEInteger::BestForm(true, Integer); 124 DIEValue *Value = new (DIEValueAllocator) DIEInteger(Integer); 125 Die->addValue(Attribute, Form, Value); 126} 127 128/// addString - Add a string attribute data and value. We always emit a 129/// reference to the string pool instead of immediate strings so that DIEs have 130/// more predictable sizes. In the case of split dwarf we emit an index 131/// into another table which gets us the static offset into the string 132/// table. 133void CompileUnit::addString(DIE *Die, unsigned Attribute, StringRef String) { 134 if (!DD->useSplitDwarf()) { 135 MCSymbol *Symb = DU->getStringPoolEntry(String); 136 DIEValue *Value; 137 if (Asm->needsRelocationsForDwarfStringPool()) 138 Value = new (DIEValueAllocator) DIELabel(Symb); 139 else { 140 MCSymbol *StringPool = DU->getStringPoolSym(); 141 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 142 } 143 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value); 144 } else { 145 unsigned idx = DU->getStringPoolIndex(String); 146 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 147 Die->addValue(Attribute, dwarf::DW_FORM_GNU_str_index, Value); 148 } 149} 150 151/// addLocalString - Add a string attribute data and value. This is guaranteed 152/// to be in the local string pool instead of indirected. 153void CompileUnit::addLocalString(DIE *Die, unsigned Attribute, 154 StringRef String) { 155 MCSymbol *Symb = DU->getStringPoolEntry(String); 156 DIEValue *Value; 157 if (Asm->needsRelocationsForDwarfStringPool()) 158 Value = new (DIEValueAllocator) DIELabel(Symb); 159 else { 160 MCSymbol *StringPool = DU->getStringPoolSym(); 161 Value = new (DIEValueAllocator) DIEDelta(Symb, StringPool); 162 } 163 Die->addValue(Attribute, dwarf::DW_FORM_strp, Value); 164} 165 166/// addLabel - Add a Dwarf label attribute data and value. 167/// 168void CompileUnit::addLabel(DIE *Die, unsigned Attribute, unsigned Form, 169 const MCSymbol *Label) { 170 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 171 Die->addValue(Attribute, Form, Value); 172} 173 174/// addLabelAddress - Add a dwarf label attribute data and value using 175/// DW_FORM_addr or DW_FORM_GNU_addr_index. 176/// 177void CompileUnit::addLabelAddress(DIE *Die, unsigned Attribute, 178 MCSymbol *Label) { 179 if (!DD->useSplitDwarf()) { 180 if (Label != NULL) { 181 DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); 182 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); 183 } else { 184 DIEValue *Value = new (DIEValueAllocator) DIEInteger(0); 185 Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); 186 } 187 } else { 188 unsigned idx = DU->getAddrPoolIndex(Label); 189 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 190 Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value); 191 } 192} 193 194/// addOpAddress - Add a dwarf op address data and value using the 195/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. 196/// 197void CompileUnit::addOpAddress(DIE *Die, MCSymbol *Sym) { 198 199 if (!DD->useSplitDwarf()) { 200 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_addr); 201 addLabel(Die, 0, dwarf::DW_FORM_udata, Sym); 202 } else { 203 unsigned idx = DU->getAddrPoolIndex(Sym); 204 DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); 205 addUInt(Die, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_addr_index); 206 Die->addValue(0, dwarf::DW_FORM_GNU_addr_index, Value); 207 } 208} 209 210/// addDelta - Add a label delta attribute data and value. 211/// 212void CompileUnit::addDelta(DIE *Die, unsigned Attribute, unsigned Form, 213 const MCSymbol *Hi, const MCSymbol *Lo) { 214 DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo); 215 Die->addValue(Attribute, Form, Value); 216} 217 218/// addDIEEntry - Add a DIE attribute data and value. 219/// 220void CompileUnit::addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form, 221 DIE *Entry) { 222 Die->addValue(Attribute, Form, createDIEEntry(Entry)); 223} 224 225/// addBlock - Add block data. 226/// 227void CompileUnit::addBlock(DIE *Die, unsigned Attribute, unsigned Form, 228 DIEBlock *Block) { 229 Block->ComputeSize(Asm); 230 DIEBlocks.push_back(Block); // Memoize so we can call the destructor later on. 231 Die->addValue(Attribute, Block->BestForm(), Block); 232} 233 234/// addSourceLine - Add location information to specified debug information 235/// entry. 236void CompileUnit::addSourceLine(DIE *Die, DIVariable V) { 237 // Verify variable. 238 if (!V.Verify()) 239 return; 240 241 unsigned Line = V.getLineNumber(); 242 if (Line == 0) 243 return; 244 unsigned FileID = DD->getOrCreateSourceID(V.getContext().getFilename(), 245 V.getContext().getDirectory(), 246 getUniqueID()); 247 assert(FileID && "Invalid file id"); 248 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 249 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 250} 251 252/// addSourceLine - Add location information to specified debug information 253/// entry. 254void CompileUnit::addSourceLine(DIE *Die, DIGlobalVariable G) { 255 // Verify global variable. 256 if (!G.Verify()) 257 return; 258 259 unsigned Line = G.getLineNumber(); 260 if (Line == 0) 261 return; 262 unsigned FileID = DD->getOrCreateSourceID(G.getFilename(), G.getDirectory(), 263 getUniqueID()); 264 assert(FileID && "Invalid file id"); 265 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 266 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 267} 268 269/// addSourceLine - Add location information to specified debug information 270/// entry. 271void CompileUnit::addSourceLine(DIE *Die, DISubprogram SP) { 272 // Verify subprogram. 273 if (!SP.Verify()) 274 return; 275 276 // If the line number is 0, don't add it. 277 unsigned Line = SP.getLineNumber(); 278 if (Line == 0) 279 return; 280 281 unsigned FileID = DD->getOrCreateSourceID(SP.getFilename(), 282 SP.getDirectory(), getUniqueID()); 283 assert(FileID && "Invalid file id"); 284 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 285 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 286} 287 288/// addSourceLine - Add location information to specified debug information 289/// entry. 290void CompileUnit::addSourceLine(DIE *Die, DIType Ty) { 291 // Verify type. 292 if (!Ty.Verify()) 293 return; 294 295 unsigned Line = Ty.getLineNumber(); 296 if (Line == 0) 297 return; 298 unsigned FileID = DD->getOrCreateSourceID(Ty.getFilename(), 299 Ty.getDirectory(), getUniqueID()); 300 assert(FileID && "Invalid file id"); 301 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 302 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 303} 304 305/// addSourceLine - Add location information to specified debug information 306/// entry. 307void CompileUnit::addSourceLine(DIE *Die, DIObjCProperty Ty) { 308 // Verify type. 309 if (!Ty.Verify()) 310 return; 311 312 unsigned Line = Ty.getLineNumber(); 313 if (Line == 0) 314 return; 315 DIFile File = Ty.getFile(); 316 unsigned FileID = DD->getOrCreateSourceID(File.getFilename(), 317 File.getDirectory(), getUniqueID()); 318 assert(FileID && "Invalid file id"); 319 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 320 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 321} 322 323/// addSourceLine - Add location information to specified debug information 324/// entry. 325void CompileUnit::addSourceLine(DIE *Die, DINameSpace NS) { 326 // Verify namespace. 327 if (!NS.Verify()) 328 return; 329 330 unsigned Line = NS.getLineNumber(); 331 if (Line == 0) 332 return; 333 StringRef FN = NS.getFilename(); 334 335 unsigned FileID = DD->getOrCreateSourceID(FN, NS.getDirectory(), 336 getUniqueID()); 337 assert(FileID && "Invalid file id"); 338 addUInt(Die, dwarf::DW_AT_decl_file, 0, FileID); 339 addUInt(Die, dwarf::DW_AT_decl_line, 0, Line); 340} 341 342/// addVariableAddress - Add DW_AT_location attribute for a 343/// DbgVariable based on provided MachineLocation. 344void CompileUnit::addVariableAddress(const DbgVariable &DV, DIE *Die, 345 MachineLocation Location) { 346 if (DV.variableHasComplexAddress()) 347 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location); 348 else if (DV.isBlockByrefVariable()) 349 addBlockByrefAddress(DV, Die, dwarf::DW_AT_location, Location); 350 else 351 addAddress(Die, dwarf::DW_AT_location, Location, 352 DV.getVariable().isIndirect()); 353} 354 355/// addRegisterOp - Add register operand. 356void CompileUnit::addRegisterOp(DIE *TheDie, unsigned Reg) { 357 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 358 unsigned DWReg = RI->getDwarfRegNum(Reg, false); 359 if (DWReg < 32) 360 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_reg0 + DWReg); 361 else { 362 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_regx); 363 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg); 364 } 365} 366 367/// addRegisterOffset - Add register offset. 368void CompileUnit::addRegisterOffset(DIE *TheDie, unsigned Reg, 369 int64_t Offset) { 370 const TargetRegisterInfo *RI = Asm->TM.getRegisterInfo(); 371 unsigned DWReg = RI->getDwarfRegNum(Reg, false); 372 const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo(); 373 if (Reg == TRI->getFrameRegister(*Asm->MF)) 374 // If variable offset is based in frame register then use fbreg. 375 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_fbreg); 376 else if (DWReg < 32) 377 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + DWReg); 378 else { 379 addUInt(TheDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_bregx); 380 addUInt(TheDie, 0, dwarf::DW_FORM_udata, DWReg); 381 } 382 addSInt(TheDie, 0, dwarf::DW_FORM_sdata, Offset); 383} 384 385/// addAddress - Add an address attribute to a die based on the location 386/// provided. 387void CompileUnit::addAddress(DIE *Die, unsigned Attribute, 388 const MachineLocation &Location, bool Indirect) { 389 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 390 391 if (Location.isReg() && !Indirect) 392 addRegisterOp(Block, Location.getReg()); 393 else { 394 addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 395 if (Indirect && !Location.isReg()) { 396 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 397 } 398 } 399 400 // Now attach the location information to the DIE. 401 addBlock(Die, Attribute, 0, Block); 402} 403 404/// addComplexAddress - Start with the address based on the location provided, 405/// and generate the DWARF information necessary to find the actual variable 406/// given the extra address information encoded in the DIVariable, starting from 407/// the starting location. Add the DWARF information to the die. 408/// 409void CompileUnit::addComplexAddress(const DbgVariable &DV, DIE *Die, 410 unsigned Attribute, 411 const MachineLocation &Location) { 412 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 413 unsigned N = DV.getNumAddrElements(); 414 unsigned i = 0; 415 if (Location.isReg()) { 416 if (N >= 2 && DV.getAddrElement(0) == DIBuilder::OpPlus) { 417 // If first address element is OpPlus then emit 418 // DW_OP_breg + Offset instead of DW_OP_reg + Offset. 419 addRegisterOffset(Block, Location.getReg(), DV.getAddrElement(1)); 420 i = 2; 421 } else 422 addRegisterOp(Block, Location.getReg()); 423 } 424 else 425 addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 426 427 for (;i < N; ++i) { 428 uint64_t Element = DV.getAddrElement(i); 429 if (Element == DIBuilder::OpPlus) { 430 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 431 addUInt(Block, 0, dwarf::DW_FORM_udata, DV.getAddrElement(++i)); 432 } else if (Element == DIBuilder::OpDeref) { 433 if (!Location.isReg()) 434 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 435 } else llvm_unreachable("unknown DIBuilder Opcode"); 436 } 437 438 // Now attach the location information to the DIE. 439 addBlock(Die, Attribute, 0, Block); 440} 441 442/* Byref variables, in Blocks, are declared by the programmer as "SomeType 443 VarName;", but the compiler creates a __Block_byref_x_VarName struct, and 444 gives the variable VarName either the struct, or a pointer to the struct, as 445 its type. This is necessary for various behind-the-scenes things the 446 compiler needs to do with by-reference variables in Blocks. 447 448 However, as far as the original *programmer* is concerned, the variable 449 should still have type 'SomeType', as originally declared. 450 451 The function getBlockByrefType dives into the __Block_byref_x_VarName 452 struct to find the original type of the variable, which is then assigned to 453 the variable's Debug Information Entry as its real type. So far, so good. 454 However now the debugger will expect the variable VarName to have the type 455 SomeType. So we need the location attribute for the variable to be an 456 expression that explains to the debugger how to navigate through the 457 pointers and struct to find the actual variable of type SomeType. 458 459 The following function does just that. We start by getting 460 the "normal" location for the variable. This will be the location 461 of either the struct __Block_byref_x_VarName or the pointer to the 462 struct __Block_byref_x_VarName. 463 464 The struct will look something like: 465 466 struct __Block_byref_x_VarName { 467 ... <various fields> 468 struct __Block_byref_x_VarName *forwarding; 469 ... <various other fields> 470 SomeType VarName; 471 ... <maybe more fields> 472 }; 473 474 If we are given the struct directly (as our starting point) we 475 need to tell the debugger to: 476 477 1). Add the offset of the forwarding field. 478 479 2). Follow that pointer to get the real __Block_byref_x_VarName 480 struct to use (the real one may have been copied onto the heap). 481 482 3). Add the offset for the field VarName, to find the actual variable. 483 484 If we started with a pointer to the struct, then we need to 485 dereference that pointer first, before the other steps. 486 Translating this into DWARF ops, we will need to append the following 487 to the current location description for the variable: 488 489 DW_OP_deref -- optional, if we start with a pointer 490 DW_OP_plus_uconst <forward_fld_offset> 491 DW_OP_deref 492 DW_OP_plus_uconst <varName_fld_offset> 493 494 That is what this function does. */ 495 496/// addBlockByrefAddress - Start with the address based on the location 497/// provided, and generate the DWARF information necessary to find the 498/// actual Block variable (navigating the Block struct) based on the 499/// starting location. Add the DWARF information to the die. For 500/// more information, read large comment just above here. 501/// 502void CompileUnit::addBlockByrefAddress(const DbgVariable &DV, DIE *Die, 503 unsigned Attribute, 504 const MachineLocation &Location) { 505 DIType Ty = DV.getType(); 506 DIType TmpTy = Ty; 507 unsigned Tag = Ty.getTag(); 508 bool isPointer = false; 509 510 StringRef varName = DV.getName(); 511 512 if (Tag == dwarf::DW_TAG_pointer_type) { 513 DIDerivedType DTy = DIDerivedType(Ty); 514 TmpTy = DTy.getTypeDerivedFrom(); 515 isPointer = true; 516 } 517 518 DICompositeType blockStruct = DICompositeType(TmpTy); 519 520 // Find the __forwarding field and the variable field in the __Block_byref 521 // struct. 522 DIArray Fields = blockStruct.getTypeArray(); 523 DIDescriptor varField = DIDescriptor(); 524 DIDescriptor forwardingField = DIDescriptor(); 525 526 for (unsigned i = 0, N = Fields.getNumElements(); i < N; ++i) { 527 DIDescriptor Element = Fields.getElement(i); 528 DIDerivedType DT = DIDerivedType(Element); 529 StringRef fieldName = DT.getName(); 530 if (fieldName == "__forwarding") 531 forwardingField = Element; 532 else if (fieldName == varName) 533 varField = Element; 534 } 535 536 // Get the offsets for the forwarding field and the variable field. 537 unsigned forwardingFieldOffset = 538 DIDerivedType(forwardingField).getOffsetInBits() >> 3; 539 unsigned varFieldOffset = 540 DIDerivedType(varField).getOffsetInBits() >> 3; 541 542 // Decode the original location, and use that as the start of the byref 543 // variable's location. 544 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 545 546 if (Location.isReg()) 547 addRegisterOp(Block, Location.getReg()); 548 else 549 addRegisterOffset(Block, Location.getReg(), Location.getOffset()); 550 551 // If we started with a pointer to the __Block_byref... struct, then 552 // the first thing we need to do is dereference the pointer (DW_OP_deref). 553 if (isPointer) 554 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 555 556 // Next add the offset for the '__forwarding' field: 557 // DW_OP_plus_uconst ForwardingFieldOffset. Note there's no point in 558 // adding the offset if it's 0. 559 if (forwardingFieldOffset > 0) { 560 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 561 addUInt(Block, 0, dwarf::DW_FORM_udata, forwardingFieldOffset); 562 } 563 564 // Now dereference the __forwarding field to get to the real __Block_byref 565 // struct: DW_OP_deref. 566 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 567 568 // Now that we've got the real __Block_byref... struct, add the offset 569 // for the variable's field to get to the location of the actual variable: 570 // DW_OP_plus_uconst varFieldOffset. Again, don't add if it's 0. 571 if (varFieldOffset > 0) { 572 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 573 addUInt(Block, 0, dwarf::DW_FORM_udata, varFieldOffset); 574 } 575 576 // Now attach the location information to the DIE. 577 addBlock(Die, Attribute, 0, Block); 578} 579 580/// isTypeSigned - Return true if the type is signed. 581static bool isTypeSigned(DIType Ty, int *SizeInBits) { 582 if (Ty.isDerivedType()) 583 return isTypeSigned(DIDerivedType(Ty).getTypeDerivedFrom(), SizeInBits); 584 if (Ty.isBasicType()) 585 if (DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed 586 || DIBasicType(Ty).getEncoding() == dwarf::DW_ATE_signed_char) { 587 *SizeInBits = Ty.getSizeInBits(); 588 return true; 589 } 590 return false; 591} 592 593/// addConstantValue - Add constant value entry in variable DIE. 594bool CompileUnit::addConstantValue(DIE *Die, const MachineOperand &MO, 595 DIType Ty) { 596 // FIXME: This is a bit conservative/simple - it emits negative values at 597 // their maximum bit width which is a bit unfortunate (& doesn't prefer 598 // udata/sdata over dataN as suggested by the DWARF spec) 599 assert(MO.isImm() && "Invalid machine operand!"); 600 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 601 int SizeInBits = -1; 602 bool SignedConstant = isTypeSigned(Ty, &SizeInBits); 603 unsigned Form = SignedConstant ? dwarf::DW_FORM_sdata : dwarf::DW_FORM_udata; 604 switch (SizeInBits) { 605 case 8: Form = dwarf::DW_FORM_data1; break; 606 case 16: Form = dwarf::DW_FORM_data2; break; 607 case 32: Form = dwarf::DW_FORM_data4; break; 608 case 64: Form = dwarf::DW_FORM_data8; break; 609 default: break; 610 } 611 SignedConstant ? addSInt(Block, 0, Form, MO.getImm()) 612 : addUInt(Block, 0, Form, MO.getImm()); 613 614 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 615 return true; 616} 617 618/// addConstantFPValue - Add constant value entry in variable DIE. 619bool CompileUnit::addConstantFPValue(DIE *Die, const MachineOperand &MO) { 620 assert (MO.isFPImm() && "Invalid machine operand!"); 621 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 622 APFloat FPImm = MO.getFPImm()->getValueAPF(); 623 624 // Get the raw data form of the floating point. 625 const APInt FltVal = FPImm.bitcastToAPInt(); 626 const char *FltPtr = (const char*)FltVal.getRawData(); 627 628 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 629 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 630 int Incr = (LittleEndian ? 1 : -1); 631 int Start = (LittleEndian ? 0 : NumBytes - 1); 632 int Stop = (LittleEndian ? NumBytes : -1); 633 634 // Output the constant to DWARF one byte at a time. 635 for (; Start != Stop; Start += Incr) 636 addUInt(Block, 0, dwarf::DW_FORM_data1, 637 (unsigned char)0xFF & FltPtr[Start]); 638 639 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 640 return true; 641} 642 643/// addConstantFPValue - Add constant value entry in variable DIE. 644bool CompileUnit::addConstantFPValue(DIE *Die, const ConstantFP *CFP) { 645 return addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), false); 646} 647 648/// addConstantValue - Add constant value entry in variable DIE. 649bool CompileUnit::addConstantValue(DIE *Die, const ConstantInt *CI, 650 bool Unsigned) { 651 return addConstantValue(Die, CI->getValue(), Unsigned); 652} 653 654// addConstantValue - Add constant value entry in variable DIE. 655bool CompileUnit::addConstantValue(DIE *Die, const APInt &Val, 656 bool Unsigned) { 657 unsigned CIBitWidth = Val.getBitWidth(); 658 if (CIBitWidth <= 64) { 659 unsigned form = 0; 660 switch (CIBitWidth) { 661 case 8: form = dwarf::DW_FORM_data1; break; 662 case 16: form = dwarf::DW_FORM_data2; break; 663 case 32: form = dwarf::DW_FORM_data4; break; 664 case 64: form = dwarf::DW_FORM_data8; break; 665 default: 666 form = Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata; 667 } 668 if (Unsigned) 669 addUInt(Die, dwarf::DW_AT_const_value, form, Val.getZExtValue()); 670 else 671 addSInt(Die, dwarf::DW_AT_const_value, form, Val.getSExtValue()); 672 return true; 673 } 674 675 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 676 677 // Get the raw data form of the large APInt. 678 const uint64_t *Ptr64 = Val.getRawData(); 679 680 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 681 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 682 683 // Output the constant to DWARF one byte at a time. 684 for (int i = 0; i < NumBytes; i++) { 685 uint8_t c; 686 if (LittleEndian) 687 c = Ptr64[i / 8] >> (8 * (i & 7)); 688 else 689 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 690 addUInt(Block, 0, dwarf::DW_FORM_data1, c); 691 } 692 693 addBlock(Die, dwarf::DW_AT_const_value, 0, Block); 694 return true; 695} 696 697/// addTemplateParams - Add template parameters into buffer. 698void CompileUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { 699 // Add template parameters. 700 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) { 701 DIDescriptor Element = TParams.getElement(i); 702 if (Element.isTemplateTypeParameter()) 703 Buffer.addChild(getOrCreateTemplateTypeParameterDIE( 704 DITemplateTypeParameter(Element))); 705 else if (Element.isTemplateValueParameter()) 706 Buffer.addChild(getOrCreateTemplateValueParameterDIE( 707 DITemplateValueParameter(Element))); 708 } 709} 710 711/// getOrCreateContextDIE - Get context owner's DIE. 712DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) { 713 if (Context.isType()) 714 return getOrCreateTypeDIE(DIType(Context)); 715 else if (Context.isNameSpace()) 716 return getOrCreateNameSpace(DINameSpace(Context)); 717 else if (Context.isSubprogram()) 718 return getOrCreateSubprogramDIE(DISubprogram(Context)); 719 else 720 return getDIE(Context); 721} 722 723/// addToContextOwner - Add Die into the list of its context owner's children. 724void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) { 725 if (DIE *ContextDIE = getOrCreateContextDIE(Context)) 726 ContextDIE->addChild(Die); 727 else 728 addDie(Die); 729} 730 731/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 732/// given DIType. 733DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 734 DIType Ty(TyNode); 735 if (!Ty.Verify()) 736 return NULL; 737 DIE *TyDIE = getDIE(Ty); 738 if (TyDIE) 739 return TyDIE; 740 741 // Create new type. 742 TyDIE = new DIE(dwarf::DW_TAG_base_type); 743 insertDIE(Ty, TyDIE); 744 if (Ty.isBasicType()) 745 constructTypeDIE(*TyDIE, DIBasicType(Ty)); 746 else if (Ty.isCompositeType()) 747 constructTypeDIE(*TyDIE, DICompositeType(Ty)); 748 else { 749 assert(Ty.isDerivedType() && "Unknown kind of DIType"); 750 constructTypeDIE(*TyDIE, DIDerivedType(Ty)); 751 } 752 // If this is a named finished type then include it in the list of types 753 // for the accelerator tables. 754 if (!Ty.getName().empty() && !Ty.isForwardDecl()) { 755 bool IsImplementation = 0; 756 if (Ty.isCompositeType()) { 757 DICompositeType CT(Ty); 758 // A runtime language of 0 actually means C/C++ and that any 759 // non-negative value is some version of Objective-C/C++. 760 IsImplementation = (CT.getRunTimeLang() == 0) || 761 CT.isObjcClassComplete(); 762 } 763 unsigned Flags = IsImplementation ? 764 DwarfAccelTable::eTypeFlagClassIsImplementation : 0; 765 addAccelType(Ty.getName(), std::make_pair(TyDIE, Flags)); 766 } 767 768 addToContextOwner(TyDIE, Ty.getContext()); 769 return TyDIE; 770} 771 772/// addType - Add a new type attribute to the specified entity. 773void CompileUnit::addType(DIE *Entity, DIType Ty, unsigned Attribute) { 774 if (!Ty.Verify()) 775 return; 776 777 // Check for pre-existence. 778 DIEEntry *Entry = getDIEEntry(Ty); 779 // If it exists then use the existing value. 780 if (Entry) { 781 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 782 return; 783 } 784 785 // Construct type. 786 DIE *Buffer = getOrCreateTypeDIE(Ty); 787 788 // Set up proxy. 789 Entry = createDIEEntry(Buffer); 790 insertDIEEntry(Ty, Entry); 791 Entity->addValue(Attribute, dwarf::DW_FORM_ref4, Entry); 792 793 // If this is a complete composite type then include it in the 794 // list of global types. 795 addGlobalType(Ty); 796} 797 798/// addGlobalType - Add a new global type to the compile unit. 799/// 800void CompileUnit::addGlobalType(DIType Ty) { 801 DIDescriptor Context = Ty.getContext(); 802 if (Ty.isCompositeType() && !Ty.getName().empty() && !Ty.isForwardDecl() 803 && (!Context || Context.isCompileUnit() || Context.isFile() 804 || Context.isNameSpace())) 805 if (DIEEntry *Entry = getDIEEntry(Ty)) 806 GlobalTypes[Ty.getName()] = Entry->getEntry(); 807} 808 809/// addPubTypes - Add type for pubtypes section. 810void CompileUnit::addPubTypes(DISubprogram SP) { 811 DICompositeType SPTy = SP.getType(); 812 unsigned SPTag = SPTy.getTag(); 813 if (SPTag != dwarf::DW_TAG_subroutine_type) 814 return; 815 816 DIArray Args = SPTy.getTypeArray(); 817 for (unsigned i = 0, e = Args.getNumElements(); i != e; ++i) { 818 DIType ATy(Args.getElement(i)); 819 if (!ATy.Verify()) 820 continue; 821 addGlobalType(ATy); 822 } 823} 824 825/// constructTypeDIE - Construct basic type die from DIBasicType. 826void CompileUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 827 // Get core information. 828 StringRef Name = BTy.getName(); 829 // Add name if not anonymous or intermediate type. 830 if (!Name.empty()) 831 addString(&Buffer, dwarf::DW_AT_name, Name); 832 833 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) { 834 Buffer.setTag(dwarf::DW_TAG_unspecified_type); 835 // Unspecified types has only name, nothing else. 836 return; 837 } 838 839 Buffer.setTag(dwarf::DW_TAG_base_type); 840 addUInt(&Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 841 BTy.getEncoding()); 842 843 uint64_t Size = BTy.getSizeInBits() >> 3; 844 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 845} 846 847/// constructTypeDIE - Construct derived type die from DIDerivedType. 848void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 849 // Get core information. 850 StringRef Name = DTy.getName(); 851 uint64_t Size = DTy.getSizeInBits() >> 3; 852 unsigned Tag = DTy.getTag(); 853 854 // FIXME - Workaround for templates. 855 if (Tag == dwarf::DW_TAG_inheritance) Tag = dwarf::DW_TAG_reference_type; 856 857 Buffer.setTag(Tag); 858 859 // Map to main type, void will not have a type. 860 DIType FromTy = DTy.getTypeDerivedFrom(); 861 addType(&Buffer, FromTy); 862 863 // Add name if not anonymous or intermediate type. 864 if (!Name.empty()) 865 addString(&Buffer, dwarf::DW_AT_name, Name); 866 867 // Add size if non-zero (derived types might be zero-sized.) 868 if (Size && Tag != dwarf::DW_TAG_pointer_type) 869 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 870 871 if (Tag == dwarf::DW_TAG_ptr_to_member_type) 872 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 873 getOrCreateTypeDIE(DTy.getClassType())); 874 // Add source line info if available and TyDesc is not a forward declaration. 875 if (!DTy.isForwardDecl()) 876 addSourceLine(&Buffer, DTy); 877} 878 879/// constructTypeDIE - Construct type DIE from DICompositeType. 880void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 881 // Get core information. 882 StringRef Name = CTy.getName(); 883 884 uint64_t Size = CTy.getSizeInBits() >> 3; 885 unsigned Tag = CTy.getTag(); 886 Buffer.setTag(Tag); 887 888 switch (Tag) { 889 case dwarf::DW_TAG_array_type: 890 constructArrayTypeDIE(Buffer, &CTy); 891 break; 892 case dwarf::DW_TAG_enumeration_type: { 893 DIArray Elements = CTy.getTypeArray(); 894 895 // Add enumerators to enumeration type. 896 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 897 DIE *ElemDie = NULL; 898 DIDescriptor Enum(Elements.getElement(i)); 899 if (Enum.isEnumerator()) { 900 ElemDie = constructEnumTypeDIE(DIEnumerator(Enum)); 901 Buffer.addChild(ElemDie); 902 } 903 } 904 DIType DTy = CTy.getTypeDerivedFrom(); 905 if (DTy.Verify()) { 906 addType(&Buffer, DTy); 907 addUInt(&Buffer, dwarf::DW_AT_enum_class, dwarf::DW_FORM_flag, 1); 908 } 909 } 910 break; 911 case dwarf::DW_TAG_subroutine_type: { 912 // Add return type. 913 DIArray Elements = CTy.getTypeArray(); 914 DIDescriptor RTy = Elements.getElement(0); 915 addType(&Buffer, DIType(RTy)); 916 917 bool isPrototyped = true; 918 // Add arguments. 919 for (unsigned i = 1, N = Elements.getNumElements(); i < N; ++i) { 920 DIDescriptor Ty = Elements.getElement(i); 921 if (Ty.isUnspecifiedParameter()) { 922 DIE *Arg = new DIE(dwarf::DW_TAG_unspecified_parameters); 923 Buffer.addChild(Arg); 924 isPrototyped = false; 925 } else { 926 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 927 addType(Arg, DIType(Ty)); 928 if (DIType(Ty).isArtificial()) 929 addFlag(Arg, dwarf::DW_AT_artificial); 930 Buffer.addChild(Arg); 931 } 932 } 933 // Add prototype flag if we're dealing with a C language and the 934 // function has been prototyped. 935 if (isPrototyped && 936 (Language == dwarf::DW_LANG_C89 || 937 Language == dwarf::DW_LANG_C99 || 938 Language == dwarf::DW_LANG_ObjC)) 939 addFlag(&Buffer, dwarf::DW_AT_prototyped); 940 } 941 break; 942 case dwarf::DW_TAG_structure_type: 943 case dwarf::DW_TAG_union_type: 944 case dwarf::DW_TAG_class_type: { 945 // Add elements to structure type. 946 DIArray Elements = CTy.getTypeArray(); 947 948 // A forward struct declared type may not have elements available. 949 unsigned N = Elements.getNumElements(); 950 if (N == 0) 951 break; 952 953 // Add elements to structure type. 954 for (unsigned i = 0; i < N; ++i) { 955 DIDescriptor Element = Elements.getElement(i); 956 DIE *ElemDie = NULL; 957 if (Element.isSubprogram()) { 958 DISubprogram SP(Element); 959 ElemDie = getOrCreateSubprogramDIE(DISubprogram(Element)); 960 if (SP.isProtected()) 961 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 962 dwarf::DW_ACCESS_protected); 963 else if (SP.isPrivate()) 964 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 965 dwarf::DW_ACCESS_private); 966 else 967 addUInt(ElemDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 968 dwarf::DW_ACCESS_public); 969 if (SP.isExplicit()) 970 addFlag(ElemDie, dwarf::DW_AT_explicit); 971 } else if (Element.isDerivedType()) { 972 DIDerivedType DDTy(Element); 973 if (DDTy.getTag() == dwarf::DW_TAG_friend) { 974 ElemDie = new DIE(dwarf::DW_TAG_friend); 975 addType(ElemDie, DDTy.getTypeDerivedFrom(), dwarf::DW_AT_friend); 976 } else if (DDTy.isStaticMember()) 977 ElemDie = createStaticMemberDIE(DDTy); 978 else 979 ElemDie = createMemberDIE(DDTy); 980 } else if (Element.isObjCProperty()) { 981 DIObjCProperty Property(Element); 982 ElemDie = new DIE(Property.getTag()); 983 StringRef PropertyName = Property.getObjCPropertyName(); 984 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 985 addType(ElemDie, Property.getType()); 986 addSourceLine(ElemDie, Property); 987 StringRef GetterName = Property.getObjCPropertyGetterName(); 988 if (!GetterName.empty()) 989 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 990 StringRef SetterName = Property.getObjCPropertySetterName(); 991 if (!SetterName.empty()) 992 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 993 unsigned PropertyAttributes = 0; 994 if (Property.isReadOnlyObjCProperty()) 995 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 996 if (Property.isReadWriteObjCProperty()) 997 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 998 if (Property.isAssignObjCProperty()) 999 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 1000 if (Property.isRetainObjCProperty()) 1001 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 1002 if (Property.isCopyObjCProperty()) 1003 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 1004 if (Property.isNonAtomicObjCProperty()) 1005 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 1006 if (PropertyAttributes) 1007 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, 0, 1008 PropertyAttributes); 1009 1010 DIEEntry *Entry = getDIEEntry(Element); 1011 if (!Entry) { 1012 Entry = createDIEEntry(ElemDie); 1013 insertDIEEntry(Element, Entry); 1014 } 1015 } else 1016 continue; 1017 Buffer.addChild(ElemDie); 1018 } 1019 1020 if (CTy.isAppleBlockExtension()) 1021 addFlag(&Buffer, dwarf::DW_AT_APPLE_block); 1022 1023 DICompositeType ContainingType = CTy.getContainingType(); 1024 if (DIDescriptor(ContainingType).isCompositeType()) 1025 addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, 1026 getOrCreateTypeDIE(DIType(ContainingType))); 1027 else { 1028 DIDescriptor Context = CTy.getContext(); 1029 addToContextOwner(&Buffer, Context); 1030 } 1031 1032 if (CTy.isObjcClassComplete()) 1033 addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type); 1034 1035 // Add template parameters to a class, structure or union types. 1036 // FIXME: The support isn't in the metadata for this yet. 1037 if (Tag == dwarf::DW_TAG_class_type || 1038 Tag == dwarf::DW_TAG_structure_type || 1039 Tag == dwarf::DW_TAG_union_type) 1040 addTemplateParams(Buffer, CTy.getTemplateParams()); 1041 1042 break; 1043 } 1044 default: 1045 break; 1046 } 1047 1048 // Add name if not anonymous or intermediate type. 1049 if (!Name.empty()) 1050 addString(&Buffer, dwarf::DW_AT_name, Name); 1051 1052 if (Tag == dwarf::DW_TAG_enumeration_type || 1053 Tag == dwarf::DW_TAG_class_type || 1054 Tag == dwarf::DW_TAG_structure_type || 1055 Tag == dwarf::DW_TAG_union_type) { 1056 // Add size if non-zero (derived types might be zero-sized.) 1057 // TODO: Do we care about size for enum forward declarations? 1058 if (Size) 1059 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, Size); 1060 else if (!CTy.isForwardDecl()) 1061 // Add zero size if it is not a forward declaration. 1062 addUInt(&Buffer, dwarf::DW_AT_byte_size, 0, 0); 1063 1064 // If we're a forward decl, say so. 1065 if (CTy.isForwardDecl()) 1066 addFlag(&Buffer, dwarf::DW_AT_declaration); 1067 1068 // Add source line info if available. 1069 if (!CTy.isForwardDecl()) 1070 addSourceLine(&Buffer, CTy); 1071 1072 // No harm in adding the runtime language to the declaration. 1073 unsigned RLang = CTy.getRunTimeLang(); 1074 if (RLang) 1075 addUInt(&Buffer, dwarf::DW_AT_APPLE_runtime_class, 1076 dwarf::DW_FORM_data1, RLang); 1077 } 1078} 1079 1080/// getOrCreateTemplateTypeParameterDIE - Find existing DIE or create new DIE 1081/// for the given DITemplateTypeParameter. 1082DIE * 1083CompileUnit::getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP) { 1084 DIE *ParamDIE = getDIE(TP); 1085 if (ParamDIE) 1086 return ParamDIE; 1087 1088 ParamDIE = new DIE(dwarf::DW_TAG_template_type_parameter); 1089 addType(ParamDIE, TP.getType()); 1090 if (!TP.getName().empty()) 1091 addString(ParamDIE, dwarf::DW_AT_name, TP.getName()); 1092 return ParamDIE; 1093} 1094 1095/// getOrCreateTemplateValueParameterDIE - Find existing DIE or create new DIE 1096/// for the given DITemplateValueParameter. 1097DIE * 1098CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TPV){ 1099 DIE *ParamDIE = getDIE(TPV); 1100 if (ParamDIE) 1101 return ParamDIE; 1102 1103 ParamDIE = new DIE(TPV.getTag()); 1104 addType(ParamDIE, TPV.getType()); 1105 if (!TPV.getName().empty()) 1106 addString(ParamDIE, dwarf::DW_AT_name, TPV.getName()); 1107 if (Value *Val = TPV.getValue()) { 1108 if (ConstantInt *CI = dyn_cast<ConstantInt>(Val)) 1109 addConstantValue(ParamDIE, CI, TPV.getType().isUnsignedDIType()); 1110 else if (GlobalValue *GV = dyn_cast<GlobalValue>(Val)) { 1111 // For declaration non-type template parameters (such as global values and 1112 // functions) 1113 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1114 addOpAddress(Block, Asm->Mang->getSymbol(GV)); 1115 // Emit DW_OP_stack_value to use the address as the immediate value of the 1116 // parameter, rather than a pointer to it. 1117 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value); 1118 addBlock(ParamDIE, dwarf::DW_AT_location, 0, Block); 1119 } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_template_param) { 1120 assert(isa<MDString>(Val)); 1121 addString(ParamDIE, dwarf::DW_AT_GNU_template_name, 1122 cast<MDString>(Val)->getString()); 1123 } else if (TPV.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) { 1124 assert(isa<MDNode>(Val)); 1125 DIArray A(cast<MDNode>(Val)); 1126 addTemplateParams(*ParamDIE, A); 1127 } 1128 } 1129 1130 return ParamDIE; 1131} 1132 1133/// getOrCreateNameSpace - Create a DIE for DINameSpace. 1134DIE *CompileUnit::getOrCreateNameSpace(DINameSpace NS) { 1135 DIE *NDie = getDIE(NS); 1136 if (NDie) 1137 return NDie; 1138 NDie = new DIE(dwarf::DW_TAG_namespace); 1139 insertDIE(NS, NDie); 1140 if (!NS.getName().empty()) { 1141 addString(NDie, dwarf::DW_AT_name, NS.getName()); 1142 addAccelNamespace(NS.getName(), NDie); 1143 } else 1144 addAccelNamespace("(anonymous namespace)", NDie); 1145 addSourceLine(NDie, NS); 1146 addToContextOwner(NDie, NS.getContext()); 1147 return NDie; 1148} 1149 1150/// getOrCreateSubprogramDIE - Create new DIE using SP. 1151DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { 1152 DIE *SPDie = getDIE(SP); 1153 if (SPDie) 1154 return SPDie; 1155 1156 SPDie = new DIE(dwarf::DW_TAG_subprogram); 1157 1158 // DW_TAG_inlined_subroutine may refer to this DIE. 1159 insertDIE(SP, SPDie); 1160 1161 DISubprogram SPDecl = SP.getFunctionDeclaration(); 1162 DIE *DeclDie = NULL; 1163 if (SPDecl.isSubprogram()) { 1164 DeclDie = getOrCreateSubprogramDIE(SPDecl); 1165 } 1166 1167 // Add to context owner. 1168 addToContextOwner(SPDie, SP.getContext()); 1169 1170 // Add function template parameters. 1171 addTemplateParams(*SPDie, SP.getTemplateParams()); 1172 1173 // Unfortunately this code needs to stay here instead of below the 1174 // AT_specification code in order to work around a bug in older 1175 // gdbs that requires the linkage name to resolve multiple template 1176 // functions. 1177 // TODO: Remove this set of code when we get rid of the old gdb 1178 // compatibility. 1179 StringRef LinkageName = SP.getLinkageName(); 1180 if (!LinkageName.empty() && DD->useDarwinGDBCompat()) 1181 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 1182 GlobalValue::getRealLinkageName(LinkageName)); 1183 1184 // If this DIE is going to refer declaration info using AT_specification 1185 // then there is no need to add other attributes. 1186 if (DeclDie) { 1187 // Refer function declaration directly. 1188 addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4, 1189 DeclDie); 1190 1191 return SPDie; 1192 } 1193 1194 // Add the linkage name if we have one. 1195 if (!LinkageName.empty() && !DD->useDarwinGDBCompat()) 1196 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 1197 GlobalValue::getRealLinkageName(LinkageName)); 1198 1199 // Constructors and operators for anonymous aggregates do not have names. 1200 if (!SP.getName().empty()) 1201 addString(SPDie, dwarf::DW_AT_name, SP.getName()); 1202 1203 addSourceLine(SPDie, SP); 1204 1205 // Add the prototype if we have a prototype and we have a C like 1206 // language. 1207 if (SP.isPrototyped() && 1208 (Language == dwarf::DW_LANG_C89 || 1209 Language == dwarf::DW_LANG_C99 || 1210 Language == dwarf::DW_LANG_ObjC)) 1211 addFlag(SPDie, dwarf::DW_AT_prototyped); 1212 1213 // Add Return Type. 1214 DICompositeType SPTy = SP.getType(); 1215 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type && 1216 "the type of a subprogram should be a subroutine"); 1217 1218 DIArray Args = SPTy.getTypeArray(); 1219 addType(SPDie, DIType(Args.getElement(0))); 1220 1221 unsigned VK = SP.getVirtuality(); 1222 if (VK) { 1223 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 1224 DIEBlock *Block = getDIEBlock(); 1225 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1226 addUInt(Block, 0, dwarf::DW_FORM_udata, SP.getVirtualIndex()); 1227 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, 0, Block); 1228 ContainingTypeMap.insert(std::make_pair(SPDie, 1229 SP.getContainingType())); 1230 } 1231 1232 if (!SP.isDefinition()) { 1233 addFlag(SPDie, dwarf::DW_AT_declaration); 1234 1235 // Add arguments. Do not add arguments for subprogram definition. They will 1236 // be handled while processing variables. 1237 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1238 DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter); 1239 DIType ATy = DIType(Args.getElement(i)); 1240 addType(Arg, ATy); 1241 if (ATy.isArtificial()) 1242 addFlag(Arg, dwarf::DW_AT_artificial); 1243 SPDie->addChild(Arg); 1244 } 1245 } 1246 1247 if (SP.isArtificial()) 1248 addFlag(SPDie, dwarf::DW_AT_artificial); 1249 1250 if (!SP.isLocalToUnit()) 1251 addFlag(SPDie, dwarf::DW_AT_external); 1252 1253 if (SP.isOptimized()) 1254 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized); 1255 1256 if (unsigned isa = Asm->getISAEncoding()) { 1257 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1258 } 1259 1260 return SPDie; 1261} 1262 1263// Return const expression if value is a GEP to access merged global 1264// constant. e.g. 1265// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0) 1266static const ConstantExpr *getMergedGlobalExpr(const Value *V) { 1267 const ConstantExpr *CE = dyn_cast_or_null<ConstantExpr>(V); 1268 if (!CE || CE->getNumOperands() != 3 || 1269 CE->getOpcode() != Instruction::GetElementPtr) 1270 return NULL; 1271 1272 // First operand points to a global struct. 1273 Value *Ptr = CE->getOperand(0); 1274 if (!isa<GlobalValue>(Ptr) || 1275 !isa<StructType>(cast<PointerType>(Ptr->getType())->getElementType())) 1276 return NULL; 1277 1278 // Second operand is zero. 1279 const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(CE->getOperand(1)); 1280 if (!CI || !CI->isZero()) 1281 return NULL; 1282 1283 // Third operand is offset. 1284 if (!isa<ConstantInt>(CE->getOperand(2))) 1285 return NULL; 1286 1287 return CE; 1288} 1289 1290/// createGlobalVariableDIE - create global variable DIE. 1291void CompileUnit::createGlobalVariableDIE(const MDNode *N) { 1292 // Check for pre-existence. 1293 if (getDIE(N)) 1294 return; 1295 1296 DIGlobalVariable GV(N); 1297 if (!GV.Verify()) 1298 return; 1299 1300 DIDescriptor GVContext = GV.getContext(); 1301 DIType GTy = GV.getType(); 1302 1303 // If this is a static data member definition, some attributes belong 1304 // to the declaration DIE. 1305 DIE *VariableDIE = NULL; 1306 bool IsStaticMember = false; 1307 DIDerivedType SDMDecl = GV.getStaticDataMemberDeclaration(); 1308 if (SDMDecl.Verify()) { 1309 assert(SDMDecl.isStaticMember() && "Expected static member decl"); 1310 // We need the declaration DIE that is in the static member's class. 1311 // But that class might not exist in the DWARF yet. 1312 // Creating the class will create the static member decl DIE. 1313 getOrCreateContextDIE(SDMDecl.getContext()); 1314 VariableDIE = getDIE(SDMDecl); 1315 assert(VariableDIE && "Static member decl has no context?"); 1316 IsStaticMember = true; 1317 } 1318 1319 // If this is not a static data member definition, create the variable 1320 // DIE and add the initial set of attributes to it. 1321 if (!VariableDIE) { 1322 VariableDIE = new DIE(GV.getTag()); 1323 // Add to map. 1324 insertDIE(N, VariableDIE); 1325 1326 // Add name and type. 1327 addString(VariableDIE, dwarf::DW_AT_name, GV.getDisplayName()); 1328 addType(VariableDIE, GTy); 1329 1330 // Add scoping info. 1331 if (!GV.isLocalToUnit()) { 1332 addFlag(VariableDIE, dwarf::DW_AT_external); 1333 addGlobalName(GV.getName(), VariableDIE); 1334 } 1335 1336 // Add line number info. 1337 addSourceLine(VariableDIE, GV); 1338 // Add to context owner. 1339 addToContextOwner(VariableDIE, GVContext); 1340 } 1341 1342 // Add location. 1343 bool addToAccelTable = false; 1344 DIE *VariableSpecDIE = NULL; 1345 bool isGlobalVariable = GV.getGlobal() != NULL; 1346 if (isGlobalVariable) { 1347 addToAccelTable = true; 1348 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1349 addOpAddress(Block, Asm->Mang->getSymbol(GV.getGlobal())); 1350 // Do not create specification DIE if context is either compile unit 1351 // or a subprogram. 1352 if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() && 1353 !GVContext.isFile() && !isSubprogramContext(GVContext)) { 1354 // Create specification DIE. 1355 VariableSpecDIE = new DIE(dwarf::DW_TAG_variable); 1356 addDIEEntry(VariableSpecDIE, dwarf::DW_AT_specification, 1357 dwarf::DW_FORM_ref4, VariableDIE); 1358 addBlock(VariableSpecDIE, dwarf::DW_AT_location, 0, Block); 1359 // A static member's declaration is already flagged as such. 1360 if (!SDMDecl.Verify()) 1361 addFlag(VariableDIE, dwarf::DW_AT_declaration); 1362 addDie(VariableSpecDIE); 1363 } else { 1364 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 1365 } 1366 // Add linkage name. 1367 StringRef LinkageName = GV.getLinkageName(); 1368 if (!LinkageName.empty()) { 1369 // From DWARF4: DIEs to which DW_AT_linkage_name may apply include: 1370 // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and 1371 // TAG_variable. 1372 addString(IsStaticMember && VariableSpecDIE ? 1373 VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name, 1374 GlobalValue::getRealLinkageName(LinkageName)); 1375 // In compatibility mode with older gdbs we put the linkage name on both 1376 // the TAG_variable DIE and on the TAG_member DIE. 1377 if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat()) 1378 addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, 1379 GlobalValue::getRealLinkageName(LinkageName)); 1380 } 1381 } else if (const ConstantInt *CI = 1382 dyn_cast_or_null<ConstantInt>(GV.getConstant())) { 1383 // AT_const_value was added when the static member was created. To avoid 1384 // emitting AT_const_value multiple times, we only add AT_const_value when 1385 // it is not a static member. 1386 if (!IsStaticMember) 1387 addConstantValue(VariableDIE, CI, GTy.isUnsignedDIType()); 1388 } else if (const ConstantExpr *CE = getMergedGlobalExpr(N->getOperand(11))) { 1389 addToAccelTable = true; 1390 // GV is a merged global. 1391 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 1392 Value *Ptr = CE->getOperand(0); 1393 addOpAddress(Block, Asm->Mang->getSymbol(cast<GlobalValue>(Ptr))); 1394 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1395 SmallVector<Value*, 3> Idx(CE->op_begin()+1, CE->op_end()); 1396 addUInt(Block, 0, dwarf::DW_FORM_udata, 1397 Asm->getDataLayout().getIndexedOffset(Ptr->getType(), Idx)); 1398 addUInt(Block, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1399 addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); 1400 } 1401 1402 if (addToAccelTable) { 1403 DIE *AddrDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE; 1404 addAccelName(GV.getName(), AddrDIE); 1405 1406 // If the linkage name is different than the name, go ahead and output 1407 // that as well into the name table. 1408 if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName()) 1409 addAccelName(GV.getLinkageName(), AddrDIE); 1410 } 1411 1412 return; 1413} 1414 1415/// constructSubrangeDIE - Construct subrange DIE from DISubrange. 1416void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, 1417 DIE *IndexTy) { 1418 DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type); 1419 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy); 1420 1421 // The LowerBound value defines the lower bounds which is typically zero for 1422 // C/C++. The Count value is the number of elements. Values are 64 bit. If 1423 // Count == -1 then the array is unbounded and we do not emit 1424 // DW_AT_lower_bound and DW_AT_upper_bound attributes. If LowerBound == 0 and 1425 // Count == 0, then the array has zero elements in which case we do not emit 1426 // an upper bound. 1427 int64_t LowerBound = SR.getLo(); 1428 int64_t DefaultLowerBound = getDefaultLowerBound(); 1429 int64_t Count = SR.getCount(); 1430 1431 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound) 1432 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, LowerBound); 1433 1434 if (Count != -1 && Count != 0) 1435 // FIXME: An unbounded array should reference the expression that defines 1436 // the array. 1437 addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, LowerBound + Count - 1); 1438 1439 Buffer.addChild(DW_Subrange); 1440} 1441 1442/// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 1443void CompileUnit::constructArrayTypeDIE(DIE &Buffer, 1444 DICompositeType *CTy) { 1445 Buffer.setTag(dwarf::DW_TAG_array_type); 1446 if (CTy->isVector()) 1447 addFlag(&Buffer, dwarf::DW_AT_GNU_vector); 1448 1449 // Emit derived type. 1450 addType(&Buffer, CTy->getTypeDerivedFrom()); 1451 DIArray Elements = CTy->getTypeArray(); 1452 1453 // Get an anonymous type for index type. 1454 // FIXME: This type should be passed down from the front end 1455 // as different languages may have different sizes for indexes. 1456 DIE *IdxTy = getIndexTyDie(); 1457 if (!IdxTy) { 1458 // Construct an anonymous type for index type. 1459 IdxTy = new DIE(dwarf::DW_TAG_base_type); 1460 addString(IdxTy, dwarf::DW_AT_name, "int"); 1461 addUInt(IdxTy, dwarf::DW_AT_byte_size, 0, sizeof(int32_t)); 1462 addUInt(IdxTy, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1463 dwarf::DW_ATE_signed); 1464 addDie(IdxTy); 1465 setIndexTyDie(IdxTy); 1466 } 1467 1468 // Add subranges to array type. 1469 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1470 DIDescriptor Element = Elements.getElement(i); 1471 if (Element.getTag() == dwarf::DW_TAG_subrange_type) 1472 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy); 1473 } 1474} 1475 1476/// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 1477DIE *CompileUnit::constructEnumTypeDIE(DIEnumerator ETy) { 1478 DIE *Enumerator = new DIE(dwarf::DW_TAG_enumerator); 1479 StringRef Name = ETy.getName(); 1480 addString(Enumerator, dwarf::DW_AT_name, Name); 1481 int64_t Value = ETy.getEnumValue(); 1482 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, Value); 1483 return Enumerator; 1484} 1485 1486/// constructContainingTypeDIEs - Construct DIEs for types that contain 1487/// vtables. 1488void CompileUnit::constructContainingTypeDIEs() { 1489 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 1490 CE = ContainingTypeMap.end(); CI != CE; ++CI) { 1491 DIE *SPDie = CI->first; 1492 const MDNode *N = CI->second; 1493 if (!N) continue; 1494 DIE *NDie = getDIE(N); 1495 if (!NDie) continue; 1496 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, NDie); 1497 } 1498} 1499 1500/// constructVariableDIE - Construct a DIE for the given DbgVariable. 1501DIE *CompileUnit::constructVariableDIE(DbgVariable *DV, 1502 bool isScopeAbstract) { 1503 StringRef Name = DV->getName(); 1504 1505 // Translate tag to proper Dwarf tag. 1506 unsigned Tag = DV->getTag(); 1507 1508 // Define variable debug information entry. 1509 DIE *VariableDie = new DIE(Tag); 1510 DbgVariable *AbsVar = DV->getAbstractVariable(); 1511 DIE *AbsDIE = AbsVar ? AbsVar->getDIE() : NULL; 1512 if (AbsDIE) 1513 addDIEEntry(VariableDie, dwarf::DW_AT_abstract_origin, 1514 dwarf::DW_FORM_ref4, AbsDIE); 1515 else { 1516 addString(VariableDie, dwarf::DW_AT_name, Name); 1517 addSourceLine(VariableDie, DV->getVariable()); 1518 addType(VariableDie, DV->getType()); 1519 } 1520 1521 if (DV->isArtificial()) 1522 addFlag(VariableDie, dwarf::DW_AT_artificial); 1523 1524 if (isScopeAbstract) { 1525 DV->setDIE(VariableDie); 1526 return VariableDie; 1527 } 1528 1529 // Add variable address. 1530 1531 unsigned Offset = DV->getDotDebugLocOffset(); 1532 if (Offset != ~0U) { 1533 addLabel(VariableDie, dwarf::DW_AT_location, 1534 dwarf::DW_FORM_data4, 1535 Asm->GetTempSymbol("debug_loc", Offset)); 1536 DV->setDIE(VariableDie); 1537 return VariableDie; 1538 } 1539 1540 // Check if variable is described by a DBG_VALUE instruction. 1541 if (const MachineInstr *DVInsn = DV->getMInsn()) { 1542 bool updated = false; 1543 assert(DVInsn->getNumOperands() == 3); 1544 if (DVInsn->getOperand(0).isReg()) { 1545 const MachineOperand RegOp = DVInsn->getOperand(0); 1546 if (int64_t Offset = DVInsn->getOperand(1).getImm()) { 1547 MachineLocation Location(RegOp.getReg(), Offset); 1548 addVariableAddress(*DV, VariableDie, Location); 1549 } else if (RegOp.getReg()) 1550 addVariableAddress(*DV, VariableDie, MachineLocation(RegOp.getReg())); 1551 updated = true; 1552 } else if (DVInsn->getOperand(0).isImm()) 1553 updated = 1554 addConstantValue(VariableDie, DVInsn->getOperand(0), DV->getType()); 1555 else if (DVInsn->getOperand(0).isFPImm()) 1556 updated = addConstantFPValue(VariableDie, DVInsn->getOperand(0)); 1557 else if (DVInsn->getOperand(0).isCImm()) 1558 updated = addConstantValue(VariableDie, DVInsn->getOperand(0).getCImm(), 1559 DV->getType().isUnsignedDIType()); 1560 if (!updated) { 1561 // If variableDie is not updated then DBG_VALUE instruction does not 1562 // have valid variable info. 1563 delete VariableDie; 1564 return NULL; 1565 } 1566 DV->setDIE(VariableDie); 1567 return VariableDie; 1568 } else { 1569 // .. else use frame index. 1570 int FI = DV->getFrameIndex(); 1571 if (FI != ~0) { 1572 unsigned FrameReg = 0; 1573 const TargetFrameLowering *TFI = Asm->TM.getFrameLowering(); 1574 int Offset = 1575 TFI->getFrameIndexReference(*Asm->MF, FI, FrameReg); 1576 MachineLocation Location(FrameReg, Offset); 1577 addVariableAddress(*DV, VariableDie, Location); 1578 } 1579 } 1580 1581 DV->setDIE(VariableDie); 1582 return VariableDie; 1583} 1584 1585/// createMemberDIE - Create new member DIE. 1586DIE *CompileUnit::createMemberDIE(DIDerivedType DT) { 1587 DIE *MemberDie = new DIE(DT.getTag()); 1588 StringRef Name = DT.getName(); 1589 if (!Name.empty()) 1590 addString(MemberDie, dwarf::DW_AT_name, Name); 1591 1592 addType(MemberDie, DT.getTypeDerivedFrom()); 1593 1594 addSourceLine(MemberDie, DT); 1595 1596 DIEBlock *MemLocationDie = new (DIEValueAllocator) DIEBlock(); 1597 addUInt(MemLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1598 1599 uint64_t Size = DT.getSizeInBits(); 1600 uint64_t FieldSize = DT.getOriginalTypeSize(); 1601 1602 if (Size != FieldSize) { 1603 // Handle bitfield. 1604 addUInt(MemberDie, dwarf::DW_AT_byte_size, 0, DT.getOriginalTypeSize()>>3); 1605 addUInt(MemberDie, dwarf::DW_AT_bit_size, 0, DT.getSizeInBits()); 1606 1607 uint64_t Offset = DT.getOffsetInBits(); 1608 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1609 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1610 uint64_t FieldOffset = (HiMark - FieldSize); 1611 Offset -= FieldOffset; 1612 1613 // Maybe we need to work from the other end. 1614 if (Asm->getDataLayout().isLittleEndian()) 1615 Offset = FieldSize - (Offset + Size); 1616 addUInt(MemberDie, dwarf::DW_AT_bit_offset, 0, Offset); 1617 1618 // Here WD_AT_data_member_location points to the anonymous 1619 // field that includes this bit field. 1620 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, FieldOffset >> 3); 1621 1622 } else 1623 // This is not a bitfield. 1624 addUInt(MemLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits() >> 3); 1625 1626 if (DT.getTag() == dwarf::DW_TAG_inheritance 1627 && DT.isVirtual()) { 1628 1629 // For C++, virtual base classes are not at fixed offset. Use following 1630 // expression to extract appropriate offset from vtable. 1631 // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1632 1633 DIEBlock *VBaseLocationDie = new (DIEValueAllocator) DIEBlock(); 1634 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1635 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1636 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1637 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_udata, DT.getOffsetInBits()); 1638 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1639 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1640 addUInt(VBaseLocationDie, 0, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1641 1642 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, 1643 VBaseLocationDie); 1644 } else 1645 addBlock(MemberDie, dwarf::DW_AT_data_member_location, 0, MemLocationDie); 1646 1647 if (DT.isProtected()) 1648 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1649 dwarf::DW_ACCESS_protected); 1650 else if (DT.isPrivate()) 1651 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1652 dwarf::DW_ACCESS_private); 1653 // Otherwise C++ member and base classes are considered public. 1654 else 1655 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1656 dwarf::DW_ACCESS_public); 1657 if (DT.isVirtual()) 1658 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1659 dwarf::DW_VIRTUALITY_virtual); 1660 1661 // Objective-C properties. 1662 if (MDNode *PNode = DT.getObjCProperty()) 1663 if (DIEEntry *PropertyDie = getDIEEntry(PNode)) 1664 MemberDie->addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 1665 PropertyDie); 1666 1667 if (DT.isArtificial()) 1668 addFlag(MemberDie, dwarf::DW_AT_artificial); 1669 1670 return MemberDie; 1671} 1672 1673/// createStaticMemberDIE - Create new DIE for C++ static member. 1674DIE *CompileUnit::createStaticMemberDIE(const DIDerivedType DT) { 1675 if (!DT.Verify()) 1676 return NULL; 1677 1678 DIE *StaticMemberDIE = new DIE(DT.getTag()); 1679 DIType Ty = DT.getTypeDerivedFrom(); 1680 1681 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName()); 1682 addType(StaticMemberDIE, Ty); 1683 addSourceLine(StaticMemberDIE, DT); 1684 addFlag(StaticMemberDIE, dwarf::DW_AT_external); 1685 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration); 1686 1687 // FIXME: We could omit private if the parent is a class_type, and 1688 // public if the parent is something else. 1689 if (DT.isProtected()) 1690 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1691 dwarf::DW_ACCESS_protected); 1692 else if (DT.isPrivate()) 1693 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1694 dwarf::DW_ACCESS_private); 1695 else 1696 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1697 dwarf::DW_ACCESS_public); 1698 1699 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant())) 1700 addConstantValue(StaticMemberDIE, CI, Ty.isUnsignedDIType()); 1701 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant())) 1702 addConstantFPValue(StaticMemberDIE, CFP); 1703 1704 insertDIE(DT, StaticMemberDIE); 1705 return StaticMemberDIE; 1706} 1707