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 "DwarfExpression.h" 16 #include "llvm/ADT/STLExtras.h" 17 #include "llvm/ADT/SmallString.h" 18 #include "llvm/BinaryFormat/Dwarf.h" 19 #include "llvm/CodeGen/AsmPrinter.h" 20 #include "llvm/CodeGen/DIE.h" 21 #include "llvm/CodeGen/MachineFunction.h" 22 #include "llvm/CodeGen/MachineInstr.h" 23 #include "llvm/CodeGen/TargetFrameLowering.h" 24 #include "llvm/CodeGen/TargetRegisterInfo.h" 25 #include "llvm/CodeGen/TargetSubtargetInfo.h" 26 #include "llvm/IR/DataLayout.h" 27 #include "llvm/IR/DebugInfo.h" 28 #include "llvm/IR/GlobalVariable.h" 29 #include "llvm/MC/MCAsmInfo.h" 30 #include "llvm/MC/MCSection.h" 31 #include "llvm/MC/MCStreamer.h" 32 #include "llvm/MC/MCSymbol.h" 33 #include "llvm/MC/MCSymbolWasm.h" 34 #include "llvm/MC/MachineLocation.h" 35 #include "llvm/Target/TargetLoweringObjectFile.h" 36 #include "llvm/Target/TargetMachine.h" 37 #include "llvm/Target/TargetOptions.h" 38 #include <iterator> 39 #include <optional> 40 #include <string> 41 #include <utility> 42 43 using namespace llvm; 44 45 static dwarf::Tag GetCompileUnitType(UnitKind Kind, DwarfDebug *DW) { 46 47 // According to DWARF Debugging Information Format Version 5, 48 // 3.1.2 Skeleton Compilation Unit Entries: 49 // "When generating a split DWARF object file (see Section 7.3.2 50 // on page 187), the compilation unit in the .debug_info section 51 // is a "skeleton" compilation unit with the tag DW_TAG_skeleton_unit" 52 if (DW->getDwarfVersion() >= 5 && Kind == UnitKind::Skeleton) 53 return dwarf::DW_TAG_skeleton_unit; 54 55 return dwarf::DW_TAG_compile_unit; 56 } 57 58 DwarfCompileUnit::DwarfCompileUnit(unsigned UID, const DICompileUnit *Node, 59 AsmPrinter *A, DwarfDebug *DW, 60 DwarfFile *DWU, UnitKind Kind) 61 : DwarfUnit(GetCompileUnitType(Kind, DW), Node, A, DW, DWU), UniqueID(UID) { 62 insertDIE(Node, &getUnitDie()); 63 MacroLabelBegin = Asm->createTempSymbol("cu_macro_begin"); 64 } 65 66 /// addLabelAddress - Add a dwarf label attribute data and value using 67 /// DW_FORM_addr or DW_FORM_GNU_addr_index. 68 void DwarfCompileUnit::addLabelAddress(DIE &Die, dwarf::Attribute Attribute, 69 const MCSymbol *Label) { 70 if ((Skeleton || !DD->useSplitDwarf()) && Label) 71 DD->addArangeLabel(SymbolCU(this, Label)); 72 73 // Don't use the address pool in non-fission or in the skeleton unit itself. 74 if ((!DD->useSplitDwarf() || !Skeleton) && DD->getDwarfVersion() < 5) 75 return addLocalLabelAddress(Die, Attribute, Label); 76 77 bool UseAddrOffsetFormOrExpressions = 78 DD->useAddrOffsetForm() || DD->useAddrOffsetExpressions(); 79 80 const MCSymbol *Base = nullptr; 81 if (Label->isInSection() && UseAddrOffsetFormOrExpressions) 82 Base = DD->getSectionLabel(&Label->getSection()); 83 84 if (!Base || Base == Label) { 85 unsigned idx = DD->getAddressPool().getIndex(Label); 86 addAttribute(Die, Attribute, 87 DD->getDwarfVersion() >= 5 ? dwarf::DW_FORM_addrx 88 : dwarf::DW_FORM_GNU_addr_index, 89 DIEInteger(idx)); 90 return; 91 } 92 93 // Could be extended to work with DWARFv4 Split DWARF if that's important for 94 // someone. In that case DW_FORM_data would be used. 95 assert(DD->getDwarfVersion() >= 5 && 96 "Addr+offset expressions are only valuable when using debug_addr (to " 97 "reduce relocations) available in DWARFv5 or higher"); 98 if (DD->useAddrOffsetExpressions()) { 99 auto *Loc = new (DIEValueAllocator) DIEBlock(); 100 addPoolOpAddress(*Loc, Label); 101 addBlock(Die, Attribute, dwarf::DW_FORM_exprloc, Loc); 102 } else 103 addAttribute(Die, Attribute, dwarf::DW_FORM_LLVM_addrx_offset, 104 new (DIEValueAllocator) DIEAddrOffset( 105 DD->getAddressPool().getIndex(Base), Label, Base)); 106 } 107 108 void DwarfCompileUnit::addLocalLabelAddress(DIE &Die, 109 dwarf::Attribute Attribute, 110 const MCSymbol *Label) { 111 if (Label) 112 addAttribute(Die, Attribute, dwarf::DW_FORM_addr, DIELabel(Label)); 113 else 114 addAttribute(Die, Attribute, dwarf::DW_FORM_addr, DIEInteger(0)); 115 } 116 117 unsigned DwarfCompileUnit::getOrCreateSourceID(const DIFile *File) { 118 // If we print assembly, we can't separate .file entries according to 119 // compile units. Thus all files will belong to the default compile unit. 120 121 // FIXME: add a better feature test than hasRawTextSupport. Even better, 122 // extend .file to support this. 123 unsigned CUID = Asm->OutStreamer->hasRawTextSupport() ? 0 : getUniqueID(); 124 if (!File) 125 return Asm->OutStreamer->emitDwarfFileDirective(0, "", "", std::nullopt, 126 std::nullopt, CUID); 127 128 if (LastFile != File) { 129 LastFile = File; 130 LastFileID = Asm->OutStreamer->emitDwarfFileDirective( 131 0, File->getDirectory(), File->getFilename(), DD->getMD5AsBytes(File), 132 File->getSource(), CUID); 133 } 134 return LastFileID; 135 } 136 137 DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE( 138 const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) { 139 // Check for pre-existence. 140 if (DIE *Die = getDIE(GV)) 141 return Die; 142 143 assert(GV); 144 145 auto *GVContext = GV->getScope(); 146 const DIType *GTy = GV->getType(); 147 148 auto *CB = GVContext ? dyn_cast<DICommonBlock>(GVContext) : nullptr; 149 DIE *ContextDIE = CB ? getOrCreateCommonBlock(CB, GlobalExprs) 150 : getOrCreateContextDIE(GVContext); 151 152 // Add to map. 153 DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV); 154 DIScope *DeclContext; 155 if (auto *SDMDecl = GV->getStaticDataMemberDeclaration()) { 156 DeclContext = SDMDecl->getScope(); 157 assert(SDMDecl->isStaticMember() && "Expected static member decl"); 158 assert(GV->isDefinition()); 159 // We need the declaration DIE that is in the static member's class. 160 DIE *VariableSpecDIE = getOrCreateStaticMemberDIE(SDMDecl); 161 addDIEEntry(*VariableDIE, dwarf::DW_AT_specification, *VariableSpecDIE); 162 // If the global variable's type is different from the one in the class 163 // member type, assume that it's more specific and also emit it. 164 if (GTy != SDMDecl->getBaseType()) 165 addType(*VariableDIE, GTy); 166 } else { 167 DeclContext = GV->getScope(); 168 // Add name and type. 169 StringRef DisplayName = GV->getDisplayName(); 170 if (!DisplayName.empty()) 171 addString(*VariableDIE, dwarf::DW_AT_name, GV->getDisplayName()); 172 if (GTy) 173 addType(*VariableDIE, GTy); 174 175 // Add scoping info. 176 if (!GV->isLocalToUnit()) 177 addFlag(*VariableDIE, dwarf::DW_AT_external); 178 179 // Add line number info. 180 addSourceLine(*VariableDIE, GV); 181 } 182 183 if (!GV->isDefinition()) 184 addFlag(*VariableDIE, dwarf::DW_AT_declaration); 185 else 186 addGlobalName(GV->getName(), *VariableDIE, DeclContext); 187 188 addAnnotation(*VariableDIE, GV->getAnnotations()); 189 190 if (uint32_t AlignInBytes = GV->getAlignInBytes()) 191 addUInt(*VariableDIE, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, 192 AlignInBytes); 193 194 if (MDTuple *TP = GV->getTemplateParams()) 195 addTemplateParams(*VariableDIE, DINodeArray(TP)); 196 197 // Add location. 198 addLocationAttribute(VariableDIE, GV, GlobalExprs); 199 200 return VariableDIE; 201 } 202 203 void DwarfCompileUnit::addLocationAttribute( 204 DIE *VariableDIE, const DIGlobalVariable *GV, ArrayRef<GlobalExpr> GlobalExprs) { 205 bool addToAccelTable = false; 206 DIELoc *Loc = nullptr; 207 std::optional<unsigned> NVPTXAddressSpace; 208 std::unique_ptr<DIEDwarfExpression> DwarfExpr; 209 for (const auto &GE : GlobalExprs) { 210 const GlobalVariable *Global = GE.Var; 211 const DIExpression *Expr = GE.Expr; 212 213 // For compatibility with DWARF 3 and earlier, 214 // DW_AT_location(DW_OP_constu, X, DW_OP_stack_value) or 215 // DW_AT_location(DW_OP_consts, X, DW_OP_stack_value) becomes 216 // DW_AT_const_value(X). 217 if (GlobalExprs.size() == 1 && Expr && Expr->isConstant()) { 218 addToAccelTable = true; 219 addConstantValue( 220 *VariableDIE, 221 DIExpression::SignedOrUnsignedConstant::UnsignedConstant == 222 *Expr->isConstant(), 223 Expr->getElement(1)); 224 break; 225 } 226 227 // We cannot describe the location of dllimport'd variables: the 228 // computation of their address requires loads from the IAT. 229 if (Global && Global->hasDLLImportStorageClass()) 230 continue; 231 232 // Nothing to describe without address or constant. 233 if (!Global && (!Expr || !Expr->isConstant())) 234 continue; 235 236 if (Global && Global->isThreadLocal() && 237 !Asm->getObjFileLowering().supportDebugThreadLocalLocation()) 238 continue; 239 240 if (!Loc) { 241 addToAccelTable = true; 242 Loc = new (DIEValueAllocator) DIELoc; 243 DwarfExpr = std::make_unique<DIEDwarfExpression>(*Asm, *this, *Loc); 244 } 245 246 if (Expr) { 247 // According to 248 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 249 // cuda-gdb requires DW_AT_address_class for all variables to be able to 250 // correctly interpret address space of the variable address. 251 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef 252 // sequence for the NVPTX + gdb target. 253 unsigned LocalNVPTXAddressSpace; 254 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 255 const DIExpression *NewExpr = 256 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace); 257 if (NewExpr != Expr) { 258 Expr = NewExpr; 259 NVPTXAddressSpace = LocalNVPTXAddressSpace; 260 } 261 } 262 DwarfExpr->addFragmentOffset(Expr); 263 } 264 265 if (Global) { 266 const MCSymbol *Sym = Asm->getSymbol(Global); 267 // 16-bit platforms like MSP430 and AVR take this path, so sink this 268 // assert to platforms that use it. 269 auto GetPointerSizedFormAndOp = [this]() { 270 unsigned PointerSize = Asm->MAI->getCodePointerSize(); 271 assert((PointerSize == 4 || PointerSize == 8) && 272 "Add support for other sizes if necessary"); 273 struct FormAndOp { 274 dwarf::Form Form; 275 dwarf::LocationAtom Op; 276 }; 277 return PointerSize == 4 278 ? FormAndOp{dwarf::DW_FORM_data4, dwarf::DW_OP_const4u} 279 : FormAndOp{dwarf::DW_FORM_data8, dwarf::DW_OP_const8u}; 280 }; 281 if (Global->isThreadLocal()) { 282 if (Asm->TM.getTargetTriple().isWasm()) { 283 // FIXME This is not guaranteed, but in practice, in static linking, 284 // if present, __tls_base's index is 1. This doesn't hold for dynamic 285 // linking, so TLS variables used in dynamic linking won't have 286 // correct debug info for now. See 287 // https://github.com/llvm/llvm-project/blob/19afbfe33156d211fa959dadeea46cd17b9c723c/lld/wasm/Driver.cpp#L786-L823 288 addWasmRelocBaseGlobal(Loc, "__tls_base", 1); 289 addOpAddress(*Loc, Sym); 290 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 291 } else if (Asm->TM.useEmulatedTLS()) { 292 // TODO: add debug info for emulated thread local mode. 293 } else { 294 // FIXME: Make this work with -gsplit-dwarf. 295 // Based on GCC's support for TLS: 296 if (!DD->useSplitDwarf()) { 297 auto FormAndOp = GetPointerSizedFormAndOp(); 298 // 1) Start with a constNu of the appropriate pointer size 299 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op); 300 // 2) containing the (relocated) offset of the TLS variable 301 // within the module's TLS block. 302 addExpr(*Loc, FormAndOp.Form, 303 Asm->getObjFileLowering().getDebugThreadLocalSymbol(Sym)); 304 } else { 305 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_GNU_const_index); 306 addUInt(*Loc, dwarf::DW_FORM_udata, 307 DD->getAddressPool().getIndex(Sym, /* TLS */ true)); 308 } 309 // 3) followed by an OP to make the debugger do a TLS lookup. 310 addUInt(*Loc, dwarf::DW_FORM_data1, 311 DD->useGNUTLSOpcode() ? dwarf::DW_OP_GNU_push_tls_address 312 : dwarf::DW_OP_form_tls_address); 313 } 314 } else if (Asm->TM.getTargetTriple().isWasm() && 315 Asm->TM.getRelocationModel() == Reloc::PIC_) { 316 // FIXME This is not guaranteed, but in practice, if present, 317 // __memory_base's index is 1. See 318 // https://github.com/llvm/llvm-project/blob/19afbfe33156d211fa959dadeea46cd17b9c723c/lld/wasm/Driver.cpp#L786-L823 319 addWasmRelocBaseGlobal(Loc, "__memory_base", 1); 320 addOpAddress(*Loc, Sym); 321 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 322 } else if ((Asm->TM.getRelocationModel() == Reloc::RWPI || 323 Asm->TM.getRelocationModel() == Reloc::ROPI_RWPI) && 324 !Asm->getObjFileLowering() 325 .getKindForGlobal(Global, Asm->TM) 326 .isReadOnly()) { 327 auto FormAndOp = GetPointerSizedFormAndOp(); 328 // Constant 329 addUInt(*Loc, dwarf::DW_FORM_data1, FormAndOp.Op); 330 // Relocation offset 331 addExpr(*Loc, FormAndOp.Form, 332 Asm->getObjFileLowering().getIndirectSymViaRWPI(Sym)); 333 // Base register 334 Register BaseReg = Asm->getObjFileLowering().getStaticBase(); 335 BaseReg = Asm->TM.getMCRegisterInfo()->getDwarfRegNum(BaseReg, false); 336 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_breg0 + BaseReg); 337 // Offset from base register 338 addSInt(*Loc, dwarf::DW_FORM_sdata, 0); 339 // Operation 340 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 341 } else { 342 DD->addArangeLabel(SymbolCU(this, Sym)); 343 addOpAddress(*Loc, Sym); 344 } 345 } 346 // Global variables attached to symbols are memory locations. 347 // It would be better if this were unconditional, but malformed input that 348 // mixes non-fragments and fragments for the same variable is too expensive 349 // to detect in the verifier. 350 if (DwarfExpr->isUnknownLocation()) 351 DwarfExpr->setMemoryLocationKind(); 352 DwarfExpr->addExpression(Expr); 353 } 354 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 355 // According to 356 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 357 // cuda-gdb requires DW_AT_address_class for all variables to be able to 358 // correctly interpret address space of the variable address. 359 const unsigned NVPTX_ADDR_global_space = 5; 360 addUInt(*VariableDIE, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1, 361 NVPTXAddressSpace.value_or(NVPTX_ADDR_global_space)); 362 } 363 if (Loc) 364 addBlock(*VariableDIE, dwarf::DW_AT_location, DwarfExpr->finalize()); 365 366 if (DD->useAllLinkageNames()) 367 addLinkageName(*VariableDIE, GV->getLinkageName()); 368 369 if (addToAccelTable) { 370 DD->addAccelName(*CUNode, GV->getName(), *VariableDIE); 371 372 // If the linkage name is different than the name, go ahead and output 373 // that as well into the name table. 374 if (GV->getLinkageName() != "" && GV->getName() != GV->getLinkageName() && 375 DD->useAllLinkageNames()) 376 DD->addAccelName(*CUNode, GV->getLinkageName(), *VariableDIE); 377 } 378 } 379 380 DIE *DwarfCompileUnit::getOrCreateCommonBlock( 381 const DICommonBlock *CB, ArrayRef<GlobalExpr> GlobalExprs) { 382 // Check for pre-existence. 383 if (DIE *NDie = getDIE(CB)) 384 return NDie; 385 DIE *ContextDIE = getOrCreateContextDIE(CB->getScope()); 386 DIE &NDie = createAndAddDIE(dwarf::DW_TAG_common_block, *ContextDIE, CB); 387 StringRef Name = CB->getName().empty() ? "_BLNK_" : CB->getName(); 388 addString(NDie, dwarf::DW_AT_name, Name); 389 addGlobalName(Name, NDie, CB->getScope()); 390 if (CB->getFile()) 391 addSourceLine(NDie, CB->getLineNo(), CB->getFile()); 392 if (DIGlobalVariable *V = CB->getDecl()) 393 getCU().addLocationAttribute(&NDie, V, GlobalExprs); 394 return &NDie; 395 } 396 397 void DwarfCompileUnit::addRange(RangeSpan Range) { 398 DD->insertSectionLabel(Range.Begin); 399 400 auto *PrevCU = DD->getPrevCU(); 401 bool SameAsPrevCU = this == PrevCU; 402 DD->setPrevCU(this); 403 // If we have no current ranges just add the range and return, otherwise, 404 // check the current section and CU against the previous section and CU we 405 // emitted into and the subprogram was contained within. If these are the 406 // same then extend our current range, otherwise add this as a new range. 407 if (CURanges.empty() || !SameAsPrevCU || 408 (&CURanges.back().End->getSection() != 409 &Range.End->getSection())) { 410 // Before a new range is added, always terminate the prior line table. 411 if (PrevCU) 412 DD->terminateLineTable(PrevCU); 413 CURanges.push_back(Range); 414 return; 415 } 416 417 CURanges.back().End = Range.End; 418 } 419 420 void DwarfCompileUnit::initStmtList() { 421 if (CUNode->isDebugDirectivesOnly()) 422 return; 423 424 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 425 if (DD->useSectionsAsReferences()) { 426 LineTableStartSym = TLOF.getDwarfLineSection()->getBeginSymbol(); 427 } else { 428 LineTableStartSym = 429 Asm->OutStreamer->getDwarfLineTableSymbol(getUniqueID()); 430 } 431 432 // DW_AT_stmt_list is a offset of line number information for this 433 // compile unit in debug_line section. For split dwarf this is 434 // left in the skeleton CU and so not included. 435 // The line table entries are not always emitted in assembly, so it 436 // is not okay to use line_table_start here. 437 addSectionLabel(getUnitDie(), dwarf::DW_AT_stmt_list, LineTableStartSym, 438 TLOF.getDwarfLineSection()->getBeginSymbol()); 439 } 440 441 void DwarfCompileUnit::applyStmtList(DIE &D) { 442 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 443 addSectionLabel(D, dwarf::DW_AT_stmt_list, LineTableStartSym, 444 TLOF.getDwarfLineSection()->getBeginSymbol()); 445 } 446 447 void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin, 448 const MCSymbol *End) { 449 assert(Begin && "Begin label should not be null!"); 450 assert(End && "End label should not be null!"); 451 assert(Begin->isDefined() && "Invalid starting label"); 452 assert(End->isDefined() && "Invalid end label"); 453 454 addLabelAddress(D, dwarf::DW_AT_low_pc, Begin); 455 if (DD->getDwarfVersion() < 4) 456 addLabelAddress(D, dwarf::DW_AT_high_pc, End); 457 else 458 addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin); 459 } 460 461 // Find DIE for the given subprogram and attach appropriate DW_AT_low_pc 462 // and DW_AT_high_pc attributes. If there are global variables in this 463 // scope then create and insert DIEs for these variables. 464 DIE &DwarfCompileUnit::updateSubprogramScopeDIE(const DISubprogram *SP) { 465 DIE *SPDie = getOrCreateSubprogramDIE(SP, includeMinimalInlineScopes()); 466 auto *ContextCU = static_cast<DwarfCompileUnit *>(SPDie->getUnit()); 467 return ContextCU->updateSubprogramScopeDIEImpl(SP, SPDie); 468 } 469 470 // Add info for Wasm-global-based relocation. 471 // 'GlobalIndex' is used for split dwarf, which currently relies on a few 472 // assumptions that are not guaranteed in a formal way but work in practice. 473 void DwarfCompileUnit::addWasmRelocBaseGlobal(DIELoc *Loc, StringRef GlobalName, 474 uint64_t GlobalIndex) { 475 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h 476 // don't want to depend on target specific headers in this code? 477 const unsigned TI_GLOBAL_RELOC = 3; 478 unsigned PointerSize = Asm->getDataLayout().getPointerSize(); 479 auto *Sym = cast<MCSymbolWasm>(Asm->GetExternalSymbolSymbol(GlobalName)); 480 // FIXME: this repeats what WebAssemblyMCInstLower:: 481 // GetExternalSymbolSymbol does, since if there's no code that 482 // refers to this symbol, we have to set it here. 483 Sym->setType(wasm::WASM_SYMBOL_TYPE_GLOBAL); 484 Sym->setGlobalType(wasm::WasmGlobalType{ 485 static_cast<uint8_t>(PointerSize == 4 ? wasm::WASM_TYPE_I32 486 : wasm::WASM_TYPE_I64), 487 true}); 488 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_WASM_location); 489 addSInt(*Loc, dwarf::DW_FORM_sdata, TI_GLOBAL_RELOC); 490 if (!isDwoUnit()) { 491 addLabel(*Loc, dwarf::DW_FORM_data4, Sym); 492 } else { 493 // FIXME: when writing dwo, we need to avoid relocations. Probably 494 // the "right" solution is to treat globals the way func and data 495 // symbols are (with entries in .debug_addr). 496 // For now we hardcode the indices in the callsites. Global indices are not 497 // fixed, but in practice a few are fixed; for example, __stack_pointer is 498 // always index 0. 499 addUInt(*Loc, dwarf::DW_FORM_data4, GlobalIndex); 500 } 501 } 502 503 DIE &DwarfCompileUnit::updateSubprogramScopeDIEImpl(const DISubprogram *SP, 504 DIE *SPDie) { 505 SmallVector<RangeSpan, 2> BB_List; 506 // If basic block sections are on, ranges for each basic block section has 507 // to be emitted separately. 508 for (const auto &R : Asm->MBBSectionRanges) 509 BB_List.push_back({R.second.BeginLabel, R.second.EndLabel}); 510 511 attachRangesOrLowHighPC(*SPDie, BB_List); 512 513 if (DD->useAppleExtensionAttributes() && 514 !DD->getCurrentFunction()->getTarget().Options.DisableFramePointerElim( 515 *DD->getCurrentFunction())) 516 addFlag(*SPDie, dwarf::DW_AT_APPLE_omit_frame_ptr); 517 518 // Only include DW_AT_frame_base in full debug info 519 if (!includeMinimalInlineScopes()) { 520 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering(); 521 TargetFrameLowering::DwarfFrameBase FrameBase = 522 TFI->getDwarfFrameBase(*Asm->MF); 523 switch (FrameBase.Kind) { 524 case TargetFrameLowering::DwarfFrameBase::Register: { 525 if (Register::isPhysicalRegister(FrameBase.Location.Reg)) { 526 MachineLocation Location(FrameBase.Location.Reg); 527 addAddress(*SPDie, dwarf::DW_AT_frame_base, Location); 528 } 529 break; 530 } 531 case TargetFrameLowering::DwarfFrameBase::CFA: { 532 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 533 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_call_frame_cfa); 534 if (FrameBase.Location.Offset != 0) { 535 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_consts); 536 addSInt(*Loc, dwarf::DW_FORM_sdata, FrameBase.Location.Offset); 537 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_plus); 538 } 539 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc); 540 break; 541 } 542 case TargetFrameLowering::DwarfFrameBase::WasmFrameBase: { 543 // FIXME: duplicated from Target/WebAssembly/WebAssembly.h 544 const unsigned TI_GLOBAL_RELOC = 3; 545 if (FrameBase.Location.WasmLoc.Kind == TI_GLOBAL_RELOC) { 546 // These need to be relocatable. 547 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 548 assert(FrameBase.Location.WasmLoc.Index == 0); // Only SP so far. 549 // For now, since we only ever use index 0, this should work as-is. 550 addWasmRelocBaseGlobal(Loc, "__stack_pointer", 551 FrameBase.Location.WasmLoc.Index); 552 addUInt(*Loc, dwarf::DW_FORM_data1, dwarf::DW_OP_stack_value); 553 addBlock(*SPDie, dwarf::DW_AT_frame_base, Loc); 554 } else { 555 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 556 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 557 DIExpressionCursor Cursor({}); 558 DwarfExpr.addWasmLocation(FrameBase.Location.WasmLoc.Kind, 559 FrameBase.Location.WasmLoc.Index); 560 DwarfExpr.addExpression(std::move(Cursor)); 561 addBlock(*SPDie, dwarf::DW_AT_frame_base, DwarfExpr.finalize()); 562 } 563 break; 564 } 565 } 566 } 567 568 // Add name to the name table, we do this here because we're guaranteed 569 // to have concrete versions of our DW_TAG_subprogram nodes. 570 DD->addSubprogramNames(*CUNode, SP, *SPDie); 571 572 return *SPDie; 573 } 574 575 // Construct a DIE for this scope. 576 void DwarfCompileUnit::constructScopeDIE(LexicalScope *Scope, 577 DIE &ParentScopeDIE) { 578 if (!Scope || !Scope->getScopeNode()) 579 return; 580 581 auto *DS = Scope->getScopeNode(); 582 583 assert((Scope->getInlinedAt() || !isa<DISubprogram>(DS)) && 584 "Only handle inlined subprograms here, use " 585 "constructSubprogramScopeDIE for non-inlined " 586 "subprograms"); 587 588 // Emit inlined subprograms. 589 if (Scope->getParent() && isa<DISubprogram>(DS)) { 590 DIE *ScopeDIE = constructInlinedScopeDIE(Scope, ParentScopeDIE); 591 assert(ScopeDIE && "Scope DIE should not be null."); 592 createAndAddScopeChildren(Scope, *ScopeDIE); 593 return; 594 } 595 596 // Early exit when we know the scope DIE is going to be null. 597 if (DD->isLexicalScopeDIENull(Scope)) 598 return; 599 600 // Emit lexical blocks. 601 DIE *ScopeDIE = constructLexicalScopeDIE(Scope); 602 assert(ScopeDIE && "Scope DIE should not be null."); 603 604 ParentScopeDIE.addChild(ScopeDIE); 605 createAndAddScopeChildren(Scope, *ScopeDIE); 606 } 607 608 void DwarfCompileUnit::addScopeRangeList(DIE &ScopeDIE, 609 SmallVector<RangeSpan, 2> Range) { 610 611 HasRangeLists = true; 612 613 // Add the range list to the set of ranges to be emitted. 614 auto IndexAndList = 615 (DD->getDwarfVersion() < 5 && Skeleton ? Skeleton->DU : DU) 616 ->addRange(*(Skeleton ? Skeleton : this), std::move(Range)); 617 618 uint32_t Index = IndexAndList.first; 619 auto &List = *IndexAndList.second; 620 621 // Under fission, ranges are specified by constant offsets relative to the 622 // CU's DW_AT_GNU_ranges_base. 623 // FIXME: For DWARF v5, do not generate the DW_AT_ranges attribute under 624 // fission until we support the forms using the .debug_addr section 625 // (DW_RLE_startx_endx etc.). 626 if (DD->getDwarfVersion() >= 5) 627 addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, Index); 628 else { 629 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 630 const MCSymbol *RangeSectionSym = 631 TLOF.getDwarfRangesSection()->getBeginSymbol(); 632 if (isDwoUnit()) 633 addSectionDelta(ScopeDIE, dwarf::DW_AT_ranges, List.Label, 634 RangeSectionSym); 635 else 636 addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges, List.Label, 637 RangeSectionSym); 638 } 639 } 640 641 void DwarfCompileUnit::attachRangesOrLowHighPC( 642 DIE &Die, SmallVector<RangeSpan, 2> Ranges) { 643 assert(!Ranges.empty()); 644 if (!DD->useRangesSection() || 645 (Ranges.size() == 1 && 646 (!DD->alwaysUseRanges(*this) || 647 DD->getSectionLabel(&Ranges.front().Begin->getSection()) == 648 Ranges.front().Begin))) { 649 const RangeSpan &Front = Ranges.front(); 650 const RangeSpan &Back = Ranges.back(); 651 attachLowHighPC(Die, Front.Begin, Back.End); 652 } else 653 addScopeRangeList(Die, std::move(Ranges)); 654 } 655 656 void DwarfCompileUnit::attachRangesOrLowHighPC( 657 DIE &Die, const SmallVectorImpl<InsnRange> &Ranges) { 658 SmallVector<RangeSpan, 2> List; 659 List.reserve(Ranges.size()); 660 for (const InsnRange &R : Ranges) { 661 auto *BeginLabel = DD->getLabelBeforeInsn(R.first); 662 auto *EndLabel = DD->getLabelAfterInsn(R.second); 663 664 const auto *BeginMBB = R.first->getParent(); 665 const auto *EndMBB = R.second->getParent(); 666 667 const auto *MBB = BeginMBB; 668 // Basic block sections allows basic block subsets to be placed in unique 669 // sections. For each section, the begin and end label must be added to the 670 // list. If there is more than one range, debug ranges must be used. 671 // Otherwise, low/high PC can be used. 672 // FIXME: Debug Info Emission depends on block order and this assumes that 673 // the order of blocks will be frozen beyond this point. 674 do { 675 if (MBB->sameSection(EndMBB) || MBB->isEndSection()) { 676 auto MBBSectionRange = Asm->MBBSectionRanges[MBB->getSectionIDNum()]; 677 List.push_back( 678 {MBB->sameSection(BeginMBB) ? BeginLabel 679 : MBBSectionRange.BeginLabel, 680 MBB->sameSection(EndMBB) ? EndLabel : MBBSectionRange.EndLabel}); 681 } 682 if (MBB->sameSection(EndMBB)) 683 break; 684 MBB = MBB->getNextNode(); 685 } while (true); 686 } 687 attachRangesOrLowHighPC(Die, std::move(List)); 688 } 689 690 DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope, 691 DIE &ParentScopeDIE) { 692 assert(Scope->getScopeNode()); 693 auto *DS = Scope->getScopeNode(); 694 auto *InlinedSP = getDISubprogram(DS); 695 // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram 696 // was inlined from another compile unit. 697 DIE *OriginDIE = getAbstractScopeDIEs()[InlinedSP]; 698 assert(OriginDIE && "Unable to find original DIE for an inlined subprogram."); 699 700 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_inlined_subroutine); 701 ParentScopeDIE.addChild(ScopeDIE); 702 addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE); 703 704 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); 705 706 // Add the call site information to the DIE. 707 const DILocation *IA = Scope->getInlinedAt(); 708 addUInt(*ScopeDIE, dwarf::DW_AT_call_file, std::nullopt, 709 getOrCreateSourceID(IA->getFile())); 710 addUInt(*ScopeDIE, dwarf::DW_AT_call_line, std::nullopt, IA->getLine()); 711 if (IA->getColumn()) 712 addUInt(*ScopeDIE, dwarf::DW_AT_call_column, std::nullopt, IA->getColumn()); 713 if (IA->getDiscriminator() && DD->getDwarfVersion() >= 4) 714 addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, std::nullopt, 715 IA->getDiscriminator()); 716 717 // Add name to the name table, we do this here because we're guaranteed 718 // to have concrete versions of our DW_TAG_inlined_subprogram nodes. 719 DD->addSubprogramNames(*CUNode, InlinedSP, *ScopeDIE); 720 721 return ScopeDIE; 722 } 723 724 // Construct new DW_TAG_lexical_block for this scope and attach 725 // DW_AT_low_pc/DW_AT_high_pc labels. 726 DIE *DwarfCompileUnit::constructLexicalScopeDIE(LexicalScope *Scope) { 727 if (DD->isLexicalScopeDIENull(Scope)) 728 return nullptr; 729 const auto *DS = Scope->getScopeNode(); 730 731 auto ScopeDIE = DIE::get(DIEValueAllocator, dwarf::DW_TAG_lexical_block); 732 if (Scope->isAbstractScope()) { 733 assert(!getAbstractScopeDIEs().count(DS) && 734 "Abstract DIE for this scope exists!"); 735 getAbstractScopeDIEs()[DS] = ScopeDIE; 736 return ScopeDIE; 737 } 738 if (!Scope->getInlinedAt()) { 739 assert(!LexicalBlockDIEs.count(DS) && 740 "Concrete out-of-line DIE for this scope exists!"); 741 LexicalBlockDIEs[DS] = ScopeDIE; 742 } 743 744 attachRangesOrLowHighPC(*ScopeDIE, Scope->getRanges()); 745 746 return ScopeDIE; 747 } 748 749 /// constructVariableDIE - Construct a DIE for the given DbgVariable. 750 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, bool Abstract) { 751 auto D = constructVariableDIEImpl(DV, Abstract); 752 DV.setDIE(*D); 753 return D; 754 } 755 756 DIE *DwarfCompileUnit::constructLabelDIE(DbgLabel &DL, 757 const LexicalScope &Scope) { 758 auto LabelDie = DIE::get(DIEValueAllocator, DL.getTag()); 759 insertDIE(DL.getLabel(), LabelDie); 760 DL.setDIE(*LabelDie); 761 762 if (Scope.isAbstractScope()) 763 applyLabelAttributes(DL, *LabelDie); 764 765 return LabelDie; 766 } 767 768 DIE *DwarfCompileUnit::constructVariableDIEImpl(const DbgVariable &DV, 769 bool Abstract) { 770 // Define variable debug information entry. 771 auto VariableDie = DIE::get(DIEValueAllocator, DV.getTag()); 772 insertDIE(DV.getVariable(), VariableDie); 773 774 if (Abstract) { 775 applyVariableAttributes(DV, *VariableDie); 776 return VariableDie; 777 } 778 779 // Add variable address. 780 781 unsigned Index = DV.getDebugLocListIndex(); 782 if (Index != ~0U) { 783 addLocationList(*VariableDie, dwarf::DW_AT_location, Index); 784 auto TagOffset = DV.getDebugLocListTagOffset(); 785 if (TagOffset) 786 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 787 *TagOffset); 788 return VariableDie; 789 } 790 791 // Check if variable has a single location description. 792 if (auto *DVal = DV.getValueLoc()) { 793 if (!DVal->isVariadic()) { 794 const DbgValueLocEntry *Entry = DVal->getLocEntries().begin(); 795 if (Entry->isLocation()) { 796 addVariableAddress(DV, *VariableDie, Entry->getLoc()); 797 } else if (Entry->isInt()) { 798 auto *Expr = DV.getSingleExpression(); 799 if (Expr && Expr->getNumElements()) { 800 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 801 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 802 // If there is an expression, emit raw unsigned bytes. 803 DwarfExpr.addFragmentOffset(Expr); 804 DwarfExpr.addUnsignedConstant(Entry->getInt()); 805 DwarfExpr.addExpression(Expr); 806 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 807 if (DwarfExpr.TagOffset) 808 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, 809 dwarf::DW_FORM_data1, *DwarfExpr.TagOffset); 810 } else 811 addConstantValue(*VariableDie, Entry->getInt(), DV.getType()); 812 } else if (Entry->isConstantFP()) { 813 addConstantFPValue(*VariableDie, Entry->getConstantFP()); 814 } else if (Entry->isConstantInt()) { 815 addConstantValue(*VariableDie, Entry->getConstantInt(), DV.getType()); 816 } else if (Entry->isTargetIndexLocation()) { 817 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 818 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 819 const DIBasicType *BT = dyn_cast<DIBasicType>( 820 static_cast<const Metadata *>(DV.getVariable()->getType())); 821 DwarfDebug::emitDebugLocValue(*Asm, BT, *DVal, DwarfExpr); 822 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 823 } 824 return VariableDie; 825 } 826 // If any of the location entries are registers with the value 0, then the 827 // location is undefined. 828 if (any_of(DVal->getLocEntries(), [](const DbgValueLocEntry &Entry) { 829 return Entry.isLocation() && !Entry.getLoc().getReg(); 830 })) 831 return VariableDie; 832 const DIExpression *Expr = DV.getSingleExpression(); 833 assert(Expr && "Variadic Debug Value must have an Expression."); 834 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 835 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 836 DwarfExpr.addFragmentOffset(Expr); 837 DIExpressionCursor Cursor(Expr); 838 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 839 840 auto AddEntry = [&](const DbgValueLocEntry &Entry, 841 DIExpressionCursor &Cursor) { 842 if (Entry.isLocation()) { 843 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, 844 Entry.getLoc().getReg())) 845 return false; 846 } else if (Entry.isInt()) { 847 // If there is an expression, emit raw unsigned bytes. 848 DwarfExpr.addUnsignedConstant(Entry.getInt()); 849 } else if (Entry.isConstantFP()) { 850 // DwarfExpression does not support arguments wider than 64 bits 851 // (see PR52584). 852 // TODO: Consider chunking expressions containing overly wide 853 // arguments into separate pointer-sized fragment expressions. 854 APInt RawBytes = Entry.getConstantFP()->getValueAPF().bitcastToAPInt(); 855 if (RawBytes.getBitWidth() > 64) 856 return false; 857 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue()); 858 } else if (Entry.isConstantInt()) { 859 APInt RawBytes = Entry.getConstantInt()->getValue(); 860 if (RawBytes.getBitWidth() > 64) 861 return false; 862 DwarfExpr.addUnsignedConstant(RawBytes.getZExtValue()); 863 } else if (Entry.isTargetIndexLocation()) { 864 TargetIndexLocation Loc = Entry.getTargetIndexLocation(); 865 // TODO TargetIndexLocation is a target-independent. Currently only the 866 // WebAssembly-specific encoding is supported. 867 assert(Asm->TM.getTargetTriple().isWasm()); 868 DwarfExpr.addWasmLocation(Loc.Index, static_cast<uint64_t>(Loc.Offset)); 869 } else { 870 llvm_unreachable("Unsupported Entry type."); 871 } 872 return true; 873 }; 874 875 if (!DwarfExpr.addExpression( 876 std::move(Cursor), 877 [&](unsigned Idx, DIExpressionCursor &Cursor) -> bool { 878 return AddEntry(DVal->getLocEntries()[Idx], Cursor); 879 })) 880 return VariableDie; 881 882 // Now attach the location information to the DIE. 883 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 884 if (DwarfExpr.TagOffset) 885 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 886 *DwarfExpr.TagOffset); 887 888 return VariableDie; 889 } 890 891 // .. else use frame index. 892 if (!DV.hasFrameIndexExprs()) 893 return VariableDie; 894 895 std::optional<unsigned> NVPTXAddressSpace; 896 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 897 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 898 for (const auto &Fragment : DV.getFrameIndexExprs()) { 899 Register FrameReg; 900 const DIExpression *Expr = Fragment.Expr; 901 const TargetFrameLowering *TFI = Asm->MF->getSubtarget().getFrameLowering(); 902 StackOffset Offset = 903 TFI->getFrameIndexReference(*Asm->MF, Fragment.FI, FrameReg); 904 DwarfExpr.addFragmentOffset(Expr); 905 906 auto *TRI = Asm->MF->getSubtarget().getRegisterInfo(); 907 SmallVector<uint64_t, 8> Ops; 908 TRI->getOffsetOpcodes(Offset, Ops); 909 910 // According to 911 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 912 // cuda-gdb requires DW_AT_address_class for all variables to be able to 913 // correctly interpret address space of the variable address. 914 // Decode DW_OP_constu <DWARF Address Space> DW_OP_swap DW_OP_xderef 915 // sequence for the NVPTX + gdb target. 916 unsigned LocalNVPTXAddressSpace; 917 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 918 const DIExpression *NewExpr = 919 DIExpression::extractAddressClass(Expr, LocalNVPTXAddressSpace); 920 if (NewExpr != Expr) { 921 Expr = NewExpr; 922 NVPTXAddressSpace = LocalNVPTXAddressSpace; 923 } 924 } 925 if (Expr) 926 Ops.append(Expr->elements_begin(), Expr->elements_end()); 927 DIExpressionCursor Cursor(Ops); 928 DwarfExpr.setMemoryLocationKind(); 929 if (const MCSymbol *FrameSymbol = Asm->getFunctionFrameSymbol()) 930 addOpAddress(*Loc, FrameSymbol); 931 else 932 DwarfExpr.addMachineRegExpression( 933 *Asm->MF->getSubtarget().getRegisterInfo(), Cursor, FrameReg); 934 DwarfExpr.addExpression(std::move(Cursor)); 935 } 936 if (Asm->TM.getTargetTriple().isNVPTX() && DD->tuneForGDB()) { 937 // According to 938 // https://docs.nvidia.com/cuda/archive/10.0/ptx-writers-guide-to-interoperability/index.html#cuda-specific-dwarf 939 // cuda-gdb requires DW_AT_address_class for all variables to be able to 940 // correctly interpret address space of the variable address. 941 const unsigned NVPTX_ADDR_local_space = 6; 942 addUInt(*VariableDie, dwarf::DW_AT_address_class, dwarf::DW_FORM_data1, 943 NVPTXAddressSpace.value_or(NVPTX_ADDR_local_space)); 944 } 945 addBlock(*VariableDie, dwarf::DW_AT_location, DwarfExpr.finalize()); 946 if (DwarfExpr.TagOffset) 947 addUInt(*VariableDie, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 948 *DwarfExpr.TagOffset); 949 950 return VariableDie; 951 } 952 953 DIE *DwarfCompileUnit::constructVariableDIE(DbgVariable &DV, 954 const LexicalScope &Scope, 955 DIE *&ObjectPointer) { 956 auto Var = constructVariableDIE(DV, Scope.isAbstractScope()); 957 if (DV.isObjectPointer()) 958 ObjectPointer = Var; 959 return Var; 960 } 961 962 /// Return all DIVariables that appear in count: expressions. 963 static SmallVector<const DIVariable *, 2> dependencies(DbgVariable *Var) { 964 SmallVector<const DIVariable *, 2> Result; 965 auto *Array = dyn_cast<DICompositeType>(Var->getType()); 966 if (!Array || Array->getTag() != dwarf::DW_TAG_array_type) 967 return Result; 968 if (auto *DLVar = Array->getDataLocation()) 969 Result.push_back(DLVar); 970 if (auto *AsVar = Array->getAssociated()) 971 Result.push_back(AsVar); 972 if (auto *AlVar = Array->getAllocated()) 973 Result.push_back(AlVar); 974 for (auto *El : Array->getElements()) { 975 if (auto *Subrange = dyn_cast<DISubrange>(El)) { 976 if (auto Count = Subrange->getCount()) 977 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count)) 978 Result.push_back(Dependency); 979 if (auto LB = Subrange->getLowerBound()) 980 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB)) 981 Result.push_back(Dependency); 982 if (auto UB = Subrange->getUpperBound()) 983 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB)) 984 Result.push_back(Dependency); 985 if (auto ST = Subrange->getStride()) 986 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST)) 987 Result.push_back(Dependency); 988 } else if (auto *GenericSubrange = dyn_cast<DIGenericSubrange>(El)) { 989 if (auto Count = GenericSubrange->getCount()) 990 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(Count)) 991 Result.push_back(Dependency); 992 if (auto LB = GenericSubrange->getLowerBound()) 993 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(LB)) 994 Result.push_back(Dependency); 995 if (auto UB = GenericSubrange->getUpperBound()) 996 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(UB)) 997 Result.push_back(Dependency); 998 if (auto ST = GenericSubrange->getStride()) 999 if (auto *Dependency = dyn_cast_if_present<DIVariable *>(ST)) 1000 Result.push_back(Dependency); 1001 } 1002 } 1003 return Result; 1004 } 1005 1006 /// Sort local variables so that variables appearing inside of helper 1007 /// expressions come first. 1008 static SmallVector<DbgVariable *, 8> 1009 sortLocalVars(SmallVectorImpl<DbgVariable *> &Input) { 1010 SmallVector<DbgVariable *, 8> Result; 1011 SmallVector<PointerIntPair<DbgVariable *, 1>, 8> WorkList; 1012 // Map back from a DIVariable to its containing DbgVariable. 1013 SmallDenseMap<const DILocalVariable *, DbgVariable *> DbgVar; 1014 // Set of DbgVariables in Result. 1015 SmallDenseSet<DbgVariable *, 8> Visited; 1016 // For cycle detection. 1017 SmallDenseSet<DbgVariable *, 8> Visiting; 1018 1019 // Initialize the worklist and the DIVariable lookup table. 1020 for (auto *Var : reverse(Input)) { 1021 DbgVar.insert({Var->getVariable(), Var}); 1022 WorkList.push_back({Var, 0}); 1023 } 1024 1025 // Perform a stable topological sort by doing a DFS. 1026 while (!WorkList.empty()) { 1027 auto Item = WorkList.back(); 1028 DbgVariable *Var = Item.getPointer(); 1029 bool visitedAllDependencies = Item.getInt(); 1030 WorkList.pop_back(); 1031 1032 assert(Var); 1033 1034 // Already handled. 1035 if (Visited.count(Var)) 1036 continue; 1037 1038 // Add to Result if all dependencies are visited. 1039 if (visitedAllDependencies) { 1040 Visited.insert(Var); 1041 Result.push_back(Var); 1042 continue; 1043 } 1044 1045 // Detect cycles. 1046 auto Res = Visiting.insert(Var); 1047 if (!Res.second) { 1048 assert(false && "dependency cycle in local variables"); 1049 return Result; 1050 } 1051 1052 // Push dependencies and this node onto the worklist, so that this node is 1053 // visited again after all of its dependencies are handled. 1054 WorkList.push_back({Var, 1}); 1055 for (const auto *Dependency : dependencies(Var)) { 1056 // Don't add dependency if it is in a different lexical scope or a global. 1057 if (const auto *Dep = dyn_cast<const DILocalVariable>(Dependency)) 1058 if (DbgVariable *Var = DbgVar.lookup(Dep)) 1059 WorkList.push_back({Var, 0}); 1060 } 1061 } 1062 return Result; 1063 } 1064 1065 DIE &DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub, 1066 LexicalScope *Scope) { 1067 DIE &ScopeDIE = updateSubprogramScopeDIE(Sub); 1068 auto *ContextCU = static_cast<DwarfCompileUnit *>(ScopeDIE.getUnit()); 1069 1070 if (Scope) { 1071 assert(!Scope->getInlinedAt()); 1072 assert(!Scope->isAbstractScope()); 1073 // Collect lexical scope children first. 1074 // ObjectPointer might be a local (non-argument) local variable if it's a 1075 // block's synthetic this pointer. 1076 if (DIE *ObjectPointer = 1077 ContextCU->createAndAddScopeChildren(Scope, ScopeDIE)) 1078 ContextCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, 1079 *ObjectPointer); 1080 } 1081 1082 // If this is a variadic function, add an unspecified parameter. 1083 DITypeRefArray FnArgs = Sub->getType()->getTypeArray(); 1084 1085 // If we have a single element of null, it is a function that returns void. 1086 // If we have more than one elements and the last one is null, it is a 1087 // variadic function. 1088 if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] && 1089 !includeMinimalInlineScopes()) 1090 ScopeDIE.addChild( 1091 DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters)); 1092 1093 return ScopeDIE; 1094 } 1095 1096 DIE *DwarfCompileUnit::createAndAddScopeChildren(LexicalScope *Scope, 1097 DIE &ScopeDIE) { 1098 DIE *ObjectPointer = nullptr; 1099 1100 // Emit function arguments (order is significant). 1101 auto Vars = DU->getScopeVariables().lookup(Scope); 1102 for (auto &DV : Vars.Args) 1103 ScopeDIE.addChild(constructVariableDIE(*DV.second, *Scope, ObjectPointer)); 1104 1105 // Emit local variables. 1106 auto Locals = sortLocalVars(Vars.Locals); 1107 for (DbgVariable *DV : Locals) 1108 ScopeDIE.addChild(constructVariableDIE(*DV, *Scope, ObjectPointer)); 1109 1110 // Emit labels. 1111 for (DbgLabel *DL : DU->getScopeLabels().lookup(Scope)) 1112 ScopeDIE.addChild(constructLabelDIE(*DL, *Scope)); 1113 1114 // Track other local entities (skipped in gmlt-like data). 1115 // This creates mapping between CU and a set of local declarations that 1116 // should be emitted for subprograms in this CU. 1117 if (!includeMinimalInlineScopes() && !Scope->getInlinedAt()) { 1118 auto &LocalDecls = DD->getLocalDeclsForScope(Scope->getScopeNode()); 1119 DeferredLocalDecls.insert(LocalDecls.begin(), LocalDecls.end()); 1120 } 1121 1122 // Emit inner lexical scopes. 1123 auto skipLexicalScope = [this](LexicalScope *S) -> bool { 1124 if (isa<DISubprogram>(S->getScopeNode())) 1125 return false; 1126 auto Vars = DU->getScopeVariables().lookup(S); 1127 if (!Vars.Args.empty() || !Vars.Locals.empty()) 1128 return false; 1129 return includeMinimalInlineScopes() || 1130 DD->getLocalDeclsForScope(S->getScopeNode()).empty(); 1131 }; 1132 for (LexicalScope *LS : Scope->getChildren()) { 1133 // If the lexical block doesn't have non-scope children, skip 1134 // its emission and put its children directly to the parent scope. 1135 if (skipLexicalScope(LS)) 1136 createAndAddScopeChildren(LS, ScopeDIE); 1137 else 1138 constructScopeDIE(LS, ScopeDIE); 1139 } 1140 1141 return ObjectPointer; 1142 } 1143 1144 void DwarfCompileUnit::constructAbstractSubprogramScopeDIE( 1145 LexicalScope *Scope) { 1146 auto *SP = cast<DISubprogram>(Scope->getScopeNode()); 1147 if (getAbstractScopeDIEs().count(SP)) 1148 return; 1149 1150 DIE *ContextDIE; 1151 DwarfCompileUnit *ContextCU = this; 1152 1153 if (includeMinimalInlineScopes()) 1154 ContextDIE = &getUnitDie(); 1155 // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with 1156 // the important distinction that the debug node is not associated with the 1157 // DIE (since the debug node will be associated with the concrete DIE, if 1158 // any). It could be refactored to some common utility function. 1159 else if (auto *SPDecl = SP->getDeclaration()) { 1160 ContextDIE = &getUnitDie(); 1161 getOrCreateSubprogramDIE(SPDecl); 1162 } else { 1163 ContextDIE = getOrCreateContextDIE(SP->getScope()); 1164 // The scope may be shared with a subprogram that has already been 1165 // constructed in another CU, in which case we need to construct this 1166 // subprogram in the same CU. 1167 ContextCU = DD->lookupCU(ContextDIE->getUnitDie()); 1168 } 1169 1170 // Passing null as the associated node because the abstract definition 1171 // shouldn't be found by lookup. 1172 DIE &AbsDef = ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, 1173 *ContextDIE, nullptr); 1174 1175 // Store the DIE before creating children. 1176 ContextCU->getAbstractScopeDIEs()[SP] = &AbsDef; 1177 1178 ContextCU->applySubprogramAttributesToDefinition(SP, AbsDef); 1179 ContextCU->addSInt(AbsDef, dwarf::DW_AT_inline, 1180 DD->getDwarfVersion() <= 4 ? std::optional<dwarf::Form>() 1181 : dwarf::DW_FORM_implicit_const, 1182 dwarf::DW_INL_inlined); 1183 if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, AbsDef)) 1184 ContextCU->addDIEEntry(AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); 1185 } 1186 1187 bool DwarfCompileUnit::useGNUAnalogForDwarf5Feature() const { 1188 return DD->getDwarfVersion() == 4 && !DD->tuneForLLDB(); 1189 } 1190 1191 dwarf::Tag DwarfCompileUnit::getDwarf5OrGNUTag(dwarf::Tag Tag) const { 1192 if (!useGNUAnalogForDwarf5Feature()) 1193 return Tag; 1194 switch (Tag) { 1195 case dwarf::DW_TAG_call_site: 1196 return dwarf::DW_TAG_GNU_call_site; 1197 case dwarf::DW_TAG_call_site_parameter: 1198 return dwarf::DW_TAG_GNU_call_site_parameter; 1199 default: 1200 llvm_unreachable("DWARF5 tag with no GNU analog"); 1201 } 1202 } 1203 1204 dwarf::Attribute 1205 DwarfCompileUnit::getDwarf5OrGNUAttr(dwarf::Attribute Attr) const { 1206 if (!useGNUAnalogForDwarf5Feature()) 1207 return Attr; 1208 switch (Attr) { 1209 case dwarf::DW_AT_call_all_calls: 1210 return dwarf::DW_AT_GNU_all_call_sites; 1211 case dwarf::DW_AT_call_target: 1212 return dwarf::DW_AT_GNU_call_site_target; 1213 case dwarf::DW_AT_call_origin: 1214 return dwarf::DW_AT_abstract_origin; 1215 case dwarf::DW_AT_call_return_pc: 1216 return dwarf::DW_AT_low_pc; 1217 case dwarf::DW_AT_call_value: 1218 return dwarf::DW_AT_GNU_call_site_value; 1219 case dwarf::DW_AT_call_tail_call: 1220 return dwarf::DW_AT_GNU_tail_call; 1221 default: 1222 llvm_unreachable("DWARF5 attribute with no GNU analog"); 1223 } 1224 } 1225 1226 dwarf::LocationAtom 1227 DwarfCompileUnit::getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const { 1228 if (!useGNUAnalogForDwarf5Feature()) 1229 return Loc; 1230 switch (Loc) { 1231 case dwarf::DW_OP_entry_value: 1232 return dwarf::DW_OP_GNU_entry_value; 1233 default: 1234 llvm_unreachable("DWARF5 location atom with no GNU analog"); 1235 } 1236 } 1237 1238 DIE &DwarfCompileUnit::constructCallSiteEntryDIE(DIE &ScopeDIE, 1239 const DISubprogram *CalleeSP, 1240 bool IsTail, 1241 const MCSymbol *PCAddr, 1242 const MCSymbol *CallAddr, 1243 unsigned CallReg) { 1244 // Insert a call site entry DIE within ScopeDIE. 1245 DIE &CallSiteDIE = createAndAddDIE(getDwarf5OrGNUTag(dwarf::DW_TAG_call_site), 1246 ScopeDIE, nullptr); 1247 1248 if (CallReg) { 1249 // Indirect call. 1250 addAddress(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_target), 1251 MachineLocation(CallReg)); 1252 } else { 1253 DIE *CalleeDIE = getOrCreateSubprogramDIE(CalleeSP); 1254 assert(CalleeDIE && "Could not create DIE for call site entry origin"); 1255 addDIEEntry(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_origin), 1256 *CalleeDIE); 1257 } 1258 1259 if (IsTail) { 1260 // Attach DW_AT_call_tail_call to tail calls for standards compliance. 1261 addFlag(CallSiteDIE, getDwarf5OrGNUAttr(dwarf::DW_AT_call_tail_call)); 1262 1263 // Attach the address of the branch instruction to allow the debugger to 1264 // show where the tail call occurred. This attribute has no GNU analog. 1265 // 1266 // GDB works backwards from non-standard usage of DW_AT_low_pc (in DWARF4 1267 // mode -- equivalently, in DWARF5 mode, DW_AT_call_return_pc) at tail-call 1268 // site entries to figure out the PC of tail-calling branch instructions. 1269 // This means it doesn't need the compiler to emit DW_AT_call_pc, so we 1270 // don't emit it here. 1271 // 1272 // There's no need to tie non-GDB debuggers to this non-standardness, as it 1273 // adds unnecessary complexity to the debugger. For non-GDB debuggers, emit 1274 // the standard DW_AT_call_pc info. 1275 if (!useGNUAnalogForDwarf5Feature()) 1276 addLabelAddress(CallSiteDIE, dwarf::DW_AT_call_pc, CallAddr); 1277 } 1278 1279 // Attach the return PC to allow the debugger to disambiguate call paths 1280 // from one function to another. 1281 // 1282 // The return PC is only really needed when the call /isn't/ a tail call, but 1283 // GDB expects it in DWARF4 mode, even for tail calls (see the comment above 1284 // the DW_AT_call_pc emission logic for an explanation). 1285 if (!IsTail || useGNUAnalogForDwarf5Feature()) { 1286 assert(PCAddr && "Missing return PC information for a call"); 1287 addLabelAddress(CallSiteDIE, 1288 getDwarf5OrGNUAttr(dwarf::DW_AT_call_return_pc), PCAddr); 1289 } 1290 1291 return CallSiteDIE; 1292 } 1293 1294 void DwarfCompileUnit::constructCallSiteParmEntryDIEs( 1295 DIE &CallSiteDIE, SmallVector<DbgCallSiteParam, 4> &Params) { 1296 for (const auto &Param : Params) { 1297 unsigned Register = Param.getRegister(); 1298 auto CallSiteDieParam = 1299 DIE::get(DIEValueAllocator, 1300 getDwarf5OrGNUTag(dwarf::DW_TAG_call_site_parameter)); 1301 insertDIE(CallSiteDieParam); 1302 addAddress(*CallSiteDieParam, dwarf::DW_AT_location, 1303 MachineLocation(Register)); 1304 1305 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1306 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1307 DwarfExpr.setCallSiteParamValueFlag(); 1308 1309 DwarfDebug::emitDebugLocValue(*Asm, nullptr, Param.getValue(), DwarfExpr); 1310 1311 addBlock(*CallSiteDieParam, getDwarf5OrGNUAttr(dwarf::DW_AT_call_value), 1312 DwarfExpr.finalize()); 1313 1314 CallSiteDIE.addChild(CallSiteDieParam); 1315 } 1316 } 1317 1318 DIE *DwarfCompileUnit::constructImportedEntityDIE( 1319 const DIImportedEntity *Module) { 1320 DIE *IMDie = DIE::get(DIEValueAllocator, (dwarf::Tag)Module->getTag()); 1321 insertDIE(Module, IMDie); 1322 DIE *EntityDie; 1323 auto *Entity = Module->getEntity(); 1324 if (auto *NS = dyn_cast<DINamespace>(Entity)) 1325 EntityDie = getOrCreateNameSpace(NS); 1326 else if (auto *M = dyn_cast<DIModule>(Entity)) 1327 EntityDie = getOrCreateModule(M); 1328 else if (auto *SP = dyn_cast<DISubprogram>(Entity)) { 1329 // If there is an abstract subprogram, refer to it. Note that this assumes 1330 // that all the abstract subprograms have been already created (which is 1331 // correct until imported entities get emitted in DwarfDebug::endModule()). 1332 if (auto *AbsSPDie = getAbstractScopeDIEs().lookup(SP)) 1333 EntityDie = AbsSPDie; 1334 else 1335 EntityDie = getOrCreateSubprogramDIE(SP); 1336 } else if (auto *T = dyn_cast<DIType>(Entity)) 1337 EntityDie = getOrCreateTypeDIE(T); 1338 else if (auto *GV = dyn_cast<DIGlobalVariable>(Entity)) 1339 EntityDie = getOrCreateGlobalVariableDIE(GV, {}); 1340 else if (auto *IE = dyn_cast<DIImportedEntity>(Entity)) 1341 EntityDie = getOrCreateImportedEntityDIE(IE); 1342 else 1343 EntityDie = getDIE(Entity); 1344 assert(EntityDie); 1345 addSourceLine(*IMDie, Module->getLine(), Module->getFile()); 1346 addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie); 1347 StringRef Name = Module->getName(); 1348 if (!Name.empty()) { 1349 addString(*IMDie, dwarf::DW_AT_name, Name); 1350 1351 // FIXME: if consumers ever start caring about handling 1352 // unnamed import declarations such as `using ::nullptr_t` 1353 // or `using namespace std::ranges`, we could add the 1354 // import declaration into the accelerator table with the 1355 // name being the one of the entity being imported. 1356 DD->addAccelNamespace(*CUNode, Name, *IMDie); 1357 } 1358 1359 // This is for imported module with renamed entities (such as variables and 1360 // subprograms). 1361 DINodeArray Elements = Module->getElements(); 1362 for (const auto *Element : Elements) { 1363 if (!Element) 1364 continue; 1365 IMDie->addChild( 1366 constructImportedEntityDIE(cast<DIImportedEntity>(Element))); 1367 } 1368 1369 return IMDie; 1370 } 1371 1372 DIE *DwarfCompileUnit::getOrCreateImportedEntityDIE( 1373 const DIImportedEntity *IE) { 1374 1375 // Check for pre-existence. 1376 if (DIE *Die = getDIE(IE)) 1377 return Die; 1378 1379 DIE *ContextDIE = getOrCreateContextDIE(IE->getScope()); 1380 assert(ContextDIE && "Empty scope for the imported entity!"); 1381 1382 DIE *IMDie = constructImportedEntityDIE(IE); 1383 ContextDIE->addChild(IMDie); 1384 return IMDie; 1385 } 1386 1387 void DwarfCompileUnit::finishSubprogramDefinition(const DISubprogram *SP) { 1388 DIE *D = getDIE(SP); 1389 if (DIE *AbsSPDIE = getAbstractScopeDIEs().lookup(SP)) { 1390 if (D) 1391 // If this subprogram has an abstract definition, reference that 1392 addDIEEntry(*D, dwarf::DW_AT_abstract_origin, *AbsSPDIE); 1393 } else { 1394 assert(D || includeMinimalInlineScopes()); 1395 if (D) 1396 // And attach the attributes 1397 applySubprogramAttributesToDefinition(SP, *D); 1398 } 1399 } 1400 1401 void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) { 1402 DbgEntity *AbsEntity = getExistingAbstractEntity(Entity->getEntity()); 1403 1404 auto *Die = Entity->getDIE(); 1405 /// Label may be used to generate DW_AT_low_pc, so put it outside 1406 /// if/else block. 1407 const DbgLabel *Label = nullptr; 1408 if (AbsEntity && AbsEntity->getDIE()) { 1409 addDIEEntry(*Die, dwarf::DW_AT_abstract_origin, *AbsEntity->getDIE()); 1410 Label = dyn_cast<const DbgLabel>(Entity); 1411 } else { 1412 if (const DbgVariable *Var = dyn_cast<const DbgVariable>(Entity)) 1413 applyVariableAttributes(*Var, *Die); 1414 else if ((Label = dyn_cast<const DbgLabel>(Entity))) 1415 applyLabelAttributes(*Label, *Die); 1416 else 1417 llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel."); 1418 } 1419 1420 if (Label) 1421 if (const auto *Sym = Label->getSymbol()) 1422 addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym); 1423 } 1424 1425 DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) { 1426 auto &AbstractEntities = getAbstractEntities(); 1427 auto I = AbstractEntities.find(Node); 1428 if (I != AbstractEntities.end()) 1429 return I->second.get(); 1430 return nullptr; 1431 } 1432 1433 void DwarfCompileUnit::createAbstractEntity(const DINode *Node, 1434 LexicalScope *Scope) { 1435 assert(Scope && Scope->isAbstractScope()); 1436 auto &Entity = getAbstractEntities()[Node]; 1437 if (isa<const DILocalVariable>(Node)) { 1438 Entity = std::make_unique<DbgVariable>(cast<const DILocalVariable>(Node), 1439 nullptr /* IA */); 1440 DU->addScopeVariable(Scope, cast<DbgVariable>(Entity.get())); 1441 } else if (isa<const DILabel>(Node)) { 1442 Entity = std::make_unique<DbgLabel>( 1443 cast<const DILabel>(Node), nullptr /* IA */); 1444 DU->addScopeLabel(Scope, cast<DbgLabel>(Entity.get())); 1445 } 1446 } 1447 1448 void DwarfCompileUnit::emitHeader(bool UseOffsets) { 1449 // Don't bother labeling the .dwo unit, as its offset isn't used. 1450 if (!Skeleton && !DD->useSectionsAsReferences()) { 1451 LabelBegin = Asm->createTempSymbol("cu_begin"); 1452 Asm->OutStreamer->emitLabel(LabelBegin); 1453 } 1454 1455 dwarf::UnitType UT = Skeleton ? dwarf::DW_UT_split_compile 1456 : DD->useSplitDwarf() ? dwarf::DW_UT_skeleton 1457 : dwarf::DW_UT_compile; 1458 DwarfUnit::emitCommonHeader(UseOffsets, UT); 1459 if (DD->getDwarfVersion() >= 5 && UT != dwarf::DW_UT_compile) 1460 Asm->emitInt64(getDWOId()); 1461 } 1462 1463 bool DwarfCompileUnit::hasDwarfPubSections() const { 1464 switch (CUNode->getNameTableKind()) { 1465 case DICompileUnit::DebugNameTableKind::None: 1466 return false; 1467 // Opting in to GNU Pubnames/types overrides the default to ensure these are 1468 // generated for things like Gold's gdb_index generation. 1469 case DICompileUnit::DebugNameTableKind::GNU: 1470 return true; 1471 case DICompileUnit::DebugNameTableKind::Apple: 1472 return false; 1473 case DICompileUnit::DebugNameTableKind::Default: 1474 return DD->tuneForGDB() && !includeMinimalInlineScopes() && 1475 !CUNode->isDebugDirectivesOnly() && 1476 DD->getAccelTableKind() != AccelTableKind::Apple && 1477 DD->getDwarfVersion() < 5; 1478 } 1479 llvm_unreachable("Unhandled DICompileUnit::DebugNameTableKind enum"); 1480 } 1481 1482 /// addGlobalName - Add a new global name to the compile unit. 1483 void DwarfCompileUnit::addGlobalName(StringRef Name, const DIE &Die, 1484 const DIScope *Context) { 1485 if (!hasDwarfPubSections()) 1486 return; 1487 std::string FullName = getParentContextString(Context) + Name.str(); 1488 GlobalNames[FullName] = &Die; 1489 } 1490 1491 void DwarfCompileUnit::addGlobalNameForTypeUnit(StringRef Name, 1492 const DIScope *Context) { 1493 if (!hasDwarfPubSections()) 1494 return; 1495 std::string FullName = getParentContextString(Context) + Name.str(); 1496 // Insert, allowing the entry to remain as-is if it's already present 1497 // This way the CU-level type DIE is preferred over the "can't describe this 1498 // type as a unit offset because it's not really in the CU at all, it's only 1499 // in a type unit" 1500 GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie())); 1501 } 1502 1503 /// Add a new global type to the unit. 1504 void DwarfCompileUnit::addGlobalType(const DIType *Ty, const DIE &Die, 1505 const DIScope *Context) { 1506 if (!hasDwarfPubSections()) 1507 return; 1508 std::string FullName = getParentContextString(Context) + Ty->getName().str(); 1509 GlobalTypes[FullName] = &Die; 1510 } 1511 1512 void DwarfCompileUnit::addGlobalTypeUnitType(const DIType *Ty, 1513 const DIScope *Context) { 1514 if (!hasDwarfPubSections()) 1515 return; 1516 std::string FullName = getParentContextString(Context) + Ty->getName().str(); 1517 // Insert, allowing the entry to remain as-is if it's already present 1518 // This way the CU-level type DIE is preferred over the "can't describe this 1519 // type as a unit offset because it's not really in the CU at all, it's only 1520 // in a type unit" 1521 GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie())); 1522 } 1523 1524 void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die, 1525 MachineLocation Location) { 1526 if (DV.hasComplexAddress()) 1527 addComplexAddress(DV, Die, dwarf::DW_AT_location, Location); 1528 else 1529 addAddress(Die, dwarf::DW_AT_location, Location); 1530 } 1531 1532 /// Add an address attribute to a die based on the location provided. 1533 void DwarfCompileUnit::addAddress(DIE &Die, dwarf::Attribute Attribute, 1534 const MachineLocation &Location) { 1535 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1536 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1537 if (Location.isIndirect()) 1538 DwarfExpr.setMemoryLocationKind(); 1539 1540 DIExpressionCursor Cursor({}); 1541 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 1542 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1543 return; 1544 DwarfExpr.addExpression(std::move(Cursor)); 1545 1546 // Now attach the location information to the DIE. 1547 addBlock(Die, Attribute, DwarfExpr.finalize()); 1548 1549 if (DwarfExpr.TagOffset) 1550 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 1551 *DwarfExpr.TagOffset); 1552 } 1553 1554 /// Start with the address based on the location provided, and generate the 1555 /// DWARF information necessary to find the actual variable given the extra 1556 /// address information encoded in the DbgVariable, starting from the starting 1557 /// location. Add the DWARF information to the die. 1558 void DwarfCompileUnit::addComplexAddress(const DbgVariable &DV, DIE &Die, 1559 dwarf::Attribute Attribute, 1560 const MachineLocation &Location) { 1561 DIELoc *Loc = new (DIEValueAllocator) DIELoc; 1562 DIEDwarfExpression DwarfExpr(*Asm, *this, *Loc); 1563 const DIExpression *DIExpr = DV.getSingleExpression(); 1564 DwarfExpr.addFragmentOffset(DIExpr); 1565 DwarfExpr.setLocation(Location, DIExpr); 1566 1567 DIExpressionCursor Cursor(DIExpr); 1568 1569 if (DIExpr->isEntryValue()) 1570 DwarfExpr.beginEntryValueExpression(Cursor); 1571 1572 const TargetRegisterInfo &TRI = *Asm->MF->getSubtarget().getRegisterInfo(); 1573 if (!DwarfExpr.addMachineRegExpression(TRI, Cursor, Location.getReg())) 1574 return; 1575 DwarfExpr.addExpression(std::move(Cursor)); 1576 1577 // Now attach the location information to the DIE. 1578 addBlock(Die, Attribute, DwarfExpr.finalize()); 1579 1580 if (DwarfExpr.TagOffset) 1581 addUInt(Die, dwarf::DW_AT_LLVM_tag_offset, dwarf::DW_FORM_data1, 1582 *DwarfExpr.TagOffset); 1583 } 1584 1585 /// Add a Dwarf loclistptr attribute data and value. 1586 void DwarfCompileUnit::addLocationList(DIE &Die, dwarf::Attribute Attribute, 1587 unsigned Index) { 1588 dwarf::Form Form = (DD->getDwarfVersion() >= 5) 1589 ? dwarf::DW_FORM_loclistx 1590 : DD->getDwarfSectionOffsetForm(); 1591 addAttribute(Die, Attribute, Form, DIELocList(Index)); 1592 } 1593 1594 void DwarfCompileUnit::applyVariableAttributes(const DbgVariable &Var, 1595 DIE &VariableDie) { 1596 StringRef Name = Var.getName(); 1597 if (!Name.empty()) 1598 addString(VariableDie, dwarf::DW_AT_name, Name); 1599 const auto *DIVar = Var.getVariable(); 1600 if (DIVar) { 1601 if (uint32_t AlignInBytes = DIVar->getAlignInBytes()) 1602 addUInt(VariableDie, dwarf::DW_AT_alignment, dwarf::DW_FORM_udata, 1603 AlignInBytes); 1604 addAnnotation(VariableDie, DIVar->getAnnotations()); 1605 } 1606 1607 addSourceLine(VariableDie, DIVar); 1608 addType(VariableDie, Var.getType()); 1609 if (Var.isArtificial()) 1610 addFlag(VariableDie, dwarf::DW_AT_artificial); 1611 } 1612 1613 void DwarfCompileUnit::applyLabelAttributes(const DbgLabel &Label, 1614 DIE &LabelDie) { 1615 StringRef Name = Label.getName(); 1616 if (!Name.empty()) 1617 addString(LabelDie, dwarf::DW_AT_name, Name); 1618 const auto *DILabel = Label.getLabel(); 1619 addSourceLine(LabelDie, DILabel); 1620 } 1621 1622 /// Add a Dwarf expression attribute data and value. 1623 void DwarfCompileUnit::addExpr(DIELoc &Die, dwarf::Form Form, 1624 const MCExpr *Expr) { 1625 addAttribute(Die, (dwarf::Attribute)0, Form, DIEExpr(Expr)); 1626 } 1627 1628 void DwarfCompileUnit::applySubprogramAttributesToDefinition( 1629 const DISubprogram *SP, DIE &SPDie) { 1630 auto *SPDecl = SP->getDeclaration(); 1631 auto *Context = SPDecl ? SPDecl->getScope() : SP->getScope(); 1632 applySubprogramAttributes(SP, SPDie, includeMinimalInlineScopes()); 1633 addGlobalName(SP->getName(), SPDie, Context); 1634 } 1635 1636 bool DwarfCompileUnit::isDwoUnit() const { 1637 return DD->useSplitDwarf() && Skeleton; 1638 } 1639 1640 void DwarfCompileUnit::finishNonUnitTypeDIE(DIE& D, const DICompositeType *CTy) { 1641 constructTypeDIE(D, CTy); 1642 } 1643 1644 bool DwarfCompileUnit::includeMinimalInlineScopes() const { 1645 return getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly || 1646 (DD->useSplitDwarf() && !Skeleton); 1647 } 1648 1649 void DwarfCompileUnit::addAddrTableBase() { 1650 const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering(); 1651 MCSymbol *Label = DD->getAddressPool().getLabel(); 1652 addSectionLabel(getUnitDie(), 1653 DD->getDwarfVersion() >= 5 ? dwarf::DW_AT_addr_base 1654 : dwarf::DW_AT_GNU_addr_base, 1655 Label, TLOF.getDwarfAddrSection()->getBeginSymbol()); 1656 } 1657 1658 void DwarfCompileUnit::addBaseTypeRef(DIEValueList &Die, int64_t Idx) { 1659 addAttribute(Die, (dwarf::Attribute)0, dwarf::DW_FORM_udata, 1660 new (DIEValueAllocator) DIEBaseTypeRef(this, Idx)); 1661 } 1662 1663 void DwarfCompileUnit::createBaseTypeDIEs() { 1664 // Insert the base_type DIEs directly after the CU so that their offsets will 1665 // fit in the fixed size ULEB128 used inside the location expressions. 1666 // Maintain order by iterating backwards and inserting to the front of CU 1667 // child list. 1668 for (auto &Btr : reverse(ExprRefedBaseTypes)) { 1669 DIE &Die = getUnitDie().addChildFront( 1670 DIE::get(DIEValueAllocator, dwarf::DW_TAG_base_type)); 1671 SmallString<32> Str; 1672 addString(Die, dwarf::DW_AT_name, 1673 Twine(dwarf::AttributeEncodingString(Btr.Encoding) + 1674 "_" + Twine(Btr.BitSize)).toStringRef(Str)); 1675 addUInt(Die, dwarf::DW_AT_encoding, dwarf::DW_FORM_data1, Btr.Encoding); 1676 // Round up to smallest number of bytes that contains this number of bits. 1677 addUInt(Die, dwarf::DW_AT_byte_size, std::nullopt, 1678 divideCeil(Btr.BitSize, 8)); 1679 1680 Btr.Die = &Die; 1681 } 1682 } 1683 1684 DIE *DwarfCompileUnit::getLexicalBlockDIE(const DILexicalBlock *LB) { 1685 // Assume if there is an abstract tree all the DIEs are already emitted. 1686 bool isAbstract = getAbstractScopeDIEs().count(LB->getSubprogram()); 1687 if (isAbstract && getAbstractScopeDIEs().count(LB)) 1688 return getAbstractScopeDIEs()[LB]; 1689 assert(!isAbstract && "Missed lexical block DIE in abstract tree!"); 1690 1691 // Return a concrete DIE if it exists or nullptr otherwise. 1692 return LexicalBlockDIEs.lookup(LB); 1693 } 1694 1695 DIE *DwarfCompileUnit::getOrCreateContextDIE(const DIScope *Context) { 1696 if (isa_and_nonnull<DILocalScope>(Context)) { 1697 if (auto *LFScope = dyn_cast<DILexicalBlockFile>(Context)) 1698 Context = LFScope->getNonLexicalBlockFileScope(); 1699 if (auto *LScope = dyn_cast<DILexicalBlock>(Context)) 1700 return getLexicalBlockDIE(LScope); 1701 1702 // Otherwise the context must be a DISubprogram. 1703 auto *SPScope = cast<DISubprogram>(Context); 1704 if (getAbstractScopeDIEs().count(SPScope)) 1705 return getAbstractScopeDIEs()[SPScope]; 1706 } 1707 return DwarfUnit::getOrCreateContextDIE(Context); 1708 } 1709