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 // FIXME: reference and rvalue_reference /probably/ shouldn't be allowed 631 // here, but accept them for now due to a bug in SROA producing bogus 632 // dbg.values. 633 if (T == dwarf::DW_TAG_pointer_type || 634 T == dwarf::DW_TAG_ptr_to_member_type || 635 T == dwarf::DW_TAG_reference_type || 636 T == dwarf::DW_TAG_rvalue_reference_type) 637 return true; 638 assert(T == dwarf::DW_TAG_typedef || T == dwarf::DW_TAG_const_type || 639 T == dwarf::DW_TAG_volatile_type || 640 T == dwarf::DW_TAG_restrict_type || 641 T == dwarf::DW_TAG_enumeration_type); 642 if (DITypeRef Deriv = DTy.getTypeDerivedFrom()) 643 return isUnsignedDIType(DD, DD->resolve(Deriv)); 644 // FIXME: Enums without a fixed underlying type have unknown signedness 645 // here, leading to incorrectly emitted constants. 646 assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type); 647 return false; 648 } 649 650 DIBasicType BTy(Ty); 651 assert(BTy.isBasicType()); 652 unsigned Encoding = BTy.getEncoding(); 653 assert((Encoding == dwarf::DW_ATE_unsigned || 654 Encoding == dwarf::DW_ATE_unsigned_char || 655 Encoding == dwarf::DW_ATE_signed || 656 Encoding == dwarf::DW_ATE_signed_char || 657 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean || 658 (Ty.getTag() == dwarf::DW_TAG_unspecified_type && 659 Ty.getName() == "decltype(nullptr)")) && 660 "Unsupported encoding"); 661 return (Encoding == dwarf::DW_ATE_unsigned || 662 Encoding == dwarf::DW_ATE_unsigned_char || 663 Encoding == dwarf::DW_ATE_UTF || Encoding == dwarf::DW_ATE_boolean || 664 Ty.getTag() == dwarf::DW_TAG_unspecified_type); 665 } 666 667 /// If this type is derived from a base type then return base type size. 668 static uint64_t getBaseTypeSize(DwarfDebug *DD, DIDerivedType Ty) { 669 unsigned Tag = Ty.getTag(); 670 671 if (Tag != dwarf::DW_TAG_member && Tag != dwarf::DW_TAG_typedef && 672 Tag != dwarf::DW_TAG_const_type && Tag != dwarf::DW_TAG_volatile_type && 673 Tag != dwarf::DW_TAG_restrict_type) 674 return Ty.getSizeInBits(); 675 676 DIType BaseType = DD->resolve(Ty.getTypeDerivedFrom()); 677 678 // If this type is not derived from any type or the type is a declaration then 679 // take conservative approach. 680 if (!BaseType.isValid() || BaseType.isForwardDecl()) 681 return Ty.getSizeInBits(); 682 683 // If this is a derived type, go ahead and get the base type, unless it's a 684 // reference then it's just the size of the field. Pointer types have no need 685 // of this since they're a different type of qualification on the type. 686 if (BaseType.getTag() == dwarf::DW_TAG_reference_type || 687 BaseType.getTag() == dwarf::DW_TAG_rvalue_reference_type) 688 return Ty.getSizeInBits(); 689 690 if (BaseType.isDerivedType()) 691 return getBaseTypeSize(DD, DIDerivedType(BaseType)); 692 693 return BaseType.getSizeInBits(); 694 } 695 696 /// addConstantFPValue - Add constant value entry in variable DIE. 697 void DwarfUnit::addConstantFPValue(DIE &Die, const MachineOperand &MO) { 698 assert(MO.isFPImm() && "Invalid machine operand!"); 699 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 700 APFloat FPImm = MO.getFPImm()->getValueAPF(); 701 702 // Get the raw data form of the floating point. 703 const APInt FltVal = FPImm.bitcastToAPInt(); 704 const char *FltPtr = (const char *)FltVal.getRawData(); 705 706 int NumBytes = FltVal.getBitWidth() / 8; // 8 bits per byte. 707 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 708 int Incr = (LittleEndian ? 1 : -1); 709 int Start = (LittleEndian ? 0 : NumBytes - 1); 710 int Stop = (LittleEndian ? NumBytes : -1); 711 712 // Output the constant to DWARF one byte at a time. 713 for (; Start != Stop; Start += Incr) 714 addUInt(*Block, dwarf::DW_FORM_data1, (unsigned char)0xFF & FltPtr[Start]); 715 716 addBlock(Die, dwarf::DW_AT_const_value, Block); 717 } 718 719 /// addConstantFPValue - Add constant value entry in variable DIE. 720 void DwarfUnit::addConstantFPValue(DIE &Die, const ConstantFP *CFP) { 721 // Pass this down to addConstantValue as an unsigned bag of bits. 722 addConstantValue(Die, CFP->getValueAPF().bitcastToAPInt(), true); 723 } 724 725 /// addConstantValue - Add constant value entry in variable DIE. 726 void DwarfUnit::addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty) { 727 addConstantValue(Die, CI->getValue(), Ty); 728 } 729 730 /// addConstantValue - Add constant value entry in variable DIE. 731 void DwarfUnit::addConstantValue(DIE &Die, const MachineOperand &MO, 732 DIType Ty) { 733 assert(MO.isImm() && "Invalid machine operand!"); 734 735 addConstantValue(Die, isUnsignedDIType(DD, Ty), MO.getImm()); 736 } 737 738 void DwarfUnit::addConstantValue(DIE &Die, bool Unsigned, uint64_t Val) { 739 // FIXME: This is a bit conservative/simple - it emits negative values always 740 // sign extended to 64 bits rather than minimizing the number of bytes. 741 addUInt(Die, dwarf::DW_AT_const_value, 742 Unsigned ? dwarf::DW_FORM_udata : dwarf::DW_FORM_sdata, Val); 743 } 744 745 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, DIType Ty) { 746 addConstantValue(Die, Val, isUnsignedDIType(DD, Ty)); 747 } 748 749 // addConstantValue - Add constant value entry in variable DIE. 750 void DwarfUnit::addConstantValue(DIE &Die, const APInt &Val, bool Unsigned) { 751 unsigned CIBitWidth = Val.getBitWidth(); 752 if (CIBitWidth <= 64) { 753 addConstantValue(Die, Unsigned, 754 Unsigned ? Val.getZExtValue() : Val.getSExtValue()); 755 return; 756 } 757 758 DIEBlock *Block = new (DIEValueAllocator) DIEBlock(); 759 760 // Get the raw data form of the large APInt. 761 const uint64_t *Ptr64 = Val.getRawData(); 762 763 int NumBytes = Val.getBitWidth() / 8; // 8 bits per byte. 764 bool LittleEndian = Asm->getDataLayout().isLittleEndian(); 765 766 // Output the constant to DWARF one byte at a time. 767 for (int i = 0; i < NumBytes; i++) { 768 uint8_t c; 769 if (LittleEndian) 770 c = Ptr64[i / 8] >> (8 * (i & 7)); 771 else 772 c = Ptr64[(NumBytes - 1 - i) / 8] >> (8 * ((NumBytes - 1 - i) & 7)); 773 addUInt(*Block, dwarf::DW_FORM_data1, c); 774 } 775 776 addBlock(Die, dwarf::DW_AT_const_value, Block); 777 } 778 779 /// addTemplateParams - Add template parameters into buffer. 780 void DwarfUnit::addTemplateParams(DIE &Buffer, DIArray TParams) { 781 // Add template parameters. 782 for (unsigned i = 0, e = TParams.getNumElements(); i != e; ++i) { 783 DIDescriptor Element = TParams.getElement(i); 784 if (Element.isTemplateTypeParameter()) 785 constructTemplateTypeParameterDIE(Buffer, 786 DITemplateTypeParameter(Element)); 787 else if (Element.isTemplateValueParameter()) 788 constructTemplateValueParameterDIE(Buffer, 789 DITemplateValueParameter(Element)); 790 } 791 } 792 793 /// getOrCreateContextDIE - Get context owner's DIE. 794 DIE *DwarfUnit::getOrCreateContextDIE(DIScope Context) { 795 if (!Context || Context.isFile()) 796 return &getUnitDie(); 797 if (Context.isType()) 798 return getOrCreateTypeDIE(DIType(Context)); 799 if (Context.isNameSpace()) 800 return getOrCreateNameSpace(DINameSpace(Context)); 801 if (Context.isSubprogram()) 802 return getOrCreateSubprogramDIE(DISubprogram(Context)); 803 return getDIE(Context); 804 } 805 806 DIE *DwarfUnit::createTypeDIE(DICompositeType Ty) { 807 DIScope Context = resolve(Ty.getContext()); 808 DIE *ContextDIE = getOrCreateContextDIE(Context); 809 810 if (DIE *TyDIE = getDIE(Ty)) 811 return TyDIE; 812 813 // Create new type. 814 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty); 815 816 constructTypeDIE(TyDIE, Ty); 817 818 updateAcceleratorTables(Context, Ty, TyDIE); 819 return &TyDIE; 820 } 821 822 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 823 /// given DIType. 824 DIE *DwarfUnit::getOrCreateTypeDIE(const MDNode *TyNode) { 825 if (!TyNode) 826 return nullptr; 827 828 DIType Ty(TyNode); 829 assert(Ty.isType()); 830 assert(Ty == resolve(Ty.getRef()) && 831 "type was not uniqued, possible ODR violation."); 832 833 // DW_TAG_restrict_type is not supported in DWARF2 834 if (Ty.getTag() == dwarf::DW_TAG_restrict_type && DD->getDwarfVersion() <= 2) 835 return getOrCreateTypeDIE(resolve(DIDerivedType(Ty).getTypeDerivedFrom())); 836 837 // Construct the context before querying for the existence of the DIE in case 838 // such construction creates the DIE. 839 DIScope Context = resolve(Ty.getContext()); 840 DIE *ContextDIE = getOrCreateContextDIE(Context); 841 assert(ContextDIE); 842 843 if (DIE *TyDIE = getDIE(Ty)) 844 return TyDIE; 845 846 // Create new type. 847 DIE &TyDIE = createAndAddDIE(Ty.getTag(), *ContextDIE, Ty); 848 849 updateAcceleratorTables(Context, Ty, TyDIE); 850 851 if (Ty.isBasicType()) 852 constructTypeDIE(TyDIE, DIBasicType(Ty)); 853 else if (Ty.isCompositeType()) { 854 DICompositeType CTy(Ty); 855 if (GenerateDwarfTypeUnits && !Ty.isForwardDecl()) 856 if (MDString *TypeId = CTy.getIdentifier()) { 857 DD->addDwarfTypeUnitType(getCU(), TypeId->getString(), TyDIE, CTy); 858 // Skip updating the accelerator tables since this is not the full type. 859 return &TyDIE; 860 } 861 constructTypeDIE(TyDIE, CTy); 862 } else { 863 assert(Ty.isDerivedType() && "Unknown kind of DIType"); 864 constructTypeDIE(TyDIE, DIDerivedType(Ty)); 865 } 866 867 return &TyDIE; 868 } 869 870 void DwarfUnit::updateAcceleratorTables(DIScope Context, DIType Ty, 871 const DIE &TyDIE) { 872 if (!Ty.getName().empty() && !Ty.isForwardDecl()) { 873 bool IsImplementation = 0; 874 if (Ty.isCompositeType()) { 875 DICompositeType CT(Ty); 876 // A runtime language of 0 actually means C/C++ and that any 877 // non-negative value is some version of Objective-C/C++. 878 IsImplementation = (CT.getRunTimeLang() == 0) || CT.isObjcClassComplete(); 879 } 880 unsigned Flags = IsImplementation ? dwarf::DW_FLAG_type_implementation : 0; 881 DD->addAccelType(Ty.getName(), TyDIE, Flags); 882 883 if (!Context || Context.isCompileUnit() || Context.isFile() || 884 Context.isNameSpace()) 885 addGlobalType(Ty, TyDIE, Context); 886 } 887 } 888 889 /// addType - Add a new type attribute to the specified entity. 890 void DwarfUnit::addType(DIE &Entity, DIType Ty, dwarf::Attribute Attribute) { 891 assert(Ty && "Trying to add a type that doesn't exist?"); 892 893 // Check for pre-existence. 894 DIEEntry *Entry = getDIEEntry(Ty); 895 // If it exists then use the existing value. 896 if (Entry) { 897 addDIEEntry(Entity, Attribute, Entry); 898 return; 899 } 900 901 // Construct type. 902 DIE *Buffer = getOrCreateTypeDIE(Ty); 903 904 // Set up proxy. 905 Entry = createDIEEntry(*Buffer); 906 insertDIEEntry(Ty, Entry); 907 addDIEEntry(Entity, Attribute, Entry); 908 } 909 910 /// getParentContextString - Walks the metadata parent chain in a language 911 /// specific manner (using the compile unit language) and returns 912 /// it as a string. This is done at the metadata level because DIEs may 913 /// not currently have been added to the parent context and walking the 914 /// DIEs looking for names is more expensive than walking the metadata. 915 std::string DwarfUnit::getParentContextString(DIScope Context) const { 916 if (!Context) 917 return ""; 918 919 // FIXME: Decide whether to implement this for non-C++ languages. 920 if (getLanguage() != dwarf::DW_LANG_C_plus_plus) 921 return ""; 922 923 std::string CS; 924 SmallVector<DIScope, 1> Parents; 925 while (!Context.isCompileUnit()) { 926 Parents.push_back(Context); 927 if (Context.getContext()) 928 Context = resolve(Context.getContext()); 929 else 930 // Structure, etc types will have a NULL context if they're at the top 931 // level. 932 break; 933 } 934 935 // Reverse iterate over our list to go from the outermost construct to the 936 // innermost. 937 for (SmallVectorImpl<DIScope>::reverse_iterator I = Parents.rbegin(), 938 E = Parents.rend(); 939 I != E; ++I) { 940 DIScope Ctx = *I; 941 StringRef Name = Ctx.getName(); 942 if (Name.empty() && Ctx.isNameSpace()) 943 Name = "(anonymous namespace)"; 944 if (!Name.empty()) { 945 CS += Name; 946 CS += "::"; 947 } 948 } 949 return CS; 950 } 951 952 /// constructTypeDIE - Construct basic type die from DIBasicType. 953 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIBasicType BTy) { 954 // Get core information. 955 StringRef Name = BTy.getName(); 956 // Add name if not anonymous or intermediate type. 957 if (!Name.empty()) 958 addString(Buffer, dwarf::DW_AT_name, Name); 959 960 // An unspecified type only has a name attribute. 961 if (BTy.getTag() == dwarf::DW_TAG_unspecified_type) 962 return; 963 964 addUInt(Buffer, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 965 BTy.getEncoding()); 966 967 uint64_t Size = BTy.getSizeInBits() >> 3; 968 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 969 } 970 971 /// constructTypeDIE - Construct derived type die from DIDerivedType. 972 void DwarfUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) { 973 // Get core information. 974 StringRef Name = DTy.getName(); 975 uint64_t Size = DTy.getSizeInBits() >> 3; 976 uint16_t Tag = Buffer.getTag(); 977 978 // Map to main type, void will not have a type. 979 DIType FromTy = resolve(DTy.getTypeDerivedFrom()); 980 if (FromTy) 981 addType(Buffer, FromTy); 982 983 // Add name if not anonymous or intermediate type. 984 if (!Name.empty()) 985 addString(Buffer, dwarf::DW_AT_name, Name); 986 987 // Add size if non-zero (derived types might be zero-sized.) 988 if (Size && Tag != dwarf::DW_TAG_pointer_type 989 && Tag != dwarf::DW_TAG_ptr_to_member_type) 990 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 991 992 if (Tag == dwarf::DW_TAG_ptr_to_member_type) 993 addDIEEntry(Buffer, dwarf::DW_AT_containing_type, 994 *getOrCreateTypeDIE(resolve(DTy.getClassType()))); 995 // Add source line info if available and TyDesc is not a forward declaration. 996 if (!DTy.isForwardDecl()) 997 addSourceLine(Buffer, DTy); 998 } 999 1000 /// constructSubprogramArguments - Construct function argument DIEs. 1001 void DwarfUnit::constructSubprogramArguments(DIE &Buffer, DITypeArray Args) { 1002 for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) { 1003 DIType Ty = resolve(Args.getElement(i)); 1004 if (!Ty) { 1005 assert(i == N-1 && "Unspecified parameter must be the last argument"); 1006 createAndAddDIE(dwarf::DW_TAG_unspecified_parameters, Buffer); 1007 } else { 1008 DIE &Arg = createAndAddDIE(dwarf::DW_TAG_formal_parameter, Buffer); 1009 addType(Arg, Ty); 1010 if (Ty.isArtificial()) 1011 addFlag(Arg, dwarf::DW_AT_artificial); 1012 } 1013 } 1014 } 1015 1016 /// constructTypeDIE - Construct type DIE from DICompositeType. 1017 void DwarfUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { 1018 // Add name if not anonymous or intermediate type. 1019 StringRef Name = CTy.getName(); 1020 1021 uint64_t Size = CTy.getSizeInBits() >> 3; 1022 uint16_t Tag = Buffer.getTag(); 1023 1024 switch (Tag) { 1025 case dwarf::DW_TAG_array_type: 1026 constructArrayTypeDIE(Buffer, CTy); 1027 break; 1028 case dwarf::DW_TAG_enumeration_type: 1029 constructEnumTypeDIE(Buffer, CTy); 1030 break; 1031 case dwarf::DW_TAG_subroutine_type: { 1032 // Add return type. A void return won't have a type. 1033 DITypeArray Elements = DISubroutineType(CTy).getTypeArray(); 1034 DIType RTy(resolve(Elements.getElement(0))); 1035 if (RTy) 1036 addType(Buffer, RTy); 1037 1038 bool isPrototyped = true; 1039 if (Elements.getNumElements() == 2 && 1040 !Elements.getElement(1)) 1041 isPrototyped = false; 1042 1043 constructSubprogramArguments(Buffer, Elements); 1044 1045 // Add prototype flag if we're dealing with a C language and the 1046 // function has been prototyped. 1047 uint16_t Language = getLanguage(); 1048 if (isPrototyped && 1049 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 || 1050 Language == dwarf::DW_LANG_ObjC)) 1051 addFlag(Buffer, dwarf::DW_AT_prototyped); 1052 1053 if (CTy.isLValueReference()) 1054 addFlag(Buffer, dwarf::DW_AT_reference); 1055 1056 if (CTy.isRValueReference()) 1057 addFlag(Buffer, dwarf::DW_AT_rvalue_reference); 1058 } break; 1059 case dwarf::DW_TAG_structure_type: 1060 case dwarf::DW_TAG_union_type: 1061 case dwarf::DW_TAG_class_type: { 1062 // Add elements to structure type. 1063 DIArray Elements = CTy.getElements(); 1064 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1065 DIDescriptor Element = Elements.getElement(i); 1066 if (Element.isSubprogram()) 1067 getOrCreateSubprogramDIE(DISubprogram(Element)); 1068 else if (Element.isDerivedType()) { 1069 DIDerivedType DDTy(Element); 1070 if (DDTy.getTag() == dwarf::DW_TAG_friend) { 1071 DIE &ElemDie = createAndAddDIE(dwarf::DW_TAG_friend, Buffer); 1072 addType(ElemDie, resolve(DDTy.getTypeDerivedFrom()), 1073 dwarf::DW_AT_friend); 1074 } else if (DDTy.isStaticMember()) { 1075 getOrCreateStaticMemberDIE(DDTy); 1076 } else { 1077 constructMemberDIE(Buffer, DDTy); 1078 } 1079 } else if (Element.isObjCProperty()) { 1080 DIObjCProperty Property(Element); 1081 DIE &ElemDie = createAndAddDIE(Property.getTag(), Buffer); 1082 StringRef PropertyName = Property.getObjCPropertyName(); 1083 addString(ElemDie, dwarf::DW_AT_APPLE_property_name, PropertyName); 1084 if (Property.getType()) 1085 addType(ElemDie, Property.getType()); 1086 addSourceLine(ElemDie, Property); 1087 StringRef GetterName = Property.getObjCPropertyGetterName(); 1088 if (!GetterName.empty()) 1089 addString(ElemDie, dwarf::DW_AT_APPLE_property_getter, GetterName); 1090 StringRef SetterName = Property.getObjCPropertySetterName(); 1091 if (!SetterName.empty()) 1092 addString(ElemDie, dwarf::DW_AT_APPLE_property_setter, SetterName); 1093 unsigned PropertyAttributes = 0; 1094 if (Property.isReadOnlyObjCProperty()) 1095 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readonly; 1096 if (Property.isReadWriteObjCProperty()) 1097 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_readwrite; 1098 if (Property.isAssignObjCProperty()) 1099 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_assign; 1100 if (Property.isRetainObjCProperty()) 1101 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_retain; 1102 if (Property.isCopyObjCProperty()) 1103 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_copy; 1104 if (Property.isNonAtomicObjCProperty()) 1105 PropertyAttributes |= dwarf::DW_APPLE_PROPERTY_nonatomic; 1106 if (PropertyAttributes) 1107 addUInt(ElemDie, dwarf::DW_AT_APPLE_property_attribute, None, 1108 PropertyAttributes); 1109 1110 DIEEntry *Entry = getDIEEntry(Element); 1111 if (!Entry) { 1112 Entry = createDIEEntry(ElemDie); 1113 insertDIEEntry(Element, Entry); 1114 } 1115 } else 1116 continue; 1117 } 1118 1119 if (CTy.isAppleBlockExtension()) 1120 addFlag(Buffer, dwarf::DW_AT_APPLE_block); 1121 1122 // This is outside the DWARF spec, but GDB expects a DW_AT_containing_type 1123 // inside C++ composite types to point to the base class with the vtable. 1124 DICompositeType ContainingType(resolve(CTy.getContainingType())); 1125 if (ContainingType) 1126 addDIEEntry(Buffer, dwarf::DW_AT_containing_type, 1127 *getOrCreateTypeDIE(ContainingType)); 1128 1129 if (CTy.isObjcClassComplete()) 1130 addFlag(Buffer, dwarf::DW_AT_APPLE_objc_complete_type); 1131 1132 // Add template parameters to a class, structure or union types. 1133 // FIXME: The support isn't in the metadata for this yet. 1134 if (Tag == dwarf::DW_TAG_class_type || 1135 Tag == dwarf::DW_TAG_structure_type || Tag == dwarf::DW_TAG_union_type) 1136 addTemplateParams(Buffer, CTy.getTemplateParams()); 1137 1138 break; 1139 } 1140 default: 1141 break; 1142 } 1143 1144 // Add name if not anonymous or intermediate type. 1145 if (!Name.empty()) 1146 addString(Buffer, dwarf::DW_AT_name, Name); 1147 1148 if (Tag == dwarf::DW_TAG_enumeration_type || 1149 Tag == dwarf::DW_TAG_class_type || Tag == dwarf::DW_TAG_structure_type || 1150 Tag == dwarf::DW_TAG_union_type) { 1151 // Add size if non-zero (derived types might be zero-sized.) 1152 // TODO: Do we care about size for enum forward declarations? 1153 if (Size) 1154 addUInt(Buffer, dwarf::DW_AT_byte_size, None, Size); 1155 else if (!CTy.isForwardDecl()) 1156 // Add zero size if it is not a forward declaration. 1157 addUInt(Buffer, dwarf::DW_AT_byte_size, None, 0); 1158 1159 // If we're a forward decl, say so. 1160 if (CTy.isForwardDecl()) 1161 addFlag(Buffer, dwarf::DW_AT_declaration); 1162 1163 // Add source line info if available. 1164 if (!CTy.isForwardDecl()) 1165 addSourceLine(Buffer, CTy); 1166 1167 // No harm in adding the runtime language to the declaration. 1168 unsigned RLang = CTy.getRunTimeLang(); 1169 if (RLang) 1170 addUInt(Buffer, dwarf::DW_AT_APPLE_runtime_class, dwarf::DW_FORM_data1, 1171 RLang); 1172 } 1173 } 1174 1175 /// constructTemplateTypeParameterDIE - Construct new DIE for the given 1176 /// DITemplateTypeParameter. 1177 void DwarfUnit::constructTemplateTypeParameterDIE(DIE &Buffer, 1178 DITemplateTypeParameter TP) { 1179 DIE &ParamDIE = 1180 createAndAddDIE(dwarf::DW_TAG_template_type_parameter, Buffer); 1181 // Add the type if it exists, it could be void and therefore no type. 1182 if (TP.getType()) 1183 addType(ParamDIE, resolve(TP.getType())); 1184 if (!TP.getName().empty()) 1185 addString(ParamDIE, dwarf::DW_AT_name, TP.getName()); 1186 } 1187 1188 /// constructTemplateValueParameterDIE - Construct new DIE for the given 1189 /// DITemplateValueParameter. 1190 void 1191 DwarfUnit::constructTemplateValueParameterDIE(DIE &Buffer, 1192 DITemplateValueParameter VP) { 1193 DIE &ParamDIE = createAndAddDIE(VP.getTag(), Buffer); 1194 1195 // Add the type if there is one, template template and template parameter 1196 // packs will not have a type. 1197 if (VP.getTag() == dwarf::DW_TAG_template_value_parameter) 1198 addType(ParamDIE, resolve(VP.getType())); 1199 if (!VP.getName().empty()) 1200 addString(ParamDIE, dwarf::DW_AT_name, VP.getName()); 1201 if (Metadata *Val = VP.getValue()) { 1202 if (ConstantInt *CI = mdconst::dyn_extract<ConstantInt>(Val)) 1203 addConstantValue(ParamDIE, CI, resolve(VP.getType())); 1204 else if (GlobalValue *GV = mdconst::dyn_extract<GlobalValue>(Val)) { 1205 // For declaration non-type template parameters (such as global values and 1206 // functions) 1207 DIELoc *Loc = new (DIEValueAllocator) DIELoc(); 1208 addOpAddress(*Loc, Asm->getSymbol(GV)); 1209 // Emit DW_OP_stack_value to use the address as the immediate value of the 1210 // parameter, rather than a pointer to it. 1211 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value); 1212 addBlock(ParamDIE, dwarf::DW_AT_location, Loc); 1213 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_template_param) { 1214 assert(isa<MDString>(Val)); 1215 addString(ParamDIE, dwarf::DW_AT_GNU_template_name, 1216 cast<MDString>(Val)->getString()); 1217 } else if (VP.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) { 1218 assert(isa<MDNode>(Val)); 1219 DIArray A(cast<MDNode>(Val)); 1220 addTemplateParams(ParamDIE, A); 1221 } 1222 } 1223 } 1224 1225 /// getOrCreateNameSpace - Create a DIE for DINameSpace. 1226 DIE *DwarfUnit::getOrCreateNameSpace(DINameSpace NS) { 1227 // Construct the context before querying for the existence of the DIE in case 1228 // such construction creates the DIE. 1229 DIE *ContextDIE = getOrCreateContextDIE(NS.getContext()); 1230 1231 if (DIE *NDie = getDIE(NS)) 1232 return NDie; 1233 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_namespace, *ContextDIE, NS); 1234 1235 StringRef Name = NS.getName(); 1236 if (!Name.empty()) 1237 addString(NDie, dwarf::DW_AT_name, NS.getName()); 1238 else 1239 Name = "(anonymous namespace)"; 1240 DD->addAccelNamespace(Name, NDie); 1241 addGlobalName(Name, NDie, NS.getContext()); 1242 addSourceLine(NDie, NS); 1243 return &NDie; 1244 } 1245 1246 /// getOrCreateSubprogramDIE - Create new DIE using SP. 1247 DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP, bool Minimal) { 1248 // Construct the context before querying for the existence of the DIE in case 1249 // such construction creates the DIE (as is the case for member function 1250 // declarations). 1251 DIE *ContextDIE = 1252 Minimal ? &getUnitDie() : getOrCreateContextDIE(resolve(SP.getContext())); 1253 1254 if (DIE *SPDie = getDIE(SP)) 1255 return SPDie; 1256 1257 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { 1258 if (!Minimal) { 1259 // Add subprogram definitions to the CU die directly. 1260 ContextDIE = &getUnitDie(); 1261 // Build the decl now to ensure it precedes the definition. 1262 getOrCreateSubprogramDIE(SPDecl); 1263 } 1264 } 1265 1266 // DW_TAG_inlined_subroutine may refer to this DIE. 1267 DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP); 1268 1269 // Stop here and fill this in later, depending on whether or not this 1270 // subprogram turns out to have inlined instances or not. 1271 if (SP.isDefinition()) 1272 return &SPDie; 1273 1274 applySubprogramAttributes(SP, SPDie); 1275 return &SPDie; 1276 } 1277 1278 bool DwarfUnit::applySubprogramDefinitionAttributes(DISubprogram SP, 1279 DIE &SPDie) { 1280 DIE *DeclDie = nullptr; 1281 StringRef DeclLinkageName; 1282 if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { 1283 DeclDie = getDIE(SPDecl); 1284 assert(DeclDie && "This DIE should've already been constructed when the " 1285 "definition DIE was created in " 1286 "getOrCreateSubprogramDIE"); 1287 DeclLinkageName = SPDecl.getLinkageName(); 1288 } 1289 1290 // Add function template parameters. 1291 addTemplateParams(SPDie, SP.getTemplateParams()); 1292 1293 // Add the linkage name if we have one and it isn't in the Decl. 1294 StringRef LinkageName = SP.getLinkageName(); 1295 assert(((LinkageName.empty() || DeclLinkageName.empty()) || 1296 LinkageName == DeclLinkageName) && 1297 "decl has a linkage name and it is different"); 1298 if (!LinkageName.empty() && DeclLinkageName.empty()) 1299 addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, 1300 GlobalValue::getRealLinkageName(LinkageName)); 1301 1302 if (!DeclDie) 1303 return false; 1304 1305 // Refer to the function declaration where all the other attributes will be 1306 // found. 1307 addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie); 1308 return true; 1309 } 1310 1311 void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie, 1312 bool Minimal) { 1313 if (!Minimal) 1314 if (applySubprogramDefinitionAttributes(SP, SPDie)) 1315 return; 1316 1317 // Constructors and operators for anonymous aggregates do not have names. 1318 if (!SP.getName().empty()) 1319 addString(SPDie, dwarf::DW_AT_name, SP.getName()); 1320 1321 // Skip the rest of the attributes under -gmlt to save space. 1322 if (Minimal) 1323 return; 1324 1325 addSourceLine(SPDie, SP); 1326 1327 // Add the prototype if we have a prototype and we have a C like 1328 // language. 1329 uint16_t Language = getLanguage(); 1330 if (SP.isPrototyped() && 1331 (Language == dwarf::DW_LANG_C89 || Language == dwarf::DW_LANG_C99 || 1332 Language == dwarf::DW_LANG_ObjC)) 1333 addFlag(SPDie, dwarf::DW_AT_prototyped); 1334 1335 DISubroutineType SPTy = SP.getType(); 1336 assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type && 1337 "the type of a subprogram should be a subroutine"); 1338 1339 DITypeArray Args = SPTy.getTypeArray(); 1340 // Add a return type. If this is a type like a C/C++ void type we don't add a 1341 // return type. 1342 if (resolve(Args.getElement(0))) 1343 addType(SPDie, DIType(resolve(Args.getElement(0)))); 1344 1345 unsigned VK = SP.getVirtuality(); 1346 if (VK) { 1347 addUInt(SPDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, VK); 1348 DIELoc *Block = getDIELoc(); 1349 addUInt(*Block, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1350 addUInt(*Block, dwarf::DW_FORM_udata, SP.getVirtualIndex()); 1351 addBlock(SPDie, dwarf::DW_AT_vtable_elem_location, Block); 1352 ContainingTypeMap.insert( 1353 std::make_pair(&SPDie, resolve(SP.getContainingType()))); 1354 } 1355 1356 if (!SP.isDefinition()) { 1357 addFlag(SPDie, dwarf::DW_AT_declaration); 1358 1359 // Add arguments. Do not add arguments for subprogram definition. They will 1360 // be handled while processing variables. 1361 constructSubprogramArguments(SPDie, Args); 1362 } 1363 1364 if (SP.isArtificial()) 1365 addFlag(SPDie, dwarf::DW_AT_artificial); 1366 1367 if (!SP.isLocalToUnit()) 1368 addFlag(SPDie, dwarf::DW_AT_external); 1369 1370 if (SP.isOptimized()) 1371 addFlag(SPDie, dwarf::DW_AT_APPLE_optimized); 1372 1373 if (unsigned isa = Asm->getISAEncoding()) { 1374 addUInt(SPDie, dwarf::DW_AT_APPLE_isa, dwarf::DW_FORM_flag, isa); 1375 } 1376 1377 if (SP.isLValueReference()) 1378 addFlag(SPDie, dwarf::DW_AT_reference); 1379 1380 if (SP.isRValueReference()) 1381 addFlag(SPDie, dwarf::DW_AT_rvalue_reference); 1382 1383 if (SP.isProtected()) 1384 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1385 dwarf::DW_ACCESS_protected); 1386 else if (SP.isPrivate()) 1387 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1388 dwarf::DW_ACCESS_private); 1389 else if (SP.isPublic()) 1390 addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1391 dwarf::DW_ACCESS_public); 1392 1393 if (SP.isExplicit()) 1394 addFlag(SPDie, dwarf::DW_AT_explicit); 1395 } 1396 1397 /// constructSubrangeDIE - Construct subrange DIE from DISubrange. 1398 void DwarfUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy) { 1399 DIE &DW_Subrange = createAndAddDIE(dwarf::DW_TAG_subrange_type, Buffer); 1400 addDIEEntry(DW_Subrange, dwarf::DW_AT_type, *IndexTy); 1401 1402 // The LowerBound value defines the lower bounds which is typically zero for 1403 // C/C++. The Count value is the number of elements. Values are 64 bit. If 1404 // Count == -1 then the array is unbounded and we do not emit 1405 // DW_AT_lower_bound and DW_AT_count attributes. 1406 int64_t LowerBound = SR.getLo(); 1407 int64_t DefaultLowerBound = getDefaultLowerBound(); 1408 int64_t Count = SR.getCount(); 1409 1410 if (DefaultLowerBound == -1 || LowerBound != DefaultLowerBound) 1411 addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, None, LowerBound); 1412 1413 if (Count != -1) 1414 // FIXME: An unbounded array should reference the expression that defines 1415 // the array. 1416 addUInt(DW_Subrange, dwarf::DW_AT_count, None, Count); 1417 } 1418 1419 DIE *DwarfUnit::getIndexTyDie() { 1420 if (IndexTyDie) 1421 return IndexTyDie; 1422 // Construct an integer type to use for indexes. 1423 IndexTyDie = &createAndAddDIE(dwarf::DW_TAG_base_type, UnitDie); 1424 addString(*IndexTyDie, dwarf::DW_AT_name, "sizetype"); 1425 addUInt(*IndexTyDie, dwarf::DW_AT_byte_size, None, sizeof(int64_t)); 1426 addUInt(*IndexTyDie, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, 1427 dwarf::DW_ATE_unsigned); 1428 return IndexTyDie; 1429 } 1430 1431 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 1432 void DwarfUnit::constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy) { 1433 if (CTy.isVector()) 1434 addFlag(Buffer, dwarf::DW_AT_GNU_vector); 1435 1436 // Emit the element type. 1437 addType(Buffer, resolve(CTy.getTypeDerivedFrom())); 1438 1439 // Get an anonymous type for index type. 1440 // FIXME: This type should be passed down from the front end 1441 // as different languages may have different sizes for indexes. 1442 DIE *IdxTy = getIndexTyDie(); 1443 1444 // Add subranges to array type. 1445 DIArray Elements = CTy.getElements(); 1446 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1447 DIDescriptor Element = Elements.getElement(i); 1448 if (Element.getTag() == dwarf::DW_TAG_subrange_type) 1449 constructSubrangeDIE(Buffer, DISubrange(Element), IdxTy); 1450 } 1451 } 1452 1453 /// constructEnumTypeDIE - Construct an enum type DIE from DICompositeType. 1454 void DwarfUnit::constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy) { 1455 DIArray Elements = CTy.getElements(); 1456 1457 // Add enumerators to enumeration type. 1458 for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) { 1459 DIEnumerator Enum(Elements.getElement(i)); 1460 if (Enum.isEnumerator()) { 1461 DIE &Enumerator = createAndAddDIE(dwarf::DW_TAG_enumerator, Buffer); 1462 StringRef Name = Enum.getName(); 1463 addString(Enumerator, dwarf::DW_AT_name, Name); 1464 int64_t Value = Enum.getEnumValue(); 1465 addSInt(Enumerator, dwarf::DW_AT_const_value, dwarf::DW_FORM_sdata, 1466 Value); 1467 } 1468 } 1469 DIType DTy = resolve(CTy.getTypeDerivedFrom()); 1470 if (DTy) { 1471 addType(Buffer, DTy); 1472 addFlag(Buffer, dwarf::DW_AT_enum_class); 1473 } 1474 } 1475 1476 /// constructContainingTypeDIEs - Construct DIEs for types that contain 1477 /// vtables. 1478 void DwarfUnit::constructContainingTypeDIEs() { 1479 for (DenseMap<DIE *, const MDNode *>::iterator CI = ContainingTypeMap.begin(), 1480 CE = ContainingTypeMap.end(); 1481 CI != CE; ++CI) { 1482 DIE &SPDie = *CI->first; 1483 DIDescriptor D(CI->second); 1484 if (!D) 1485 continue; 1486 DIE *NDie = getDIE(D); 1487 if (!NDie) 1488 continue; 1489 addDIEEntry(SPDie, dwarf::DW_AT_containing_type, *NDie); 1490 } 1491 } 1492 1493 /// constructMemberDIE - Construct member DIE from DIDerivedType. 1494 void DwarfUnit::constructMemberDIE(DIE &Buffer, DIDerivedType DT) { 1495 DIE &MemberDie = createAndAddDIE(DT.getTag(), Buffer); 1496 StringRef Name = DT.getName(); 1497 if (!Name.empty()) 1498 addString(MemberDie, dwarf::DW_AT_name, Name); 1499 1500 addType(MemberDie, resolve(DT.getTypeDerivedFrom())); 1501 1502 addSourceLine(MemberDie, DT); 1503 1504 if (DT.getTag() == dwarf::DW_TAG_inheritance && DT.isVirtual()) { 1505 1506 // For C++, virtual base classes are not at fixed offset. Use following 1507 // expression to extract appropriate offset from vtable. 1508 // BaseAddr = ObAddr + *((*ObAddr) - Offset) 1509 1510 DIELoc *VBaseLocationDie = new (DIEValueAllocator) DIELoc(); 1511 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_dup); 1512 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1513 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_constu); 1514 addUInt(*VBaseLocationDie, dwarf::DW_FORM_udata, DT.getOffsetInBits()); 1515 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_minus); 1516 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_deref); 1517 addUInt(*VBaseLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 1518 1519 addBlock(MemberDie, dwarf::DW_AT_data_member_location, VBaseLocationDie); 1520 } else { 1521 uint64_t Size = DT.getSizeInBits(); 1522 uint64_t FieldSize = getBaseTypeSize(DD, DT); 1523 uint64_t OffsetInBytes; 1524 1525 if (Size != FieldSize) { 1526 // Handle bitfield, assume bytes are 8 bits. 1527 addUInt(MemberDie, dwarf::DW_AT_byte_size, None, FieldSize/8); 1528 addUInt(MemberDie, dwarf::DW_AT_bit_size, None, Size); 1529 1530 uint64_t Offset = DT.getOffsetInBits(); 1531 uint64_t AlignMask = ~(DT.getAlignInBits() - 1); 1532 uint64_t HiMark = (Offset + FieldSize) & AlignMask; 1533 uint64_t FieldOffset = (HiMark - FieldSize); 1534 Offset -= FieldOffset; 1535 1536 // Maybe we need to work from the other end. 1537 if (Asm->getDataLayout().isLittleEndian()) 1538 Offset = FieldSize - (Offset + Size); 1539 addUInt(MemberDie, dwarf::DW_AT_bit_offset, None, Offset); 1540 1541 // Here DW_AT_data_member_location points to the anonymous 1542 // field that includes this bit field. 1543 OffsetInBytes = FieldOffset >> 3; 1544 } else 1545 // This is not a bitfield. 1546 OffsetInBytes = DT.getOffsetInBits() >> 3; 1547 1548 if (DD->getDwarfVersion() <= 2) { 1549 DIELoc *MemLocationDie = new (DIEValueAllocator) DIELoc(); 1550 addUInt(*MemLocationDie, dwarf::DW_FORM_data1, dwarf::DW_OP_plus_uconst); 1551 addUInt(*MemLocationDie, dwarf::DW_FORM_udata, OffsetInBytes); 1552 addBlock(MemberDie, dwarf::DW_AT_data_member_location, MemLocationDie); 1553 } else 1554 addUInt(MemberDie, dwarf::DW_AT_data_member_location, None, 1555 OffsetInBytes); 1556 } 1557 1558 if (DT.isProtected()) 1559 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1560 dwarf::DW_ACCESS_protected); 1561 else if (DT.isPrivate()) 1562 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1563 dwarf::DW_ACCESS_private); 1564 // Otherwise C++ member and base classes are considered public. 1565 else if (DT.isPublic()) 1566 addUInt(MemberDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1567 dwarf::DW_ACCESS_public); 1568 if (DT.isVirtual()) 1569 addUInt(MemberDie, dwarf::DW_AT_virtuality, dwarf::DW_FORM_data1, 1570 dwarf::DW_VIRTUALITY_virtual); 1571 1572 // Objective-C properties. 1573 if (MDNode *PNode = DT.getObjCProperty()) 1574 if (DIEEntry *PropertyDie = getDIEEntry(PNode)) 1575 MemberDie.addValue(dwarf::DW_AT_APPLE_property, dwarf::DW_FORM_ref4, 1576 PropertyDie); 1577 1578 if (DT.isArtificial()) 1579 addFlag(MemberDie, dwarf::DW_AT_artificial); 1580 } 1581 1582 /// getOrCreateStaticMemberDIE - Create new DIE for C++ static member. 1583 DIE *DwarfUnit::getOrCreateStaticMemberDIE(DIDerivedType DT) { 1584 if (!DT.Verify()) 1585 return nullptr; 1586 1587 // Construct the context before querying for the existence of the DIE in case 1588 // such construction creates the DIE. 1589 DIE *ContextDIE = getOrCreateContextDIE(resolve(DT.getContext())); 1590 assert(dwarf::isType(ContextDIE->getTag()) && 1591 "Static member should belong to a type."); 1592 1593 if (DIE *StaticMemberDIE = getDIE(DT)) 1594 return StaticMemberDIE; 1595 1596 DIE &StaticMemberDIE = createAndAddDIE(DT.getTag(), *ContextDIE, DT); 1597 1598 DIType Ty = resolve(DT.getTypeDerivedFrom()); 1599 1600 addString(StaticMemberDIE, dwarf::DW_AT_name, DT.getName()); 1601 addType(StaticMemberDIE, Ty); 1602 addSourceLine(StaticMemberDIE, DT); 1603 addFlag(StaticMemberDIE, dwarf::DW_AT_external); 1604 addFlag(StaticMemberDIE, dwarf::DW_AT_declaration); 1605 1606 // FIXME: We could omit private if the parent is a class_type, and 1607 // public if the parent is something else. 1608 if (DT.isProtected()) 1609 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1610 dwarf::DW_ACCESS_protected); 1611 else if (DT.isPrivate()) 1612 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1613 dwarf::DW_ACCESS_private); 1614 else if (DT.isPublic()) 1615 addUInt(StaticMemberDIE, dwarf::DW_AT_accessibility, dwarf::DW_FORM_data1, 1616 dwarf::DW_ACCESS_public); 1617 1618 if (const ConstantInt *CI = dyn_cast_or_null<ConstantInt>(DT.getConstant())) 1619 addConstantValue(StaticMemberDIE, CI, Ty); 1620 if (const ConstantFP *CFP = dyn_cast_or_null<ConstantFP>(DT.getConstant())) 1621 addConstantFPValue(StaticMemberDIE, CFP); 1622 1623 return &StaticMemberDIE; 1624 } 1625 1626 void DwarfUnit::emitHeader(const MCSymbol *ASectionSym) const { 1627 // Emit size of content not including length itself 1628 Asm->OutStreamer.AddComment("Length of Unit"); 1629 Asm->EmitInt32(getHeaderSize() + UnitDie.getSize()); 1630 1631 Asm->OutStreamer.AddComment("DWARF version number"); 1632 Asm->EmitInt16(DD->getDwarfVersion()); 1633 Asm->OutStreamer.AddComment("Offset Into Abbrev. Section"); 1634 // We share one abbreviations table across all units so it's always at the 1635 // start of the section. Use a relocatable offset where needed to ensure 1636 // linking doesn't invalidate that offset. 1637 if (ASectionSym) 1638 Asm->EmitSectionOffset(ASectionSym, ASectionSym); 1639 else 1640 // Use a constant value when no symbol is provided. 1641 Asm->EmitInt32(0); 1642 Asm->OutStreamer.AddComment("Address Size (in bytes)"); 1643 Asm->EmitInt8(Asm->getDataLayout().getPointerSize()); 1644 } 1645 1646 void DwarfUnit::initSection(const MCSection *Section) { 1647 assert(!this->Section); 1648 this->Section = Section; 1649 } 1650 1651 void DwarfTypeUnit::emitHeader(const MCSymbol *ASectionSym) const { 1652 DwarfUnit::emitHeader(ASectionSym); 1653 Asm->OutStreamer.AddComment("Type Signature"); 1654 Asm->OutStreamer.EmitIntValue(TypeSignature, sizeof(TypeSignature)); 1655 Asm->OutStreamer.AddComment("Type DIE Offset"); 1656 // In a skeleton type unit there is no type DIE so emit a zero offset. 1657 Asm->OutStreamer.EmitIntValue(Ty ? Ty->getOffset() : 0, 1658 sizeof(Ty->getOffset())); 1659 } 1660 1661 bool DwarfTypeUnit::isDwoUnit() const { 1662 // Since there are no skeleton type units, all type units are dwo type units 1663 // when split DWARF is being used. 1664 return DD->useSplitDwarf(); 1665 } 1666