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