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