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