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