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