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