1 //===- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf 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 "DwarfCompileUnit.h" 15 #include "AddressPool.h" 16 #include "DwarfDebug.h" 17 #include "DwarfExpression.h" 18 #include "DwarfUnit.h" 19 #include "llvm/ADT/None.h" 20 #include "llvm/ADT/STLExtras.h" 21 #include "llvm/ADT/SmallVector.h" 22 #include "llvm/ADT/StringRef.h" 23 #include "llvm/BinaryFormat/Dwarf.h" 24 #include "llvm/CodeGen/AsmPrinter.h" 25 #include "llvm/CodeGen/DIE.h" 26 #include "llvm/CodeGen/LexicalScopes.h" 27 #include "llvm/CodeGen/MachineFunction.h" 28 #include "llvm/CodeGen/MachineInstr.h" 29 #include "llvm/CodeGen/MachineOperand.h" 30 #include "llvm/CodeGen/TargetFrameLowering.h" 31 #include "llvm/CodeGen/TargetRegisterInfo.h" 32 #include "llvm/CodeGen/TargetSubtargetInfo.h" 33 #include "llvm/IR/DataLayout.h" 34 #include "llvm/IR/DebugInfo.h" 35 #include "llvm/IR/DebugInfoMetadata.h" 36 #include "llvm/IR/GlobalVariable.h" 37 #include "llvm/MC/MCSection.h" 38 #include "llvm/MC/MCStreamer.h" 39 #include "llvm/MC/MCSymbol.h" 40 #include "llvm/MC/MachineLocation.h" 41 #include "llvm/Support/Casting.h" 42 #include "llvm/Target/TargetLoweringObjectFile.h" 43 #include "llvm/Target/TargetMachine.h" 44 #include "llvm/Target/TargetOptions.h" 45 #include <algorithm> 46 #include <cassert> 47 #include <cstdint> 48 #include <iterator> 49 #include <memory> 50 #include <string> 51 #include <utility> 52 53 using namespace llvm; 54 55 DwarfCompileUnit::DwarfCompileUnit(unsigned UID, const DICompileUnit *Node, 56 AsmPrinter *A, DwarfDebug *DW, 57 DwarfFile *DWU) 58 : DwarfUnit(dwarf::DW_TAG_compile_unit, Node, A, DW, DWU), UniqueID(UID) { 59 insertDIE(Node, &getUnitDie()); 60 MacroLabelBegin = Asm->createTempSymbol("cu_macro_begin"); 61 } 62 63 /// addLabelAddress - Add a dwarf label attribute data and value using 64 /// DW_FORM_addr or DW_FORM_GNU_addr_index. 65 void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute, 66 const MCSymbol *Label) { 67 // Don't use the address pool in non-fission or in the skeleton unit itself. 68 // FIXME: Once GDB supports this, it's probably worthwhile using the address 69 // pool from the skeleton - maybe even in non-fission (possibly fewer 70 // relocations by sharing them in the pool, but we have other ideas about how 71 // to reduce the number of relocations as well/instead). 72 if (!DD->useSplitDwarf() || !Skeleton) 73 return addLocalLabelAddress(Die, Attribute, Label); 74 75 if (Label) 76 DD->addArangeLabel(SymbolCU(this, Label)); 77 78 unsigned idx = DD->getAddressPool().getIndex(Label); 79 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_GNU_addr_index, 80 DIEInteger(idx)); 81 } 82 83 void DwarfCompileUnit::addLocalLabelAddress(DIE &Die, 84 dwarf::Attribute Attribute, 85 const MCSymbol *Label) { 86 if (Label) 87 DD->addArangeLabel(SymbolCU(this, Label)); 88 89 if (Label) 90 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr, 91 DIELabel(Label)); 92 else 93 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr, 94 DIEInteger(0)); 95 } 96 97 unsigned DwarfCompileUnit::getOrCreateSourceID(const DIFile *File) { 98 // If we print assembly, we can't separate .file entries according to 99 // compile units. Thus all files will belong to the default compile unit. 100 101 // FIXME: add a better feature test than hasRawTextSupport. Even better, 102 // extend .file to support this. 103 unsigned CUID = Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID(); 104 if (!File) 105 return Asm->OutStreamer->EmitDwarfFileDirective(0, "", "", nullptr, None, CUID); 106 return Asm->OutStreamer->EmitDwarfFileDirective( 107 0, File->getDirectory(), File->getFilename(), getMD5AsBytes(File), 108 File->getSource(), CUID); 109 } 110 111 DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE( 112 const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) { 113 // Check for pre-existence. 114 if (DIE *Die = getDIE(GV)) 115 return Die; 116 117 assert(GV); 118 119 auto *GVContext = GV->getScope(); 120 auto *GTy = DD->resolve(GV->getType()); 121 122 // Construct the context before querying for the existence of the DIE in 123 // case such construction creates the DIE. 124 DIE *ContextDIE = getOrCreateContextDIE(GVContext); 125 126 // Add to map. 127 DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV); 128 DIScope *DeclContext; 129 if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) { 130 DeclContext = resolve(SDMDecl->getScope()); 131 assert(SDMDecl->isStaticMember() && "Expected static member decl"); 132 assert(GV->isDefinition()); 133 // We need the declaration DIE that is in the static member's class. 134 DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl); 135 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE); 136 // If the global variable's type is different from the one in the class 137 // member type, assume that it's more specific and also emit it. 138 if (GTy != DD->resolve(SDMDecl->getBaseType())) 139 addType(*VariableDIE, GTy); 140 } else { 141 DeclContext = GV->getScope(); 142 // Add name and type. 143 addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName()); 144 addType(*VariableDIE, GTy); 145 146 // Add scoping info. 147 if (!GV->isLocalToUnit()) 148 addFlag(*VariableDIE, dwarf::DW_AT_external); 149 150 // Add line number info. 151 addSourceLine(*VariableDIE, GV); 152 } 153 154 if (!GV->isDefinition()) 155 addFlag(*VariableDIE, dwarf::DW_AT_declaration); 156 else 157 addGlobalName(GV->getName(), *VariableDIE, DeclContext); 158 159 if (uint32_t AlignInBytes = GV->getAlignInBytes()) 160 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, 161 AlignInBytes); 162 163 if (MDTuple *TP = GV->getTemplateParams()) 164 addTemplateParams(*VariableDIE, DINodeArray(TP)); 165 166 // Add location. 167 bool addToAccelTable = false; 168 DIELoc *Loc = nullptr; 169 std::unique_ptr<DIEDwarfExpression> DwarfExpr; 170 for (const auto &GE : GlobalExprs) { 171 const GlobalVariable *Global = GE.Var; 172 const DIExpression *Expr = GE.Expr; 173 174 // For compatibility with DWARF 3 and earlier, 175 // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) becomes 176 // DW_AT_const_value(X). 177 if (GlobalExprs.size() == 1 && Expr && Expr->isConstant()) { 178 addToAccelTable = true; 179 addConstantValue(*VariableDIE, /*Unsigned=*/true, Expr->getElement(1)); 180 break; 181 } 182 183 // We cannot describe the location of dllimport'd variables: the 184 // computation of their address requires loads from the IAT. 185 if (Global && Global->hasDLLImportStorageClass()) 186 continue; 187 188 // Nothing to describe without address or constant. 189 if (!Global && (!Expr || !Expr->isConstant())) 190 continue; 191 192 if (Global && Global->isThreadLocal() && 193 !Asm->getObjFileLowering().supportDebugThreadLocalLocation()) 194 continue; 195 196 if (!Loc) { 197 addToAccelTable = true; 198 Loc = new (DIEValueAllocator) DIELoc; 199 DwarfExpr = llvm::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc); 200 } 201 202 if (Expr) 203 DwarfExpr->addFragmentOffset(Expr); 204 205 if (Global) { 206 const MCSymbol *Sym = Asm->getSymbol(Global); 207 if (Global->isThreadLocal()) { 208 if (Asm->TM.useEmulatedTLS()) { 209 // TODO: add debug info for emulated thread local mode. 210 } else { 211 // FIXME: Make this work with -gsplit-dwarf. 212 unsigned PointerSize = Asm->getDataLayout().getPointerSize(); 213 assert((PointerSize == 4 || PointerSize == 8) && 214 "Add support for other sizes if necessary"); 215 // Based on GCC's support for TLS: 216 if (!DD->useSplitDwarf()) { 217 // 1) Start with a constNu of the appropriate pointer size 218 addUInt(*Loc, dwarf::DW_FORM_data1, 219 PointerSize == 4 ? dwarf::DW_OP_const4u 220 : dwarf::DW_OP_const8u); 221 // 2) containing the (relocated) offset of the TLS variable 222 // within the module's TLS block. 223 addExpr(*Loc, dwarf::DW_FORM_udata, 224 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym)); 225 } else { 226 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index); 227 addUInt(*Loc, dwarf::DW_FORM_udata, 228 DD->getAddressPool().getIndex(Sym, /* TLS */ true)); 229 } 230 // 3) followed by an OP to make the debugger do a TLS lookup. 231 addUInt(*Loc, dwarf::DW_FORM_data1, 232 DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address 233 : dwarf::DW_OP_form_tls_address); 234 } 235 } else { 236 DD->addArangeLabel(SymbolCU(this, Sym)); 237 addOpAddress(*Loc, Sym); 238 } 239 } 240 // Global variables attached to symbols are memory locations. 241 // It would be better if this were unconditional, but malformed input that 242 // mixes non-fragments and fragments for the same variable is too expensive 243 // to detect in the verifier. 244 if (DwarfExpr->isUnknownLocation()) 245 DwarfExpr->setMemoryLocationKind(); 246 DwarfExpr->addExpression(Expr); 247 } 248 if (Loc) 249 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize()); 250 251 if (DD->useAllLinkageNames()) 252 addLinkageName(*VariableDIE, GV->getLinkageName()); 253 254 if (addToAccelTable) { 255 DD->addAccelName(*CUNode, GV->getName(), *VariableDIE); 256 257 // If the linkage name is different than the name, go ahead and output 258 // that as well into the name table. 259 if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName() && 260 DD->useAllLinkageNames()) 261 DD->addAccelName(*CUNode, GV->getLinkageName(), *VariableDIE); 262 } 263 264 return VariableDIE; 265 } 266 267 void DwarfCompileUnit::addRange(RangeSpan Range) { 268 bool SameAsPrevCU = this == DD->getPrevCU(); 269 DD->setPrevCU(this); 270 // If we have no current ranges just add the range and return, otherwise, 271 // check the current section and CU against the previous section and CU we 272 // emitted into and the subprogram was contained within. If these are the 273 // same then extend our current range, otherwise add this as a new range. 274 if (CURanges.empty() || !SameAsPrevCU || 275 (&CURanges.back().getEnd()->getSection() != 276 &Range.getEnd()->getSection())) { 277 CURanges.push_back(Range); 278 return; 279 } 280 281 CURanges.back().setEnd(Range.getEnd()); 282 } 283 284 void DwarfCompileUnit::initStmtList() { 285 if (CUNode->isDebugDirectivesOnly()) 286 return; 287 288 // Define start line table label for each Compile Unit. 289 MCSymbol *LineTableStartSym; 290 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 291 if (DD->useSectionsAsReferences()) { 292 LineTableStartSym = TLOF.getDwarfLineSection()->getBeginSymbol(); 293 } else { 294 LineTableStartSym = 295 Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID()); 296 } 297 298 // DW_AT_stmt_list is a offset of line number information for this 299 // compile unit in debug_line section. For split dwarf this is 300 // left in the skeleton CU and so not included. 301 // The line table entries are not always emitted in assembly, so it 302 // is not okay to use line_table_start here. 303 StmtListValue = 304 addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym, 305 TLOF.getDwarfLineSection()->getBeginSymbol()); 306 } 307 308 void DwarfCompileUnit::applyStmtList(DIE &D) { 309 D.addValue(DIEValueAllocator, *StmtListValue); 310 } 311 312 void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin, 313 const MCSymbol *End) { 314 assert(Begin && "Begin label should not be null!"); 315 assert(End && "End label should not be null!"); 316 assert(Begin->isDefined() && "Invalid starting label"); 317 assert(End->isDefined() && "Invalid end label"); 318 319 addLabelAddress(D, dwarf::DW_AT_low_pc, Begin); 320 if (DD->getDwarfVersion() < 4) 321 addLabelAddress(D, dwarf::DW_AT_high_pc, End); 322 else 323 addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin); 324 } 325 326 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc 327 // and DW_AT_high_pc attributes. If there are global variables in this 328 // scope then create and insert DIEs for these variables. 329 DIE &DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram *SP) { 330 DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes()); 331 332 attachLowHighPC(*SPDie, Asm->getFunctionBegin(), Asm->getFunctionEnd()); 333 if (DD->useAppleExtensionAttributes() && 334 !DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim( 335 *DD->getCurrentFunction())) 336 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr); 337 338 // Only include DW_AT_frame_base in full debug info 339 if (!includeMinimalInlineScopes()) { 340 if (Asm->MF->getTarget().getTargetTriple().isNVPTX()) { 341 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 342 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa); 343 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc); 344 } else { 345 const TargetRegisterInfo *RI = Asm->MF->getSubtarget().getRegisterInfo(); 346 MachineLocation Location(RI->getFrameRegister(*Asm->MF)); 347 if (RI->isPhysicalRegister(Location.getReg())) 348 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location); 349 } 350 } 351 352 // Add name to the name table, we do this here because we're guaranteed 353 // to have concrete versions of our DW_TAG_subprogram nodes. 354 DD->addSubprogramNames(*CUNode, SP, *SPDie); 355 356 return *SPDie; 357 } 358 359 // Construct a DIE for this scope. 360 void DwarfCompileUnit::constructScopeDIE( 361 LexicalScope *Scope, SmallVectorImpl<DIE *> &FinalChildren) { 362 if (!Scope || !Scope->getScopeNode()) 363 return; 364 365 auto *DS = Scope->getScopeNode(); 366 367 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) && 368 "Only handle inlined subprograms here, use " 369 "constructSubprogramScopeDIE for non-inlined " 370 "subprograms"); 371 372 SmallVector<DIE *, 8> Children; 373 374 // We try to create the scope DIE first, then the children DIEs. This will 375 // avoid creating un-used children then removing them later when we find out 376 // the scope DIE is null. 377 DIE *ScopeDIE; 378 if (Scope->getParent() && isa<DISubprogram>(DS)) { 379 ScopeDIE = constructInlinedScopeDIE(Scope); 380 if (!ScopeDIE) 381 return; 382 // We create children when the scope DIE is not null. 383 createScopeChildrenDIE(Scope, Children); 384 } else { 385 // Early exit when we know the scope DIE is going to be null. 386 if (DD->isLexicalScopeDIENull(Scope)) 387 return; 388 389 bool HasNonScopeChildren = false; 390 391 // We create children here when we know the scope DIE is not going to be 392 // null and the children will be added to the scope DIE. 393 createScopeChildrenDIE(Scope, Children, &HasNonScopeChildren); 394 395 // If there are only other scopes as children, put them directly in the 396 // parent instead, as this scope would serve no purpose. 397 if (!HasNonScopeChildren) { 398 FinalChildren.insert(FinalChildren.end(), 399 std::make_move_iterator(Children.begin()), 400 std::make_move_iterator(Children.end())); 401 return; 402 } 403 ScopeDIE = constructLexicalScopeDIE(Scope); 404 assert(ScopeDIE && "Scope DIE should not be null."); 405 } 406 407 // Add children 408 for (auto &I : Children) 409 ScopeDIE->addChild(std::move(I)); 410 411 FinalChildren.push_back(std::move(ScopeDIE)); 412 } 413 414 void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE, 415 SmallVector<RangeSpan, 2> Range) { 416 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 417 418 // Emit the offset into .debug_ranges or .debug_rnglists as a relocatable 419 // label. emitDIE() will handle emitting it appropriately. 420 const MCSymbol *RangeSectionSym = 421 DD->getDwarfVersion() >= 5 422 ? TLOF.getDwarfRnglistsSection()->getBeginSymbol() 423 : TLOF.getDwarfRangesSection()->getBeginSymbol(); 424 425 RangeSpanList List(Asm->createTempSymbol("debug_ranges"), std::move(Range)); 426 427 // Under fission, ranges are specified by constant offsets relative to the 428 // CU's DW_AT_GNU_ranges_base. 429 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under 430 // fission until we support the forms using the .debug_addr section 431 // (DW_RLE_startx_endx etc.). 432 if (isDwoUnit()) { 433 if (DD->getDwarfVersion() < 5) 434 addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.getSym(), 435 RangeSectionSym); 436 } else { 437 addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.getSym(), 438 RangeSectionSym); 439 } 440 441 // Add the range list to the set of ranges to be emitted. 442 (Skeleton ? Skeleton : this)->CURangeLists.push_back(std::move(List)); 443 } 444 445 void DwarfCompileUnit::attachRangesOrLowHighPC( 446 DIE &Die, SmallVector<RangeSpan, 2> Ranges) { 447 if (Ranges.size() == 1 || !DD->useRangesSection()) { 448 const RangeSpan &Front = Ranges.front(); 449 const RangeSpan &Back = Ranges.back(); 450 attachLowHighPC(Die, Front.getStart(), Back.getEnd()); 451 } else 452 addScopeRangeList(Die, std::move(Ranges)); 453 } 454 455 void DwarfCompileUnit::attachRangesOrLowHighPC( 456 DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) { 457 SmallVector<RangeSpan, 2> List; 458 List.reserve(Ranges.size()); 459 for (const InsnRange &R : Ranges) 460 List.push_back(RangeSpan(DD->getLabelBeforeInsn(R.first), 461 DD->getLabelAfterInsn(R.second))); 462 attachRangesOrLowHighPC(Die, std::move(List)); 463 } 464 465 // This scope represents inlined body of a function. Construct DIE to 466 // represent this concrete inlined copy of the function. 467 DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope) { 468 assert(Scope->getScopeNode()); 469 auto *DS = Scope->getScopeNode(); 470 auto *InlinedSP = getDISubprogram(DS); 471 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram 472 // was inlined from another compile unit. 473 DIE *OriginDIE = getAbstractSPDies()[InlinedSP]; 474 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram."); 475 476 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine); 477 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE); 478 479 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); 480 481 // Add the call site information to the DIE. 482 const DILocation *IA = Scope->getInlinedAt(); 483 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None, 484 getOrCreateSourceID(IA->getFile())); 485 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, IA->getLine()); 486 if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4) 487 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, None, 488 IA->getDiscriminator()); 489 490 // Add name to the name table, we do this here because we're guaranteed 491 // to have concrete versions of our DW_TAG_inlined_subprogram nodes. 492 DD->addSubprogramNames(*CUNode, InlinedSP, *ScopeDIE); 493 494 return ScopeDIE; 495 } 496 497 // Construct new DW_TAG_lexical_block for this scope and attach 498 // DW_AT_low_pc/DW_AT_high_pc labels. 499 DIE *DwarfCompileUnit::constructLexicalScopeDIE(LexicalScope *Scope) { 500 if (DD->isLexicalScopeDIENull(Scope)) 501 return nullptr; 502 503 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block); 504 if (Scope->isAbstractScope()) 505 return ScopeDIE; 506 507 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); 508 509 return ScopeDIE; 510 } 511 512 /// constructVariableDIE - Construct a DIE for the given DbgVariable. 513 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, bool Abstract) { 514 auto D = constructVariableDIEImpl(DV, Abstract); 515 DV.setDIE(*D); 516 return D; 517 } 518 519 DIE *DwarfCompileUnit::constructLabelDIE(DbgLabel &DL, 520 const LexicalScope &Scope) { 521 auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag()); 522 insertDIE(DL.getLabel(), LabelDie); 523 DL.setDIE(*LabelDie); 524 525 if (Scope.isAbstractScope()) 526 applyLabelAttributes(DL, *LabelDie); 527 528 return LabelDie; 529 } 530 531 DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV, 532 bool Abstract) { 533 // Define variable debug information entry. 534 auto VariableDie = DIE::get(DIEValueAllocator, DV.getTag()); 535 insertDIE(DV.getVariable(), VariableDie); 536 537 if (Abstract) { 538 applyVariableAttributes(DV, *VariableDie); 539 return VariableDie; 540 } 541 542 // Add variable address. 543 544 unsigned Offset = DV.getDebugLocListIndex(); 545 if (Offset != ~0U) { 546 addLocationList(*VariableDie, dwarf::DW_AT_location, Offset); 547 return VariableDie; 548 } 549 550 // Check if variable is described by a DBG_VALUE instruction. 551 if (const MachineInstr *DVInsn = DV.getMInsn()) { 552 assert(DVInsn->getNumOperands() == 4); 553 if (DVInsn->getOperand(0).isReg()) { 554 auto RegOp = DVInsn->getOperand(0); 555 auto Op1 = DVInsn->getOperand(1); 556 // If the second operand is an immediate, this is an indirect value. 557 assert((!Op1.isImm() || (Op1.getImm() == 0)) && "unexpected offset"); 558 MachineLocation Location(RegOp.getReg(), Op1.isImm()); 559 addVariableAddress(DV, *VariableDie, Location); 560 } else if (DVInsn->getOperand(0).isImm()) { 561 // This variable is described by a single constant. 562 // Check whether it has a DIExpression. 563 auto *Expr = DV.getSingleExpression(); 564 if (Expr && Expr->getNumElements()) { 565 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 566 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 567 // If there is an expression, emit raw unsigned bytes. 568 DwarfExpr.addFragmentOffset(Expr); 569 DwarfExpr.addUnsignedConstant(DVInsn->getOperand(0).getImm()); 570 DwarfExpr.addExpression(Expr); 571 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 572 } else 573 addConstantValue(*VariableDie, DVInsn->getOperand(0), DV.getType()); 574 } else if (DVInsn->getOperand(0).isFPImm()) 575 addConstantFPValue(*VariableDie, DVInsn->getOperand(0)); 576 else if (DVInsn->getOperand(0).isCImm()) 577 addConstantValue(*VariableDie, DVInsn->getOperand(0).getCImm(), 578 DV.getType()); 579 580 return VariableDie; 581 } 582 583 // .. else use frame index. 584 if (!DV.hasFrameIndexExprs()) 585 return VariableDie; 586 587 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 588 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 589 for (auto &Fragment : DV.getFrameIndexExprs()) { 590 unsigned FrameReg = 0; 591 const DIExpression *Expr = Fragment.Expr; 592 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering(); 593 int Offset = TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg); 594 DwarfExpr.addFragmentOffset(Expr); 595 SmallVector<uint64_t, 8> Ops; 596 Ops.push_back(dwarf::DW_OP_plus_uconst); 597 Ops.push_back(Offset); 598 Ops.append(Expr->elements_begin(), Expr->elements_end()); 599 DIExpressionCursor Cursor(Ops); 600 DwarfExpr.setMemoryLocationKind(); 601 if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol()) 602 addOpAddress(*Loc, FrameSymbol); 603 else 604 DwarfExpr.addMachineRegExpression( 605 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg); 606 DwarfExpr.addExpression(std::move(Cursor)); 607 } 608 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 609 610 return VariableDie; 611 } 612 613 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, 614 const LexicalScope &Scope, 615 DIE *&ObjectPointer) { 616 auto Var = constructVariableDIE(DV, Scope.isAbstractScope()); 617 if (DV.isObjectPointer()) 618 ObjectPointer = Var; 619 return Var; 620 } 621 622 /// Return all DIVariables that appear in count: expressions. 623 static SmallVector<const DIVariable *, 2> dependencies(DbgVariable *Var) { 624 SmallVector<const DIVariable *, 2> Result; 625 auto *Array = dyn_cast<DICompositeType>(Var->getType()); 626 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type) 627 return Result; 628 for (auto *El : Array->getElements()) { 629 if (auto *Subrange = dyn_cast<DISubrange>(El)) { 630 auto Count = Subrange->getCount(); 631 if (auto *Dependency = Count.dyn_cast<DIVariable *>()) 632 Result.push_back(Dependency); 633 } 634 } 635 return Result; 636 } 637 638 /// Sort local variables so that variables appearing inside of helper 639 /// expressions come first. 640 static SmallVector<DbgVariable *, 8> 641 sortLocalVars(SmallVectorImpl<DbgVariable *> &Input) { 642 SmallVector<DbgVariable *, 8> Result; 643 SmallVector<PointerIntPair<DbgVariable *, 1>, 8> WorkList; 644 // Map back from a DIVariable to its containing DbgVariable. 645 SmallDenseMap<const DILocalVariable *, DbgVariable *> DbgVar; 646 // Set of DbgVariables in Result. 647 SmallDenseSet<DbgVariable *, 8> Visited; 648 // For cycle detection. 649 SmallDenseSet<DbgVariable *, 8> Visiting; 650 651 // Initialize the worklist and the DIVariable lookup table. 652 for (auto Var : reverse(Input)) { 653 DbgVar.insert({Var->getVariable(), Var}); 654 WorkList.push_back({Var, 0}); 655 } 656 657 // Perform a stable topological sort by doing a DFS. 658 while (!WorkList.empty()) { 659 auto Item = WorkList.back(); 660 DbgVariable *Var = Item.getPointer(); 661 bool visitedAllDependencies = Item.getInt(); 662 WorkList.pop_back(); 663 664 // Dependency is in a different lexical scope or a global. 665 if (!Var) 666 continue; 667 668 // Already handled. 669 if (Visited.count(Var)) 670 continue; 671 672 // Add to Result if all dependencies are visited. 673 if (visitedAllDependencies) { 674 Visited.insert(Var); 675 Result.push_back(Var); 676 continue; 677 } 678 679 // Detect cycles. 680 auto Res = Visiting.insert(Var); 681 if (!Res.second) { 682 assert(false && "dependency cycle in local variables"); 683 return Result; 684 } 685 686 // Push dependencies and this node onto the worklist, so that this node is 687 // visited again after all of its dependencies are handled. 688 WorkList.push_back({Var, 1}); 689 for (auto *Dependency : dependencies(Var)) { 690 auto Dep = dyn_cast_or_null<const DILocalVariable>(Dependency); 691 WorkList.push_back({DbgVar[Dep], 0}); 692 } 693 } 694 return Result; 695 } 696 697 DIE *DwarfCompileUnit::createScopeChildrenDIE(LexicalScope *Scope, 698 SmallVectorImpl<DIE *> &Children, 699 bool *HasNonScopeChildren) { 700 assert(Children.empty()); 701 DIE *ObjectPointer = nullptr; 702 703 // Emit function arguments (order is significant). 704 auto Vars = DU->getScopeVariables().lookup(Scope); 705 for (auto &DV : Vars.Args) 706 Children.push_back(constructVariableDIE(*DV.second, *Scope, ObjectPointer)); 707 708 // Emit local variables. 709 auto Locals = sortLocalVars(Vars.Locals); 710 for (DbgVariable *DV : Locals) 711 Children.push_back(constructVariableDIE(*DV, *Scope, ObjectPointer)); 712 713 // Skip imported directives in gmlt-like data. 714 if (!includeMinimalInlineScopes()) { 715 // There is no need to emit empty lexical block DIE. 716 for (const auto *IE : ImportedEntities[Scope->getScopeNode()]) 717 Children.push_back( 718 constructImportedEntityDIE(cast<DIImportedEntity>(IE))); 719 } 720 721 if (HasNonScopeChildren) 722 *HasNonScopeChildren = !Children.empty(); 723 724 for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope)) 725 Children.push_back(constructLabelDIE(*DL, *Scope)); 726 727 for (LexicalScope *LS : Scope->getChildren()) 728 constructScopeDIE(LS, Children); 729 730 return ObjectPointer; 731 } 732 733 DIE &DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub, 734 LexicalScope *Scope) { 735 DIE &ScopeDIE = updateSubprogramScopeDIE(Sub); 736 737 if (Scope) { 738 assert(!Scope->getInlinedAt()); 739 assert(!Scope->isAbstractScope()); 740 // Collect lexical scope children first. 741 // ObjectPointer might be a local (non-argument) local variable if it's a 742 // block's synthetic this pointer. 743 if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE)) 744 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer); 745 } 746 747 // If this is a variadic function, add an unspecified parameter. 748 DITypeRefArray FnArgs = Sub->getType()->getTypeArray(); 749 750 // If we have a single element of null, it is a function that returns void. 751 // If we have more than one elements and the last one is null, it is a 752 // variadic function. 753 if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] && 754 !includeMinimalInlineScopes()) 755 ScopeDIE.addChild( 756 DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters)); 757 758 return ScopeDIE; 759 } 760 761 DIE *DwarfCompileUnit::createAndAddScopeChildren(LexicalScope *Scope, 762 DIE &ScopeDIE) { 763 // We create children when the scope DIE is not null. 764 SmallVector<DIE *, 8> Children; 765 DIE *ObjectPointer = createScopeChildrenDIE(Scope, Children); 766 767 // Add children 768 for (auto &I : Children) 769 ScopeDIE.addChild(std::move(I)); 770 771 return ObjectPointer; 772 } 773 774 void DwarfCompileUnit::constructAbstractSubprogramScopeDIE( 775 LexicalScope *Scope) { 776 DIE *&AbsDef = getAbstractSPDies()[Scope->getScopeNode()]; 777 if (AbsDef) 778 return; 779 780 auto *SP = cast<DISubprogram>(Scope->getScopeNode()); 781 782 DIE *ContextDIE; 783 DwarfCompileUnit *ContextCU = this; 784 785 if (includeMinimalInlineScopes()) 786 ContextDIE = &getUnitDie(); 787 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with 788 // the important distinction that the debug node is not associated with the 789 // DIE (since the debug node will be associated with the concrete DIE, if 790 // any). It could be refactored to some common utility function. 791 else if (auto *SPDecl = SP->getDeclaration()) { 792 ContextDIE = &getUnitDie(); 793 getOrCreateSubprogramDIE(SPDecl); 794 } else { 795 ContextDIE = getOrCreateContextDIE(resolve(SP->getScope())); 796 // The scope may be shared with a subprogram that has already been 797 // constructed in another CU, in which case we need to construct this 798 // subprogram in the same CU. 799 ContextCU = DD->lookupCU(ContextDIE->getUnitDie()); 800 } 801 802 // Passing null as the associated node because the abstract definition 803 // shouldn't be found by lookup. 804 AbsDef = &ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr); 805 ContextCU->applySubprogramAttributesToDefinition(SP, *AbsDef); 806 807 if (!ContextCU->includeMinimalInlineScopes()) 808 ContextCU->addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); 809 if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef)) 810 ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); 811 } 812 813 DIE &DwarfCompileUnit::constructCallSiteEntryDIE(DIE &ScopeDIE, 814 const DISubprogram &CalleeSP, 815 bool IsTail, 816 const MCSymbol *ReturnPC) { 817 // Insert a call site entry DIE within ScopeDIE. 818 DIE &CallSiteDIE = 819 createAndAddDIE(dwarf::DW_TAG_call_site, ScopeDIE, nullptr); 820 821 // For the purposes of showing tail call frames in backtraces, a key piece of 822 // information is DW_AT_call_origin, a pointer to the callee DIE. 823 DIE *CalleeDIE = getOrCreateSubprogramDIE(&CalleeSP); 824 assert(CalleeDIE && "Could not create DIE for call site entry origin"); 825 addDIEEntry(CallSiteDIE, dwarf::DW_AT_call_origin, *CalleeDIE); 826 827 if (IsTail) { 828 // Attach DW_AT_call_tail_call to tail calls for standards compliance. 829 addFlag(CallSiteDIE, dwarf::DW_AT_call_tail_call); 830 } else { 831 // Attach the return PC to allow the debugger to disambiguate call paths 832 // from one function to another. 833 assert(ReturnPC && "Missing return PC information for a call"); 834 addLabelAddress(CallSiteDIE, dwarf::DW_AT_call_return_pc, ReturnPC); 835 } 836 return CallSiteDIE; 837 } 838 839 DIE *DwarfCompileUnit::constructImportedEntityDIE( 840 const DIImportedEntity *Module) { 841 DIE *IMDie = DIE::get(DIEValueAllocator, (dwarf::Tag)Module->getTag()); 842 insertDIE(Module, IMDie); 843 DIE *EntityDie; 844 auto *Entity = resolve(Module->getEntity()); 845 if (auto *NS = dyn_cast<DINamespace>(Entity)) 846 EntityDie = getOrCreateNameSpace(NS); 847 else if (auto *M = dyn_cast<DIModule>(Entity)) 848 EntityDie = getOrCreateModule(M); 849 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) 850 EntityDie = getOrCreateSubprogramDIE(SP); 851 else if (auto *T = dyn_cast<DIType>(Entity)) 852 EntityDie = getOrCreateTypeDIE(T); 853 else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity)) 854 EntityDie = getOrCreateGlobalVariableDIE(GV, {}); 855 else 856 EntityDie = getDIE(Entity); 857 assert(EntityDie); 858 addSourceLine(*IMDie, Module->getLine(), Module->getFile()); 859 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie); 860 StringRef Name = Module->getName(); 861 if (!Name.empty()) 862 addString(*IMDie, dwarf::DW_AT_name, Name); 863 864 return IMDie; 865 } 866 867 void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram *SP) { 868 DIE *D = getDIE(SP); 869 if (DIE *AbsSPDIE = getAbstractSPDies().lookup(SP)) { 870 if (D) 871 // If this subprogram has an abstract definition, reference that 872 addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE); 873 } else { 874 assert(D || includeMinimalInlineScopes()); 875 if (D) 876 // And attach the attributes 877 applySubprogramAttributesToDefinition(SP, *D); 878 } 879 } 880 881 void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) { 882 DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity()); 883 884 auto *Die = Entity->getDIE(); 885 /// Label may be used to generate DW_AT_low_pc, so put it outside 886 /// if/else block. 887 const DbgLabel *Label = nullptr; 888 if (AbsEntity && AbsEntity->getDIE()) { 889 addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE()); 890 Label = dyn_cast<const DbgLabel>(Entity); 891 } else { 892 if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity)) 893 applyVariableAttributes(*Var, *Die); 894 else if ((Label = dyn_cast<const DbgLabel>(Entity))) 895 applyLabelAttributes(*Label, *Die); 896 else 897 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel."); 898 } 899 900 if (Label) 901 if (const auto *Sym = Label->getSymbol()) 902 addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym); 903 } 904 905 DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) { 906 auto &AbstractEntities = getAbstractEntities(); 907 auto I = AbstractEntities.find(Node); 908 if (I != AbstractEntities.end()) 909 return I->second.get(); 910 return nullptr; 911 } 912 913 void DwarfCompileUnit::createAbstractEntity(const DINode *Node, 914 LexicalScope *Scope) { 915 assert(Scope && Scope->isAbstractScope()); 916 auto &Entity = getAbstractEntities()[Node]; 917 if (isa<const DILocalVariable>(Node)) { 918 Entity = llvm::make_unique<DbgVariable>( 919 cast<const DILocalVariable>(Node), nullptr /* IA */);; 920 DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get())); 921 } else if (isa<const DILabel>(Node)) { 922 Entity = llvm::make_unique<DbgLabel>( 923 cast<const DILabel>(Node), nullptr /* IA */); 924 DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get())); 925 } 926 } 927 928 void DwarfCompileUnit::emitHeader(bool UseOffsets) { 929 // Don't bother labeling the .dwo unit, as its offset isn't used. 930 if (!Skeleton && !DD->useSectionsAsReferences()) { 931 LabelBegin = Asm->createTempSymbol("cu_begin"); 932 Asm->OutStreamer->EmitLabel(LabelBegin); 933 } 934 935 dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile 936 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton 937 : dwarf::DW_UT_compile; 938 DwarfUnit::emitCommonHeader(UseOffsets, UT); 939 if (DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile) 940 Asm->emitInt64(getDWOId()); 941 } 942 943 bool DwarfCompileUnit::hasDwarfPubSections() const { 944 switch (CUNode->getNameTableKind()) { 945 case DICompileUnit::DebugNameTableKind::None: 946 return false; 947 // Opting in to GNU Pubnames/types overrides the default to ensure these are 948 // generated for things like Gold's gdb_index generation. 949 case DICompileUnit::DebugNameTableKind::GNU: 950 return true; 951 case DICompileUnit::DebugNameTableKind::Default: 952 return DD->tuneForGDB() && !includeMinimalInlineScopes() && 953 !CUNode->isDebugDirectivesOnly(); 954 } 955 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum"); 956 } 957 958 /// addGlobalName - Add a new global name to the compile unit. 959 void DwarfCompileUnit::addGlobalName(StringRef Name, const DIE &Die, 960 const DIScope *Context) { 961 if (!hasDwarfPubSections()) 962 return; 963 std::string FullName = getParentContextString(Context) + Name.str(); 964 GlobalNames[FullName] = &Die; 965 } 966 967 void DwarfCompileUnit::addGlobalNameForTypeUnit(StringRef Name, 968 const DIScope *Context) { 969 if (!hasDwarfPubSections()) 970 return; 971 std::string FullName = getParentContextString(Context) + Name.str(); 972 // Insert, allowing the entry to remain as-is if it's already present 973 // This way the CU-level type DIE is preferred over the "can't describe this 974 // type as a unit offset because it's not really in the CU at all, it's only 975 // in a type unit" 976 GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie())); 977 } 978 979 /// Add a new global type to the unit. 980 void DwarfCompileUnit::addGlobalType(const DIType *Ty, const DIE &Die, 981 const DIScope *Context) { 982 if (!hasDwarfPubSections()) 983 return; 984 std::string FullName = getParentContextString(Context) + Ty->getName().str(); 985 GlobalTypes[FullName] = &Die; 986 } 987 988 void DwarfCompileUnit::addGlobalTypeUnitType(const DIType *Ty, 989 const DIScope *Context) { 990 if (!hasDwarfPubSections()) 991 return; 992 std::string FullName = getParentContextString(Context) + Ty->getName().str(); 993 // Insert, allowing the entry to remain as-is if it's already present 994 // This way the CU-level type DIE is preferred over the "can't describe this 995 // type as a unit offset because it's not really in the CU at all, it's only 996 // in a type unit" 997 GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie())); 998 } 999 1000 /// addVariableAddress - Add DW_AT_location attribute for a 1001 /// DbgVariable based on provided MachineLocation. 1002 void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die, 1003 MachineLocation Location) { 1004 // addBlockByrefAddress is obsolete and will be removed soon. 1005 // The clang frontend always generates block byref variables with a 1006 // complex expression that encodes exactly what addBlockByrefAddress 1007 // would do. 1008 assert((!DV.isBlockByrefVariable() || DV.hasComplexAddress()) && 1009 "block byref variable without a complex expression"); 1010 if (DV.hasComplexAddress()) 1011 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location); 1012 else 1013 addAddress(Die, dwarf::DW_AT_location, Location); 1014 } 1015 1016 /// Add an address attribute to a die based on the location provided. 1017 void DwarfCompileUnit::addAddress(DIE &Die, dwarf::Attribute Attribute, 1018 const MachineLocation &Location) { 1019 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1020 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1021 if (Location.isIndirect()) 1022 DwarfExpr.setMemoryLocationKind(); 1023 1024 DIExpressionCursor Cursor({}); 1025 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 1026 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1027 return; 1028 DwarfExpr.addExpression(std::move(Cursor)); 1029 1030 // Now attach the location information to the DIE. 1031 addBlock(Die, Attribute, DwarfExpr.finalize()); 1032 } 1033 1034 /// Start with the address based on the location provided, and generate the 1035 /// DWARF information necessary to find the actual variable given the extra 1036 /// address information encoded in the DbgVariable, starting from the starting 1037 /// location. Add the DWARF information to the die. 1038 void DwarfCompileUnit::addComplexAddress(const DbgVariable &DV, DIE &Die, 1039 dwarf::Attribute Attribute, 1040 const MachineLocation &Location) { 1041 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1042 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1043 const DIExpression *DIExpr = DV.getSingleExpression(); 1044 DwarfExpr.addFragmentOffset(DIExpr); 1045 if (Location.isIndirect()) 1046 DwarfExpr.setMemoryLocationKind(); 1047 1048 DIExpressionCursor Cursor(DIExpr); 1049 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 1050 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1051 return; 1052 DwarfExpr.addExpression(std::move(Cursor)); 1053 1054 // Now attach the location information to the DIE. 1055 addBlock(Die, Attribute, DwarfExpr.finalize()); 1056 } 1057 1058 /// Add a Dwarf loclistptr attribute data and value. 1059 void DwarfCompileUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute, 1060 unsigned Index) { 1061 dwarf::Form Form = DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset 1062 : dwarf::DW_FORM_data4; 1063 Die.addValue(DIEValueAllocator, Attribute, Form, DIELocList(Index)); 1064 } 1065 1066 void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var, 1067 DIE &VariableDie) { 1068 StringRef Name = Var.getName(); 1069 if (!Name.empty()) 1070 addString(VariableDie, dwarf::DW_AT_name, Name); 1071 const auto *DIVar = Var.getVariable(); 1072 if (DIVar) 1073 if (uint32_t AlignInBytes = DIVar->getAlignInBytes()) 1074 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, 1075 AlignInBytes); 1076 1077 addSourceLine(VariableDie, DIVar); 1078 addType(VariableDie, Var.getType()); 1079 if (Var.isArtificial()) 1080 addFlag(VariableDie, dwarf::DW_AT_artificial); 1081 } 1082 1083 void DwarfCompileUnit::applyLabelAttributes(const DbgLabel &Label, 1084 DIE &LabelDie) { 1085 StringRef Name = Label.getName(); 1086 if (!Name.empty()) 1087 addString(LabelDie, dwarf::DW_AT_name, Name); 1088 const auto *DILabel = Label.getLabel(); 1089 addSourceLine(LabelDie, DILabel); 1090 } 1091 1092 /// Add a Dwarf expression attribute data and value. 1093 void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form, 1094 const MCExpr *Expr) { 1095 Die.addValue(DIEValueAllocator, (dwarf::Attribute)0, Form, DIEExpr(Expr)); 1096 } 1097 1098 void DwarfCompileUnit::applySubprogramAttributesToDefinition( 1099 const DISubprogram *SP, DIE &SPDie) { 1100 auto *SPDecl = SP->getDeclaration(); 1101 auto *Context = resolve(SPDecl ? SPDecl->getScope() : SP->getScope()); 1102 applySubprogramAttributes(SP, SPDie, includeMinimalInlineScopes()); 1103 addGlobalName(SP->getName(), SPDie, Context); 1104 } 1105 1106 bool DwarfCompileUnit::isDwoUnit() const { 1107 return DD->useSplitDwarf() && Skeleton; 1108 } 1109 1110 bool DwarfCompileUnit::includeMinimalInlineScopes() const { 1111 return getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly || 1112 (DD->useSplitDwarf() && !Skeleton); 1113 } 1114