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