1 //===- llvm/CodeGen/DwarfCompileUnit.cpp - Dwarf Compile Units ------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains support for constructing a dwarf compile unit. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "DwarfCompileUnit.h" 14 #include "AddressPool.h" 15 #include "DwarfDebug.h" 16 #include "DwarfExpression.h" 17 #include "DwarfUnit.h" 18 #include "llvm/ADT/None.h" 19 #include "llvm/ADT/STLExtras.h" 20 #include "llvm/ADT/SmallString.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 static dwarf::Tag GetCompileUnitType(UnitKind Kind, DwarfDebug *DW) { 56 57 // According to DWARF Debugging Information Format Version 5, 58 // 3.1.2 Skeleton Compilation Unit Entries: 59 // "When generating a split DWARF object file (see Section 7.3.2 60 // on page 187), the compilation unit in the .debug_info section 61 // is a "skeleton" compilation unit with the tag DW_TAG_skeleton_unit" 62 if (DW->getDwarfVersion() >= 5 && Kind == UnitKind::Skeleton) 63 return dwarf::DW_TAG_skeleton_unit; 64 65 return dwarf::DW_TAG_compile_unit; 66 } 67 68 DwarfCompileUnit::DwarfCompileUnit(unsigned UID, const DICompileUnit *Node, 69 AsmPrinter *A, DwarfDebug *DW, 70 DwarfFile *DWU, UnitKind Kind) 71 : DwarfUnit(GetCompileUnitType(Kind, DW), Node, A, DW, DWU), UniqueID(UID) { 72 insertDIE(Node, &getUnitDie()); 73 MacroLabelBegin = Asm->createTempSymbol("cu_macro_begin"); 74 } 75 76 /// addLabelAddress - Add a dwarf label attribute data and value using 77 /// DW_FORM_addr or DW_FORM_GNU_addr_index. 78 void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute, 79 const MCSymbol *Label) { 80 // Don't use the address pool in non-fission or in the skeleton unit itself. 81 if ((!DD->useSplitDwarf() || !Skeleton) && DD->getDwarfVersion() < 5) 82 return addLocalLabelAddress(Die, Attribute, Label); 83 84 if (Label) 85 DD->addArangeLabel(SymbolCU(this, Label)); 86 87 unsigned idx = DD->getAddressPool().getIndex(Label); 88 Die.addValue(DIEValueAllocator, Attribute, 89 DD->getDwarfVersion() >= 5 ? dwarf::DW_FORM_addrx 90 : dwarf::DW_FORM_GNU_addr_index, 91 DIEInteger(idx)); 92 } 93 94 void DwarfCompileUnit::addLocalLabelAddress(DIE &Die, 95 dwarf::Attribute Attribute, 96 const MCSymbol *Label) { 97 if (Label) 98 DD->addArangeLabel(SymbolCU(this, Label)); 99 100 if (Label) 101 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr, 102 DIELabel(Label)); 103 else 104 Die.addValue(DIEValueAllocator, Attribute, dwarf::DW_FORM_addr, 105 DIEInteger(0)); 106 } 107 108 unsigned DwarfCompileUnit::getOrCreateSourceID(const DIFile *File) { 109 // If we print assembly, we can't separate .file entries according to 110 // compile units. Thus all files will belong to the default compile unit. 111 112 // FIXME: add a better feature test than hasRawTextSupport. Even better, 113 // extend .file to support this. 114 unsigned CUID = Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID(); 115 if (!File) 116 return Asm->OutStreamer->emitDwarfFileDirective(0, "", "", None, None, 117 CUID); 118 return Asm->OutStreamer->emitDwarfFileDirective( 119 0, File->getDirectory(), File->getFilename(), getMD5AsBytes(File), 120 File->getSource(), CUID); 121 } 122 123 DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE( 124 const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) { 125 // Check for pre-existence. 126 if (DIE *Die = getDIE(GV)) 127 return Die; 128 129 assert(GV); 130 131 auto *GVContext = GV->getScope(); 132 const DIType *GTy = GV->getType(); 133 134 // Construct the context before querying for the existence of the DIE in 135 // case such construction creates the DIE. 136 auto *CB = GVContext ? dyn_cast<DICommonBlock>(GVContext) : nullptr; 137 DIE *ContextDIE = CB ? getOrCreateCommonBlock(CB, GlobalExprs) 138 : getOrCreateContextDIE(GVContext); 139 140 // Add to map. 141 DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV); 142 DIScope *DeclContext; 143 if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) { 144 DeclContext = SDMDecl->getScope(); 145 assert(SDMDecl->isStaticMember() && "Expected static member decl"); 146 assert(GV->isDefinition()); 147 // We need the declaration DIE that is in the static member's class. 148 DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl); 149 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE); 150 // If the global variable's type is different from the one in the class 151 // member type, assume that it's more specific and also emit it. 152 if (GTy != SDMDecl->getBaseType()) 153 addType(*VariableDIE, GTy); 154 } else { 155 DeclContext = GV->getScope(); 156 // Add name and type. 157 addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName()); 158 addType(*VariableDIE, GTy); 159 160 // Add scoping info. 161 if (!GV->isLocalToUnit()) 162 addFlag(*VariableDIE, dwarf::DW_AT_external); 163 164 // Add line number info. 165 addSourceLine(*VariableDIE, GV); 166 } 167 168 if (!GV->isDefinition()) 169 addFlag(*VariableDIE, dwarf::DW_AT_declaration); 170 else 171 addGlobalName(GV->getName(), *VariableDIE, DeclContext); 172 173 if (uint32_t AlignInBytes = GV->getAlignInBytes()) 174 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, 175 AlignInBytes); 176 177 if (MDTuple *TP = GV->getTemplateParams()) 178 addTemplateParams(*VariableDIE, DINodeArray(TP)); 179 180 // Add location. 181 addLocationAttribute(VariableDIE, GV, GlobalExprs); 182 183 return VariableDIE; 184 } 185 186 void DwarfCompileUnit::addLocationAttribute( 187 DIE *VariableDIE, const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) { 188 bool addToAccelTable = false; 189 DIELoc *Loc = nullptr; 190 Optional<unsigned> NVPTXAddressSpace; 191 std::unique_ptr<DIEDwarfExpression> DwarfExpr; 192 for (const auto &GE : GlobalExprs) { 193 const GlobalVariable *Global = GE.Var; 194 const DIExpression *Expr = GE.Expr; 195 196 // For compatibility with DWARF 3 and earlier, 197 // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) becomes 198 // DW_AT_const_value(X). 199 if (GlobalExprs.size() == 1 && Expr && Expr->isConstant()) { 200 addToAccelTable = true; 201 addConstantValue(*VariableDIE, /*Unsigned=*/true, Expr->getElement(1)); 202 break; 203 } 204 205 // We cannot describe the location of dllimport'd variables: the 206 // computation of their address requires loads from the IAT. 207 if (Global && Global->hasDLLImportStorageClass()) 208 continue; 209 210 // Nothing to describe without address or constant. 211 if (!Global && (!Expr || !Expr->isConstant())) 212 continue; 213 214 if (Global && Global->isThreadLocal() && 215 !Asm->getObjFileLowering().supportDebugThreadLocalLocation()) 216 continue; 217 218 if (!Loc) { 219 addToAccelTable = true; 220 Loc = new (DIEValueAllocator) DIELoc; 221 DwarfExpr = std::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc); 222 } 223 224 if (Expr) { 225 // According to 226 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 227 // cuda-gdb requires DW_AT_address_class for all variables to be able to 228 // correctly interpret address space of the variable address. 229 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef 230 // sequence for the NVPTX + gdb target. 231 unsigned LocalNVPTXAddressSpace; 232 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 233 const DIExpression *NewExpr = 234 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace); 235 if (NewExpr != Expr) { 236 Expr = NewExpr; 237 NVPTXAddressSpace = LocalNVPTXAddressSpace; 238 } 239 } 240 DwarfExpr->addFragmentOffset(Expr); 241 } 242 243 if (Global) { 244 const MCSymbol *Sym = Asm->getSymbol(Global); 245 if (Global->isThreadLocal()) { 246 if (Asm->TM.useEmulatedTLS()) { 247 // TODO: add debug info for emulated thread local mode. 248 } else { 249 // FIXME: Make this work with -gsplit-dwarf. 250 unsigned PointerSize = Asm->getDataLayout().getPointerSize(); 251 assert((PointerSize == 4 || PointerSize == 8) && 252 "Add support for other sizes if necessary"); 253 // Based on GCC's support for TLS: 254 if (!DD->useSplitDwarf()) { 255 // 1) Start with a constNu of the appropriate pointer size 256 addUInt(*Loc, dwarf::DW_FORM_data1, 257 PointerSize == 4 ? dwarf::DW_OP_const4u 258 : dwarf::DW_OP_const8u); 259 // 2) containing the (relocated) offset of the TLS variable 260 // within the module's TLS block. 261 addExpr(*Loc, dwarf::DW_FORM_udata, 262 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym)); 263 } else { 264 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index); 265 addUInt(*Loc, dwarf::DW_FORM_udata, 266 DD->getAddressPool().getIndex(Sym, /* TLS */ true)); 267 } 268 // 3) followed by an OP to make the debugger do a TLS lookup. 269 addUInt(*Loc, dwarf::DW_FORM_data1, 270 DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address 271 : dwarf::DW_OP_form_tls_address); 272 } 273 } else { 274 DD->addArangeLabel(SymbolCU(this, Sym)); 275 addOpAddress(*Loc, Sym); 276 } 277 } 278 // Global variables attached to symbols are memory locations. 279 // It would be better if this were unconditional, but malformed input that 280 // mixes non-fragments and fragments for the same variable is too expensive 281 // to detect in the verifier. 282 if (DwarfExpr->isUnknownLocation()) 283 DwarfExpr->setMemoryLocationKind(); 284 DwarfExpr->addExpression(Expr); 285 } 286 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 287 // According to 288 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 289 // cuda-gdb requires DW_AT_address_class for all variables to be able to 290 // correctly interpret address space of the variable address. 291 const unsigned NVPTX_ADDR_global_space = 5; 292 addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1, 293 NVPTXAddressSpace ? *NVPTXAddressSpace : NVPTX_ADDR_global_space); 294 } 295 if (Loc) 296 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize()); 297 298 if (DD->useAllLinkageNames()) 299 addLinkageName(*VariableDIE, GV->getLinkageName()); 300 301 if (addToAccelTable) { 302 DD->addAccelName(*CUNode, GV->getName(), *VariableDIE); 303 304 // If the linkage name is different than the name, go ahead and output 305 // that as well into the name table. 306 if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName() && 307 DD->useAllLinkageNames()) 308 DD->addAccelName(*CUNode, GV->getLinkageName(), *VariableDIE); 309 } 310 } 311 312 DIE *DwarfCompileUnit::getOrCreateCommonBlock( 313 const DICommonBlock *CB, ArrayRef<GlobalExpr> GlobalExprs) { 314 // Construct the context before querying for the existence of the DIE in case 315 // such construction creates the DIE. 316 DIE *ContextDIE = getOrCreateContextDIE(CB->getScope()); 317 318 if (DIE *NDie = getDIE(CB)) 319 return NDie; 320 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_common_block, *ContextDIE, CB); 321 StringRef Name = CB->getName().empty() ? "_BLNK_" : CB->getName(); 322 addString(NDie, dwarf::DW_AT_name, Name); 323 addGlobalName(Name, NDie, CB->getScope()); 324 if (CB->getFile()) 325 addSourceLine(NDie, CB->getLineNo(), CB->getFile()); 326 if (DIGlobalVariable *V = CB->getDecl()) 327 getCU().addLocationAttribute(&NDie, V, GlobalExprs); 328 return &NDie; 329 } 330 331 void DwarfCompileUnit::addRange(RangeSpan Range) { 332 DD->insertSectionLabel(Range.Begin); 333 334 bool SameAsPrevCU = this == DD->getPrevCU(); 335 DD->setPrevCU(this); 336 // If we have no current ranges just add the range and return, otherwise, 337 // check the current section and CU against the previous section and CU we 338 // emitted into and the subprogram was contained within. If these are the 339 // same then extend our current range, otherwise add this as a new range. 340 if (CURanges.empty() || !SameAsPrevCU || 341 (&CURanges.back().End->getSection() != 342 &Range.End->getSection())) { 343 CURanges.push_back(Range); 344 return; 345 } 346 347 CURanges.back().End = Range.End; 348 } 349 350 void DwarfCompileUnit::initStmtList() { 351 if (CUNode->isDebugDirectivesOnly()) 352 return; 353 354 // Define start line table label for each Compile Unit. 355 MCSymbol *LineTableStartSym; 356 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 357 if (DD->useSectionsAsReferences()) { 358 LineTableStartSym = TLOF.getDwarfLineSection()->getBeginSymbol(); 359 } else { 360 LineTableStartSym = 361 Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID()); 362 } 363 364 // DW_AT_stmt_list is a offset of line number information for this 365 // compile unit in debug_line section. For split dwarf this is 366 // left in the skeleton CU and so not included. 367 // The line table entries are not always emitted in assembly, so it 368 // is not okay to use line_table_start here. 369 StmtListValue = 370 addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym, 371 TLOF.getDwarfLineSection()->getBeginSymbol()); 372 } 373 374 void DwarfCompileUnit::applyStmtList(DIE &D) { 375 D.addValue(DIEValueAllocator, *StmtListValue); 376 } 377 378 void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin, 379 const MCSymbol *End) { 380 assert(Begin && "Begin label should not be null!"); 381 assert(End && "End label should not be null!"); 382 assert(Begin->isDefined() && "Invalid starting label"); 383 assert(End->isDefined() && "Invalid end label"); 384 385 addLabelAddress(D, dwarf::DW_AT_low_pc, Begin); 386 if (DD->getDwarfVersion() < 4) 387 addLabelAddress(D, dwarf::DW_AT_high_pc, End); 388 else 389 addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin); 390 } 391 392 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc 393 // and DW_AT_high_pc attributes. If there are global variables in this 394 // scope then create and insert DIEs for these variables. 395 DIE &DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram *SP) { 396 DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes()); 397 398 attachLowHighPC(*SPDie, Asm->getFunctionBegin(), Asm->getFunctionEnd()); 399 if (DD->useAppleExtensionAttributes() && 400 !DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim( 401 *DD->getCurrentFunction())) 402 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr); 403 404 // Only include DW_AT_frame_base in full debug info 405 if (!includeMinimalInlineScopes()) { 406 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering(); 407 TargetFrameLowering::DwarfFrameBase FrameBase = 408 TFI->getDwarfFrameBase(*Asm->MF); 409 switch (FrameBase.Kind) { 410 case TargetFrameLowering::DwarfFrameBase::Register: { 411 if (Register::isPhysicalRegister(FrameBase.Location.Reg)) { 412 MachineLocation Location(FrameBase.Location.Reg); 413 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location); 414 } 415 break; 416 } 417 case TargetFrameLowering::DwarfFrameBase::CFA: { 418 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 419 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa); 420 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc); 421 break; 422 } 423 case TargetFrameLowering::DwarfFrameBase::WasmFrameBase: { 424 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 425 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 426 DIExpressionCursor Cursor({}); 427 DwarfExpr.addWasmLocation(FrameBase.Location.WasmLoc.Kind, 428 FrameBase.Location.WasmLoc.Index); 429 DwarfExpr.addExpression(std::move(Cursor)); 430 addBlock(*SPDie, dwarf::DW_AT_frame_base, DwarfExpr.finalize()); 431 break; 432 } 433 } 434 } 435 436 // Add name to the name table, we do this here because we're guaranteed 437 // to have concrete versions of our DW_TAG_subprogram nodes. 438 DD->addSubprogramNames(*CUNode, SP, *SPDie); 439 440 return *SPDie; 441 } 442 443 // Construct a DIE for this scope. 444 void DwarfCompileUnit::constructScopeDIE( 445 LexicalScope *Scope, SmallVectorImpl<DIE *> &FinalChildren) { 446 if (!Scope || !Scope->getScopeNode()) 447 return; 448 449 auto *DS = Scope->getScopeNode(); 450 451 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) && 452 "Only handle inlined subprograms here, use " 453 "constructSubprogramScopeDIE for non-inlined " 454 "subprograms"); 455 456 SmallVector<DIE *, 8> Children; 457 458 // We try to create the scope DIE first, then the children DIEs. This will 459 // avoid creating un-used children then removing them later when we find out 460 // the scope DIE is null. 461 DIE *ScopeDIE; 462 if (Scope->getParent() && isa<DISubprogram>(DS)) { 463 ScopeDIE = constructInlinedScopeDIE(Scope); 464 if (!ScopeDIE) 465 return; 466 // We create children when the scope DIE is not null. 467 createScopeChildrenDIE(Scope, Children); 468 } else { 469 // Early exit when we know the scope DIE is going to be null. 470 if (DD->isLexicalScopeDIENull(Scope)) 471 return; 472 473 bool HasNonScopeChildren = false; 474 475 // We create children here when we know the scope DIE is not going to be 476 // null and the children will be added to the scope DIE. 477 createScopeChildrenDIE(Scope, Children, &HasNonScopeChildren); 478 479 // If there are only other scopes as children, put them directly in the 480 // parent instead, as this scope would serve no purpose. 481 if (!HasNonScopeChildren) { 482 FinalChildren.insert(FinalChildren.end(), 483 std::make_move_iterator(Children.begin()), 484 std::make_move_iterator(Children.end())); 485 return; 486 } 487 ScopeDIE = constructLexicalScopeDIE(Scope); 488 assert(ScopeDIE && "Scope DIE should not be null."); 489 } 490 491 // Add children 492 for (auto &I : Children) 493 ScopeDIE->addChild(std::move(I)); 494 495 FinalChildren.push_back(std::move(ScopeDIE)); 496 } 497 498 void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE, 499 SmallVector<RangeSpan, 2> Range) { 500 501 HasRangeLists = true; 502 503 // Add the range list to the set of ranges to be emitted. 504 auto IndexAndList = 505 (DD->getDwarfVersion() < 5 && Skeleton ? Skeleton->DU : DU) 506 ->addRange(*(Skeleton ? Skeleton : this), std::move(Range)); 507 508 uint32_t Index = IndexAndList.first; 509 auto &List = *IndexAndList.second; 510 511 // Under fission, ranges are specified by constant offsets relative to the 512 // CU's DW_AT_GNU_ranges_base. 513 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under 514 // fission until we support the forms using the .debug_addr section 515 // (DW_RLE_startx_endx etc.). 516 if (DD->getDwarfVersion() >= 5) 517 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index); 518 else { 519 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 520 const MCSymbol *RangeSectionSym = 521 TLOF.getDwarfRangesSection()->getBeginSymbol(); 522 if (isDwoUnit()) 523 addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.Label, 524 RangeSectionSym); 525 else 526 addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.Label, 527 RangeSectionSym); 528 } 529 } 530 531 void DwarfCompileUnit::attachRangesOrLowHighPC( 532 DIE &Die, SmallVector<RangeSpan, 2> Ranges) { 533 if (Ranges.size() == 1 || !DD->useRangesSection()) { 534 const RangeSpan &Front = Ranges.front(); 535 const RangeSpan &Back = Ranges.back(); 536 attachLowHighPC(Die, Front.Begin, Back.End); 537 } else 538 addScopeRangeList(Die, std::move(Ranges)); 539 } 540 541 void DwarfCompileUnit::attachRangesOrLowHighPC( 542 DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) { 543 SmallVector<RangeSpan, 2> List; 544 List.reserve(Ranges.size()); 545 for (const InsnRange &R : Ranges) 546 List.push_back( 547 {DD->getLabelBeforeInsn(R.first), DD->getLabelAfterInsn(R.second)}); 548 attachRangesOrLowHighPC(Die, std::move(List)); 549 } 550 551 // This scope represents inlined body of a function. Construct DIE to 552 // represent this concrete inlined copy of the function. 553 DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope) { 554 assert(Scope->getScopeNode()); 555 auto *DS = Scope->getScopeNode(); 556 auto *InlinedSP = getDISubprogram(DS); 557 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram 558 // was inlined from another compile unit. 559 DIE *OriginDIE = getAbstractSPDies()[InlinedSP]; 560 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram."); 561 562 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine); 563 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE); 564 565 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); 566 567 // Add the call site information to the DIE. 568 const DILocation *IA = Scope->getInlinedAt(); 569 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None, 570 getOrCreateSourceID(IA->getFile())); 571 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, IA->getLine()); 572 if (IA->getColumn()) 573 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, None, IA->getColumn()); 574 if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4) 575 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, None, 576 IA->getDiscriminator()); 577 578 // Add name to the name table, we do this here because we're guaranteed 579 // to have concrete versions of our DW_TAG_inlined_subprogram nodes. 580 DD->addSubprogramNames(*CUNode, InlinedSP, *ScopeDIE); 581 582 return ScopeDIE; 583 } 584 585 // Construct new DW_TAG_lexical_block for this scope and attach 586 // DW_AT_low_pc/DW_AT_high_pc labels. 587 DIE *DwarfCompileUnit::constructLexicalScopeDIE(LexicalScope *Scope) { 588 if (DD->isLexicalScopeDIENull(Scope)) 589 return nullptr; 590 591 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block); 592 if (Scope->isAbstractScope()) 593 return ScopeDIE; 594 595 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); 596 597 return ScopeDIE; 598 } 599 600 /// constructVariableDIE - Construct a DIE for the given DbgVariable. 601 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, bool Abstract) { 602 auto D = constructVariableDIEImpl(DV, Abstract); 603 DV.setDIE(*D); 604 return D; 605 } 606 607 DIE *DwarfCompileUnit::constructLabelDIE(DbgLabel &DL, 608 const LexicalScope &Scope) { 609 auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag()); 610 insertDIE(DL.getLabel(), LabelDie); 611 DL.setDIE(*LabelDie); 612 613 if (Scope.isAbstractScope()) 614 applyLabelAttributes(DL, *LabelDie); 615 616 return LabelDie; 617 } 618 619 DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV, 620 bool Abstract) { 621 // Define variable debug information entry. 622 auto VariableDie = DIE::get(DIEValueAllocator, DV.getTag()); 623 insertDIE(DV.getVariable(), VariableDie); 624 625 if (Abstract) { 626 applyVariableAttributes(DV, *VariableDie); 627 return VariableDie; 628 } 629 630 // Add variable address. 631 632 unsigned Offset = DV.getDebugLocListIndex(); 633 if (Offset != ~0U) { 634 addLocationList(*VariableDie, dwarf::DW_AT_location, Offset); 635 auto TagOffset = DV.getDebugLocListTagOffset(); 636 if (TagOffset) 637 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 638 *TagOffset); 639 return VariableDie; 640 } 641 642 // Check if variable has a single location description. 643 if (auto *DVal = DV.getValueLoc()) { 644 if (DVal->isLocation()) 645 addVariableAddress(DV, *VariableDie, DVal->getLoc()); 646 else if (DVal->isInt()) { 647 auto *Expr = DV.getSingleExpression(); 648 if (Expr && Expr->getNumElements()) { 649 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 650 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 651 // If there is an expression, emit raw unsigned bytes. 652 DwarfExpr.addFragmentOffset(Expr); 653 DwarfExpr.addUnsignedConstant(DVal->getInt()); 654 DwarfExpr.addExpression(Expr); 655 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 656 if (DwarfExpr.TagOffset) 657 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, 658 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset); 659 660 } else 661 addConstantValue(*VariableDie, DVal->getInt(), DV.getType()); 662 } else if (DVal->isConstantFP()) { 663 addConstantFPValue(*VariableDie, DVal->getConstantFP()); 664 } else if (DVal->isConstantInt()) { 665 addConstantValue(*VariableDie, DVal->getConstantInt(), DV.getType()); 666 } 667 return VariableDie; 668 } 669 670 // .. else use frame index. 671 if (!DV.hasFrameIndexExprs()) 672 return VariableDie; 673 674 Optional<unsigned> NVPTXAddressSpace; 675 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 676 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 677 for (auto &Fragment : DV.getFrameIndexExprs()) { 678 unsigned FrameReg = 0; 679 const DIExpression *Expr = Fragment.Expr; 680 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering(); 681 int Offset = TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg); 682 DwarfExpr.addFragmentOffset(Expr); 683 SmallVector<uint64_t, 8> Ops; 684 DIExpression::appendOffset(Ops, Offset); 685 // According to 686 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 687 // cuda-gdb requires DW_AT_address_class for all variables to be able to 688 // correctly interpret address space of the variable address. 689 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef 690 // sequence for the NVPTX + gdb target. 691 unsigned LocalNVPTXAddressSpace; 692 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 693 const DIExpression *NewExpr = 694 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace); 695 if (NewExpr != Expr) { 696 Expr = NewExpr; 697 NVPTXAddressSpace = LocalNVPTXAddressSpace; 698 } 699 } 700 if (Expr) 701 Ops.append(Expr->elements_begin(), Expr->elements_end()); 702 DIExpressionCursor Cursor(Ops); 703 DwarfExpr.setMemoryLocationKind(); 704 if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol()) 705 addOpAddress(*Loc, FrameSymbol); 706 else 707 DwarfExpr.addMachineRegExpression( 708 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg); 709 DwarfExpr.addExpression(std::move(Cursor)); 710 } 711 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 712 // According to 713 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 714 // cuda-gdb requires DW_AT_address_class for all variables to be able to 715 // correctly interpret address space of the variable address. 716 const unsigned NVPTX_ADDR_local_space = 6; 717 addUInt(*VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1, 718 NVPTXAddressSpace ? *NVPTXAddressSpace : NVPTX_ADDR_local_space); 719 } 720 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 721 if (DwarfExpr.TagOffset) 722 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 723 *DwarfExpr.TagOffset); 724 725 return VariableDie; 726 } 727 728 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, 729 const LexicalScope &Scope, 730 DIE *&ObjectPointer) { 731 auto Var = constructVariableDIE(DV, Scope.isAbstractScope()); 732 if (DV.isObjectPointer()) 733 ObjectPointer = Var; 734 return Var; 735 } 736 737 /// Return all DIVariables that appear in count: expressions. 738 static SmallVector<const DIVariable *, 2> dependencies(DbgVariable *Var) { 739 SmallVector<const DIVariable *, 2> Result; 740 auto *Array = dyn_cast<DICompositeType>(Var->getType()); 741 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type) 742 return Result; 743 for (auto *El : Array->getElements()) { 744 if (auto *Subrange = dyn_cast<DISubrange>(El)) { 745 auto Count = Subrange->getCount(); 746 if (auto *Dependency = Count.dyn_cast<DIVariable *>()) 747 Result.push_back(Dependency); 748 } 749 } 750 return Result; 751 } 752 753 /// Sort local variables so that variables appearing inside of helper 754 /// expressions come first. 755 static SmallVector<DbgVariable *, 8> 756 sortLocalVars(SmallVectorImpl<DbgVariable *> &Input) { 757 SmallVector<DbgVariable *, 8> Result; 758 SmallVector<PointerIntPair<DbgVariable *, 1>, 8> WorkList; 759 // Map back from a DIVariable to its containing DbgVariable. 760 SmallDenseMap<const DILocalVariable *, DbgVariable *> DbgVar; 761 // Set of DbgVariables in Result. 762 SmallDenseSet<DbgVariable *, 8> Visited; 763 // For cycle detection. 764 SmallDenseSet<DbgVariable *, 8> Visiting; 765 766 // Initialize the worklist and the DIVariable lookup table. 767 for (auto Var : reverse(Input)) { 768 DbgVar.insert({Var->getVariable(), Var}); 769 WorkList.push_back({Var, 0}); 770 } 771 772 // Perform a stable topological sort by doing a DFS. 773 while (!WorkList.empty()) { 774 auto Item = WorkList.back(); 775 DbgVariable *Var = Item.getPointer(); 776 bool visitedAllDependencies = Item.getInt(); 777 WorkList.pop_back(); 778 779 // Dependency is in a different lexical scope or a global. 780 if (!Var) 781 continue; 782 783 // Already handled. 784 if (Visited.count(Var)) 785 continue; 786 787 // Add to Result if all dependencies are visited. 788 if (visitedAllDependencies) { 789 Visited.insert(Var); 790 Result.push_back(Var); 791 continue; 792 } 793 794 // Detect cycles. 795 auto Res = Visiting.insert(Var); 796 if (!Res.second) { 797 assert(false && "dependency cycle in local variables"); 798 return Result; 799 } 800 801 // Push dependencies and this node onto the worklist, so that this node is 802 // visited again after all of its dependencies are handled. 803 WorkList.push_back({Var, 1}); 804 for (auto *Dependency : dependencies(Var)) { 805 auto Dep = dyn_cast_or_null<const DILocalVariable>(Dependency); 806 WorkList.push_back({DbgVar[Dep], 0}); 807 } 808 } 809 return Result; 810 } 811 812 DIE *DwarfCompileUnit::createScopeChildrenDIE(LexicalScope *Scope, 813 SmallVectorImpl<DIE *> &Children, 814 bool *HasNonScopeChildren) { 815 assert(Children.empty()); 816 DIE *ObjectPointer = nullptr; 817 818 // Emit function arguments (order is significant). 819 auto Vars = DU->getScopeVariables().lookup(Scope); 820 for (auto &DV : Vars.Args) 821 Children.push_back(constructVariableDIE(*DV.second, *Scope, ObjectPointer)); 822 823 // Emit local variables. 824 auto Locals = sortLocalVars(Vars.Locals); 825 for (DbgVariable *DV : Locals) 826 Children.push_back(constructVariableDIE(*DV, *Scope, ObjectPointer)); 827 828 // Skip imported directives in gmlt-like data. 829 if (!includeMinimalInlineScopes()) { 830 // There is no need to emit empty lexical block DIE. 831 for (const auto *IE : ImportedEntities[Scope->getScopeNode()]) 832 Children.push_back( 833 constructImportedEntityDIE(cast<DIImportedEntity>(IE))); 834 } 835 836 if (HasNonScopeChildren) 837 *HasNonScopeChildren = !Children.empty(); 838 839 for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope)) 840 Children.push_back(constructLabelDIE(*DL, *Scope)); 841 842 for (LexicalScope *LS : Scope->getChildren()) 843 constructScopeDIE(LS, Children); 844 845 return ObjectPointer; 846 } 847 848 DIE &DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub, 849 LexicalScope *Scope) { 850 DIE &ScopeDIE = updateSubprogramScopeDIE(Sub); 851 852 if (Scope) { 853 assert(!Scope->getInlinedAt()); 854 assert(!Scope->isAbstractScope()); 855 // Collect lexical scope children first. 856 // ObjectPointer might be a local (non-argument) local variable if it's a 857 // block's synthetic this pointer. 858 if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE)) 859 addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer); 860 } 861 862 // If this is a variadic function, add an unspecified parameter. 863 DITypeRefArray FnArgs = Sub->getType()->getTypeArray(); 864 865 // If we have a single element of null, it is a function that returns void. 866 // If we have more than one elements and the last one is null, it is a 867 // variadic function. 868 if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] && 869 !includeMinimalInlineScopes()) 870 ScopeDIE.addChild( 871 DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters)); 872 873 return ScopeDIE; 874 } 875 876 DIE *DwarfCompileUnit::createAndAddScopeChildren(LexicalScope *Scope, 877 DIE &ScopeDIE) { 878 // We create children when the scope DIE is not null. 879 SmallVector<DIE *, 8> Children; 880 DIE *ObjectPointer = createScopeChildrenDIE(Scope, Children); 881 882 // Add children 883 for (auto &I : Children) 884 ScopeDIE.addChild(std::move(I)); 885 886 return ObjectPointer; 887 } 888 889 void DwarfCompileUnit::constructAbstractSubprogramScopeDIE( 890 LexicalScope *Scope) { 891 DIE *&AbsDef = getAbstractSPDies()[Scope->getScopeNode()]; 892 if (AbsDef) 893 return; 894 895 auto *SP = cast<DISubprogram>(Scope->getScopeNode()); 896 897 DIE *ContextDIE; 898 DwarfCompileUnit *ContextCU = this; 899 900 if (includeMinimalInlineScopes()) 901 ContextDIE = &getUnitDie(); 902 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with 903 // the important distinction that the debug node is not associated with the 904 // DIE (since the debug node will be associated with the concrete DIE, if 905 // any). It could be refactored to some common utility function. 906 else if (auto *SPDecl = SP->getDeclaration()) { 907 ContextDIE = &getUnitDie(); 908 getOrCreateSubprogramDIE(SPDecl); 909 } else { 910 ContextDIE = getOrCreateContextDIE(SP->getScope()); 911 // The scope may be shared with a subprogram that has already been 912 // constructed in another CU, in which case we need to construct this 913 // subprogram in the same CU. 914 ContextCU = DD->lookupCU(ContextDIE->getUnitDie()); 915 } 916 917 // Passing null as the associated node because the abstract definition 918 // shouldn't be found by lookup. 919 AbsDef = &ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr); 920 ContextCU->applySubprogramAttributesToDefinition(SP, *AbsDef); 921 922 if (!ContextCU->includeMinimalInlineScopes()) 923 ContextCU->addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); 924 if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef)) 925 ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); 926 } 927 928 bool DwarfCompileUnit::useGNUAnalogForDwarf5Feature() const { 929 return DD->getDwarfVersion() == 4 && DD->tuneForGDB(); 930 } 931 932 dwarf::Tag DwarfCompileUnit::getDwarf5OrGNUTag(dwarf::Tag Tag) const { 933 if (!useGNUAnalogForDwarf5Feature()) 934 return Tag; 935 switch (Tag) { 936 case dwarf::DW_TAG_call_site: 937 return dwarf::DW_TAG_GNU_call_site; 938 case dwarf::DW_TAG_call_site_parameter: 939 return dwarf::DW_TAG_GNU_call_site_parameter; 940 default: 941 llvm_unreachable("DWARF5 tag with no GNU analog"); 942 } 943 } 944 945 dwarf::Attribute 946 DwarfCompileUnit::getDwarf5OrGNUAttr(dwarf::Attribute Attr) const { 947 if (!useGNUAnalogForDwarf5Feature()) 948 return Attr; 949 switch (Attr) { 950 case dwarf::DW_AT_call_all_calls: 951 return dwarf::DW_AT_GNU_all_call_sites; 952 case dwarf::DW_AT_call_target: 953 return dwarf::DW_AT_GNU_call_site_target; 954 case dwarf::DW_AT_call_origin: 955 return dwarf::DW_AT_abstract_origin; 956 case dwarf::DW_AT_call_return_pc: 957 return dwarf::DW_AT_low_pc; 958 case dwarf::DW_AT_call_value: 959 return dwarf::DW_AT_GNU_call_site_value; 960 case dwarf::DW_AT_call_tail_call: 961 return dwarf::DW_AT_GNU_tail_call; 962 default: 963 llvm_unreachable("DWARF5 attribute with no GNU analog"); 964 } 965 } 966 967 dwarf::LocationAtom 968 DwarfCompileUnit::getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const { 969 if (!useGNUAnalogForDwarf5Feature()) 970 return Loc; 971 switch (Loc) { 972 case dwarf::DW_OP_entry_value: 973 return dwarf::DW_OP_GNU_entry_value; 974 default: 975 llvm_unreachable("DWARF5 location atom with no GNU analog"); 976 } 977 } 978 979 DIE &DwarfCompileUnit::constructCallSiteEntryDIE(DIE &ScopeDIE, 980 DIE *CalleeDIE, 981 bool IsTail, 982 const MCSymbol *PCAddr, 983 const MCSymbol *CallAddr, 984 unsigned CallReg) { 985 // Insert a call site entry DIE within ScopeDIE. 986 DIE &CallSiteDIE = createAndAddDIE(getDwarf5OrGNUTag(dwarf::DW_TAG_call_site), 987 ScopeDIE, nullptr); 988 989 if (CallReg) { 990 // Indirect call. 991 addAddress(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_target), 992 MachineLocation(CallReg)); 993 } else { 994 assert(CalleeDIE && "No DIE for call site entry origin"); 995 addDIEEntry(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_origin), 996 *CalleeDIE); 997 } 998 999 if (IsTail) { 1000 // Attach DW_AT_call_tail_call to tail calls for standards compliance. 1001 addFlag(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_tail_call)); 1002 1003 // Attach the address of the branch instruction to allow the debugger to 1004 // show where the tail call occurred. This attribute has no GNU analog. 1005 // 1006 // GDB works backwards from non-standard usage of DW_AT_low_pc (in DWARF4 1007 // mode -- equivalently, in DWARF5 mode, DW_AT_call_return_pc) at tail-call 1008 // site entries to figure out the PC of tail-calling branch instructions. 1009 // This means it doesn't need the compiler to emit DW_AT_call_pc, so we 1010 // don't emit it here. 1011 // 1012 // There's no need to tie non-GDB debuggers to this non-standardness, as it 1013 // adds unnecessary complexity to the debugger. For non-GDB debuggers, emit 1014 // the standard DW_AT_call_pc info. 1015 if (!useGNUAnalogForDwarf5Feature()) 1016 addLabelAddress(CallSiteDIE, dwarf::DW_AT_call_pc, CallAddr); 1017 } 1018 1019 // Attach the return PC to allow the debugger to disambiguate call paths 1020 // from one function to another. 1021 // 1022 // The return PC is only really needed when the call /isn't/ a tail call, but 1023 // GDB expects it in DWARF4 mode, even for tail calls (see the comment above 1024 // the DW_AT_call_pc emission logic for an explanation). 1025 if (!IsTail || useGNUAnalogForDwarf5Feature()) { 1026 assert(PCAddr && "Missing return PC information for a call"); 1027 addLabelAddress(CallSiteDIE, 1028 getDwarf5OrGNUAttr(dwarf::DW_AT_call_return_pc), PCAddr); 1029 } 1030 1031 return CallSiteDIE; 1032 } 1033 1034 void DwarfCompileUnit::constructCallSiteParmEntryDIEs( 1035 DIE &CallSiteDIE, SmallVector<DbgCallSiteParam, 4> &Params) { 1036 for (const auto &Param : Params) { 1037 unsigned Register = Param.getRegister(); 1038 auto CallSiteDieParam = 1039 DIE::get(DIEValueAllocator, 1040 getDwarf5OrGNUTag(dwarf::DW_TAG_call_site_parameter)); 1041 insertDIE(CallSiteDieParam); 1042 addAddress(*CallSiteDieParam, dwarf::DW_AT_location, 1043 MachineLocation(Register)); 1044 1045 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1046 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1047 DwarfExpr.setCallSiteParamValueFlag(); 1048 1049 DwarfDebug::emitDebugLocValue(*Asm, nullptr, Param.getValue(), DwarfExpr); 1050 1051 addBlock(*CallSiteDieParam, getDwarf5OrGNUAttr(dwarf::DW_AT_call_value), 1052 DwarfExpr.finalize()); 1053 1054 CallSiteDIE.addChild(CallSiteDieParam); 1055 } 1056 } 1057 1058 DIE *DwarfCompileUnit::constructImportedEntityDIE( 1059 const DIImportedEntity *Module) { 1060 DIE *IMDie = DIE::get(DIEValueAllocator, (dwarf::Tag)Module->getTag()); 1061 insertDIE(Module, IMDie); 1062 DIE *EntityDie; 1063 auto *Entity = Module->getEntity(); 1064 if (auto *NS = dyn_cast<DINamespace>(Entity)) 1065 EntityDie = getOrCreateNameSpace(NS); 1066 else if (auto *M = dyn_cast<DIModule>(Entity)) 1067 EntityDie = getOrCreateModule(M); 1068 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) 1069 EntityDie = getOrCreateSubprogramDIE(SP); 1070 else if (auto *T = dyn_cast<DIType>(Entity)) 1071 EntityDie = getOrCreateTypeDIE(T); 1072 else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity)) 1073 EntityDie = getOrCreateGlobalVariableDIE(GV, {}); 1074 else 1075 EntityDie = getDIE(Entity); 1076 assert(EntityDie); 1077 addSourceLine(*IMDie, Module->getLine(), Module->getFile()); 1078 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie); 1079 StringRef Name = Module->getName(); 1080 if (!Name.empty()) 1081 addString(*IMDie, dwarf::DW_AT_name, Name); 1082 1083 return IMDie; 1084 } 1085 1086 void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram *SP) { 1087 DIE *D = getDIE(SP); 1088 if (DIE *AbsSPDIE = getAbstractSPDies().lookup(SP)) { 1089 if (D) 1090 // If this subprogram has an abstract definition, reference that 1091 addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE); 1092 } else { 1093 assert(D || includeMinimalInlineScopes()); 1094 if (D) 1095 // And attach the attributes 1096 applySubprogramAttributesToDefinition(SP, *D); 1097 } 1098 } 1099 1100 void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) { 1101 DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity()); 1102 1103 auto *Die = Entity->getDIE(); 1104 /// Label may be used to generate DW_AT_low_pc, so put it outside 1105 /// if/else block. 1106 const DbgLabel *Label = nullptr; 1107 if (AbsEntity && AbsEntity->getDIE()) { 1108 addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE()); 1109 Label = dyn_cast<const DbgLabel>(Entity); 1110 } else { 1111 if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity)) 1112 applyVariableAttributes(*Var, *Die); 1113 else if ((Label = dyn_cast<const DbgLabel>(Entity))) 1114 applyLabelAttributes(*Label, *Die); 1115 else 1116 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel."); 1117 } 1118 1119 if (Label) 1120 if (const auto *Sym = Label->getSymbol()) 1121 addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym); 1122 } 1123 1124 DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) { 1125 auto &AbstractEntities = getAbstractEntities(); 1126 auto I = AbstractEntities.find(Node); 1127 if (I != AbstractEntities.end()) 1128 return I->second.get(); 1129 return nullptr; 1130 } 1131 1132 void DwarfCompileUnit::createAbstractEntity(const DINode *Node, 1133 LexicalScope *Scope) { 1134 assert(Scope && Scope->isAbstractScope()); 1135 auto &Entity = getAbstractEntities()[Node]; 1136 if (isa<const DILocalVariable>(Node)) { 1137 Entity = std::make_unique<DbgVariable>( 1138 cast<const DILocalVariable>(Node), nullptr /* IA */);; 1139 DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get())); 1140 } else if (isa<const DILabel>(Node)) { 1141 Entity = std::make_unique<DbgLabel>( 1142 cast<const DILabel>(Node), nullptr /* IA */); 1143 DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get())); 1144 } 1145 } 1146 1147 void DwarfCompileUnit::emitHeader(bool UseOffsets) { 1148 // Don't bother labeling the .dwo unit, as its offset isn't used. 1149 if (!Skeleton && !DD->useSectionsAsReferences()) { 1150 LabelBegin = Asm->createTempSymbol("cu_begin"); 1151 Asm->OutStreamer->emitLabel(LabelBegin); 1152 } 1153 1154 dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile 1155 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton 1156 : dwarf::DW_UT_compile; 1157 DwarfUnit::emitCommonHeader(UseOffsets, UT); 1158 if (DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile) 1159 Asm->emitInt64(getDWOId()); 1160 } 1161 1162 bool DwarfCompileUnit::hasDwarfPubSections() const { 1163 switch (CUNode->getNameTableKind()) { 1164 case DICompileUnit::DebugNameTableKind::None: 1165 return false; 1166 // Opting in to GNU Pubnames/types overrides the default to ensure these are 1167 // generated for things like Gold's gdb_index generation. 1168 case DICompileUnit::DebugNameTableKind::GNU: 1169 return true; 1170 case DICompileUnit::DebugNameTableKind::Default: 1171 return DD->tuneForGDB() && !includeMinimalInlineScopes() && 1172 !CUNode->isDebugDirectivesOnly() && 1173 DD->getAccelTableKind() != AccelTableKind::Apple && 1174 DD->getDwarfVersion() < 5; 1175 } 1176 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum"); 1177 } 1178 1179 /// addGlobalName - Add a new global name to the compile unit. 1180 void DwarfCompileUnit::addGlobalName(StringRef Name, const DIE &Die, 1181 const DIScope *Context) { 1182 if (!hasDwarfPubSections()) 1183 return; 1184 std::string FullName = getParentContextString(Context) + Name.str(); 1185 GlobalNames[FullName] = &Die; 1186 } 1187 1188 void DwarfCompileUnit::addGlobalNameForTypeUnit(StringRef Name, 1189 const DIScope *Context) { 1190 if (!hasDwarfPubSections()) 1191 return; 1192 std::string FullName = getParentContextString(Context) + Name.str(); 1193 // Insert, allowing the entry to remain as-is if it's already present 1194 // This way the CU-level type DIE is preferred over the "can't describe this 1195 // type as a unit offset because it's not really in the CU at all, it's only 1196 // in a type unit" 1197 GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie())); 1198 } 1199 1200 /// Add a new global type to the unit. 1201 void DwarfCompileUnit::addGlobalType(const DIType *Ty, const DIE &Die, 1202 const DIScope *Context) { 1203 if (!hasDwarfPubSections()) 1204 return; 1205 std::string FullName = getParentContextString(Context) + Ty->getName().str(); 1206 GlobalTypes[FullName] = &Die; 1207 } 1208 1209 void DwarfCompileUnit::addGlobalTypeUnitType(const DIType *Ty, 1210 const DIScope *Context) { 1211 if (!hasDwarfPubSections()) 1212 return; 1213 std::string FullName = getParentContextString(Context) + Ty->getName().str(); 1214 // Insert, allowing the entry to remain as-is if it's already present 1215 // This way the CU-level type DIE is preferred over the "can't describe this 1216 // type as a unit offset because it's not really in the CU at all, it's only 1217 // in a type unit" 1218 GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie())); 1219 } 1220 1221 void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die, 1222 MachineLocation Location) { 1223 if (DV.hasComplexAddress()) 1224 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location); 1225 else 1226 addAddress(Die, dwarf::DW_AT_location, Location); 1227 } 1228 1229 /// Add an address attribute to a die based on the location provided. 1230 void DwarfCompileUnit::addAddress(DIE &Die, dwarf::Attribute Attribute, 1231 const MachineLocation &Location) { 1232 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1233 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1234 if (Location.isIndirect()) 1235 DwarfExpr.setMemoryLocationKind(); 1236 1237 DIExpressionCursor Cursor({}); 1238 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 1239 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1240 return; 1241 DwarfExpr.addExpression(std::move(Cursor)); 1242 1243 // Now attach the location information to the DIE. 1244 addBlock(Die, Attribute, DwarfExpr.finalize()); 1245 1246 if (DwarfExpr.TagOffset) 1247 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 1248 *DwarfExpr.TagOffset); 1249 } 1250 1251 /// Start with the address based on the location provided, and generate the 1252 /// DWARF information necessary to find the actual variable given the extra 1253 /// address information encoded in the DbgVariable, starting from the starting 1254 /// location. Add the DWARF information to the die. 1255 void DwarfCompileUnit::addComplexAddress(const DbgVariable &DV, DIE &Die, 1256 dwarf::Attribute Attribute, 1257 const MachineLocation &Location) { 1258 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1259 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1260 const DIExpression *DIExpr = DV.getSingleExpression(); 1261 DwarfExpr.addFragmentOffset(DIExpr); 1262 if (Location.isIndirect()) 1263 DwarfExpr.setMemoryLocationKind(); 1264 1265 DIExpressionCursor Cursor(DIExpr); 1266 1267 if (DIExpr->isEntryValue()) { 1268 DwarfExpr.setEntryValueFlag(); 1269 DwarfExpr.beginEntryValueExpression(Cursor); 1270 } 1271 1272 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 1273 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1274 return; 1275 DwarfExpr.addExpression(std::move(Cursor)); 1276 1277 // Now attach the location information to the DIE. 1278 addBlock(Die, Attribute, DwarfExpr.finalize()); 1279 1280 if (DwarfExpr.TagOffset) 1281 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 1282 *DwarfExpr.TagOffset); 1283 } 1284 1285 /// Add a Dwarf loclistptr attribute data and value. 1286 void DwarfCompileUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute, 1287 unsigned Index) { 1288 dwarf::Form Form = dwarf::DW_FORM_data4; 1289 if (DD->getDwarfVersion() == 4) 1290 Form =dwarf::DW_FORM_sec_offset; 1291 if (DD->getDwarfVersion() >= 5) 1292 Form =dwarf::DW_FORM_loclistx; 1293 Die.addValue(DIEValueAllocator, Attribute, Form, DIELocList(Index)); 1294 } 1295 1296 void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var, 1297 DIE &VariableDie) { 1298 StringRef Name = Var.getName(); 1299 if (!Name.empty()) 1300 addString(VariableDie, dwarf::DW_AT_name, Name); 1301 const auto *DIVar = Var.getVariable(); 1302 if (DIVar) 1303 if (uint32_t AlignInBytes = DIVar->getAlignInBytes()) 1304 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, 1305 AlignInBytes); 1306 1307 addSourceLine(VariableDie, DIVar); 1308 addType(VariableDie, Var.getType()); 1309 if (Var.isArtificial()) 1310 addFlag(VariableDie, dwarf::DW_AT_artificial); 1311 } 1312 1313 void DwarfCompileUnit::applyLabelAttributes(const DbgLabel &Label, 1314 DIE &LabelDie) { 1315 StringRef Name = Label.getName(); 1316 if (!Name.empty()) 1317 addString(LabelDie, dwarf::DW_AT_name, Name); 1318 const auto *DILabel = Label.getLabel(); 1319 addSourceLine(LabelDie, DILabel); 1320 } 1321 1322 /// Add a Dwarf expression attribute data and value. 1323 void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form, 1324 const MCExpr *Expr) { 1325 Die.addValue(DIEValueAllocator, (dwarf::Attribute)0, Form, DIEExpr(Expr)); 1326 } 1327 1328 void DwarfCompileUnit::applySubprogramAttributesToDefinition( 1329 const DISubprogram *SP, DIE &SPDie) { 1330 auto *SPDecl = SP->getDeclaration(); 1331 auto *Context = SPDecl ? SPDecl->getScope() : SP->getScope(); 1332 applySubprogramAttributes(SP, SPDie, includeMinimalInlineScopes()); 1333 addGlobalName(SP->getName(), SPDie, Context); 1334 } 1335 1336 bool DwarfCompileUnit::isDwoUnit() const { 1337 return DD->useSplitDwarf() && Skeleton; 1338 } 1339 1340 void DwarfCompileUnit::finishNonUnitTypeDIE(DIE& D, const DICompositeType *CTy) { 1341 constructTypeDIE(D, CTy); 1342 } 1343 1344 bool DwarfCompileUnit::includeMinimalInlineScopes() const { 1345 return getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly || 1346 (DD->useSplitDwarf() && !Skeleton); 1347 } 1348 1349 void DwarfCompileUnit::addAddrTableBase() { 1350 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1351 MCSymbol *Label = DD->getAddressPool().getLabel(); 1352 addSectionLabel(getUnitDie(), 1353 getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base 1354 : dwarf::DW_AT_GNU_addr_base, 1355 Label, TLOF.getDwarfAddrSection()->getBeginSymbol()); 1356 } 1357 1358 void DwarfCompileUnit::addBaseTypeRef(DIEValueList &Die, int64_t Idx) { 1359 Die.addValue(DIEValueAllocator, (dwarf::Attribute)0, dwarf::DW_FORM_udata, 1360 new (DIEValueAllocator) DIEBaseTypeRef(this, Idx)); 1361 } 1362 1363 void DwarfCompileUnit::createBaseTypeDIEs() { 1364 // Insert the base_type DIEs directly after the CU so that their offsets will 1365 // fit in the fixed size ULEB128 used inside the location expressions. 1366 // Maintain order by iterating backwards and inserting to the front of CU 1367 // child list. 1368 for (auto &Btr : reverse(ExprRefedBaseTypes)) { 1369 DIE &Die = getUnitDie().addChildFront( 1370 DIE::get(DIEValueAllocator, dwarf::DW_TAG_base_type)); 1371 SmallString<32> Str; 1372 addString(Die, dwarf::DW_AT_name, 1373 Twine(dwarf::AttributeEncodingString(Btr.Encoding) + 1374 "_" + Twine(Btr.BitSize)).toStringRef(Str)); 1375 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding); 1376 addUInt(Die, dwarf::DW_AT_byte_size, None, Btr.BitSize / 8); 1377 1378 Btr.Die = &Die; 1379 } 1380 } 1381