1 //===-- llvm/CodeGen/DwarfDebug.h - Dwarf Debug Framework ------*- C++ -*--===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains support for writing dwarf debug info into asm files. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H 15 #define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFDEBUG_H 16 17 #include "DwarfFile.h" 18 #include "AsmPrinterHandler.h" 19 #include "DIE.h" 20 #include "DbgValueHistoryCalculator.h" 21 #include "DebugLocEntry.h" 22 #include "DebugLocList.h" 23 #include "DwarfAccelTable.h" 24 #include "llvm/ADT/DenseMap.h" 25 #include "llvm/ADT/MapVector.h" 26 #include "llvm/ADT/SmallPtrSet.h" 27 #include "llvm/ADT/StringMap.h" 28 #include "llvm/ADT/FoldingSet.h" 29 #include "llvm/CodeGen/LexicalScopes.h" 30 #include "llvm/CodeGen/MachineInstr.h" 31 #include "llvm/IR/DebugInfo.h" 32 #include "llvm/IR/DebugLoc.h" 33 #include "llvm/MC/MachineLocation.h" 34 #include "llvm/MC/MCDwarf.h" 35 #include "llvm/Support/Allocator.h" 36 37 #include <memory> 38 39 namespace llvm { 40 41 class AsmPrinter; 42 class ByteStreamer; 43 class ConstantInt; 44 class ConstantFP; 45 class DwarfCompileUnit; 46 class DwarfDebug; 47 class DwarfTypeUnit; 48 class DwarfUnit; 49 class MachineModuleInfo; 50 51 //===----------------------------------------------------------------------===// 52 /// \brief This class is used to record source line correspondence. 53 class SrcLineInfo { 54 unsigned Line; // Source line number. 55 unsigned Column; // Source column. 56 unsigned SourceID; // Source ID number. 57 MCSymbol *Label; // Label in code ID number. 58 public: 59 SrcLineInfo(unsigned L, unsigned C, unsigned S, MCSymbol *label) 60 : Line(L), Column(C), SourceID(S), Label(label) {} 61 62 // Accessors 63 unsigned getLine() const { return Line; } 64 unsigned getColumn() const { return Column; } 65 unsigned getSourceID() const { return SourceID; } 66 MCSymbol *getLabel() const { return Label; } 67 }; 68 69 //===----------------------------------------------------------------------===// 70 /// \brief This class is used to track local variable information. 71 class DbgVariable { 72 DIVariable Var; // Variable Descriptor. 73 DIExpression Expr; // Complex address location expression. 74 DIE *TheDIE; // Variable DIE. 75 unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries. 76 const MachineInstr *MInsn; // DBG_VALUE instruction of the variable. 77 int FrameIndex; 78 DwarfDebug *DD; 79 80 public: 81 /// Construct a DbgVariable from a DIVariable. 82 DbgVariable(DIVariable V, DIExpression E, DwarfDebug *DD) 83 : Var(V), Expr(E), TheDIE(nullptr), DotDebugLocOffset(~0U), 84 MInsn(nullptr), FrameIndex(~0), DD(DD) { 85 assert(Var.Verify() && Expr.Verify()); 86 } 87 88 /// Construct a DbgVariable from a DEBUG_VALUE. 89 /// AbstractVar may be NULL. 90 DbgVariable(const MachineInstr *DbgValue, DwarfDebug *DD) 91 : Var(DbgValue->getDebugVariable()), Expr(DbgValue->getDebugExpression()), 92 TheDIE(nullptr), DotDebugLocOffset(~0U), MInsn(DbgValue), 93 FrameIndex(~0), DD(DD) {} 94 95 // Accessors. 96 DIVariable getVariable() const { return Var; } 97 DIExpression getExpression() const { return Expr; } 98 void setDIE(DIE &D) { TheDIE = &D; } 99 DIE *getDIE() const { return TheDIE; } 100 void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; } 101 unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; } 102 StringRef getName() const { return Var.getName(); } 103 const MachineInstr *getMInsn() const { return MInsn; } 104 int getFrameIndex() const { return FrameIndex; } 105 void setFrameIndex(int FI) { FrameIndex = FI; } 106 // Translate tag to proper Dwarf tag. 107 dwarf::Tag getTag() const { 108 if (Var.getTag() == dwarf::DW_TAG_arg_variable) 109 return dwarf::DW_TAG_formal_parameter; 110 111 return dwarf::DW_TAG_variable; 112 } 113 /// \brief Return true if DbgVariable is artificial. 114 bool isArtificial() const { 115 if (Var.isArtificial()) 116 return true; 117 if (getType().isArtificial()) 118 return true; 119 return false; 120 } 121 122 bool isObjectPointer() const { 123 if (Var.isObjectPointer()) 124 return true; 125 if (getType().isObjectPointer()) 126 return true; 127 return false; 128 } 129 130 bool variableHasComplexAddress() const { 131 assert(Var.isVariable() && "Invalid complex DbgVariable!"); 132 return Expr.getNumElements() > 0; 133 } 134 bool isBlockByrefVariable() const; 135 unsigned getNumAddrElements() const { 136 assert(Var.isVariable() && "Invalid complex DbgVariable!"); 137 return Expr.getNumElements(); 138 } 139 uint64_t getAddrElement(unsigned i) const { return Expr.getElement(i); } 140 DIType getType() const; 141 142 private: 143 /// resolve - Look in the DwarfDebug map for the MDNode that 144 /// corresponds to the reference. 145 template <typename T> T resolve(DIRef<T> Ref) const; 146 }; 147 148 149 /// \brief Helper used to pair up a symbol and its DWARF compile unit. 150 struct SymbolCU { 151 SymbolCU(DwarfCompileUnit *CU, const MCSymbol *Sym) : Sym(Sym), CU(CU) {} 152 const MCSymbol *Sym; 153 DwarfCompileUnit *CU; 154 }; 155 156 /// \brief Collects and handles dwarf debug information. 157 class DwarfDebug : public AsmPrinterHandler { 158 // Target of Dwarf emission. 159 AsmPrinter *Asm; 160 161 // Collected machine module information. 162 MachineModuleInfo *MMI; 163 164 // All DIEValues are allocated through this allocator. 165 BumpPtrAllocator DIEValueAllocator; 166 167 // Maps MDNode with its corresponding DwarfCompileUnit. 168 MapVector<const MDNode *, DwarfCompileUnit *> CUMap; 169 170 // Maps subprogram MDNode with its corresponding DwarfCompileUnit. 171 MapVector<const MDNode *, DwarfCompileUnit *> SPMap; 172 173 // Maps a CU DIE with its corresponding DwarfCompileUnit. 174 DenseMap<const DIE *, DwarfCompileUnit *> CUDieMap; 175 176 /// Maps MDNodes for type system with the corresponding DIEs. These DIEs can 177 /// be shared across CUs, that is why we keep the map here instead 178 /// of in DwarfCompileUnit. 179 DenseMap<const MDNode *, DIE *> MDTypeNodeToDieMap; 180 181 // List of all labels used in aranges generation. 182 std::vector<SymbolCU> ArangeLabels; 183 184 // Size of each symbol emitted (for those symbols that have a specific size). 185 DenseMap<const MCSymbol *, uint64_t> SymSize; 186 187 // Provides a unique id per text section. 188 typedef DenseMap<const MCSection *, SmallVector<SymbolCU, 8> > SectionMapType; 189 SectionMapType SectionMap; 190 191 LexicalScopes LScopes; 192 193 // Collection of abstract subprogram DIEs. 194 DenseMap<const MDNode *, DIE *> AbstractSPDies; 195 196 // Collection of abstract variables. 197 DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables; 198 SmallVector<std::unique_ptr<DbgVariable>, 64> ConcreteVariables; 199 200 // Collection of DebugLocEntry. Stored in a linked list so that DIELocLists 201 // can refer to them in spite of insertions into this list. 202 SmallVector<DebugLocList, 4> DotDebugLocEntries; 203 204 // This is a collection of subprogram MDNodes that are processed to 205 // create DIEs. 206 SmallPtrSet<const MDNode *, 16> ProcessedSPNodes; 207 208 // Maps instruction with label emitted before instruction. 209 DenseMap<const MachineInstr *, MCSymbol *> LabelsBeforeInsn; 210 211 // Maps instruction with label emitted after instruction. 212 DenseMap<const MachineInstr *, MCSymbol *> LabelsAfterInsn; 213 214 // History of DBG_VALUE and clobber instructions for each user variable. 215 // Variables are listed in order of appearance. 216 DbgValueHistoryMap DbgValues; 217 218 // Previous instruction's location information. This is used to determine 219 // label location to indicate scope boundries in dwarf debug info. 220 DebugLoc PrevInstLoc; 221 MCSymbol *PrevLabel; 222 223 // This location indicates end of function prologue and beginning of function 224 // body. 225 DebugLoc PrologEndLoc; 226 227 // If nonnull, stores the current machine function we're processing. 228 const MachineFunction *CurFn; 229 230 // If nonnull, stores the current machine instruction we're processing. 231 const MachineInstr *CurMI; 232 233 // If nonnull, stores the CU in which the previous subprogram was contained. 234 const DwarfCompileUnit *PrevCU; 235 236 // Section Symbols: these are assembler temporary labels that are emitted at 237 // the beginning of each supported dwarf section. These are used to form 238 // section offsets and are created by EmitSectionLabels. 239 MCSymbol *DwarfInfoSectionSym, *DwarfAbbrevSectionSym; 240 MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym; 241 MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym; 242 MCSymbol *FunctionBeginSym, *FunctionEndSym; 243 MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym; 244 MCSymbol *DwarfTypesDWOSectionSym; 245 MCSymbol *DwarfStrDWOSectionSym; 246 MCSymbol *DwarfGnuPubNamesSectionSym, *DwarfGnuPubTypesSectionSym; 247 248 // As an optimization, there is no need to emit an entry in the directory 249 // table for the same directory as DW_AT_comp_dir. 250 StringRef CompilationDir; 251 252 // Counter for assigning globally unique IDs for ranges. 253 unsigned GlobalRangeCount; 254 255 // Holder for the file specific debug information. 256 DwarfFile InfoHolder; 257 258 // Holders for the various debug information flags that we might need to 259 // have exposed. See accessor functions below for description. 260 261 // Holder for imported entities. 262 typedef SmallVector<std::pair<const MDNode *, const MDNode *>, 32> 263 ImportedEntityMap; 264 ImportedEntityMap ScopesWithImportedEntities; 265 266 // Map from MDNodes for user-defined types to the type units that describe 267 // them. 268 DenseMap<const MDNode *, const DwarfTypeUnit *> DwarfTypeUnits; 269 270 SmallVector<std::pair<std::unique_ptr<DwarfTypeUnit>, DICompositeType>, 1> TypeUnitsUnderConstruction; 271 272 // Whether to emit the pubnames/pubtypes sections. 273 bool HasDwarfPubSections; 274 275 // Whether or not to use AT_ranges for compilation units. 276 bool HasCURanges; 277 278 // Whether we emitted a function into a section other than the default 279 // text. 280 bool UsedNonDefaultText; 281 282 // Version of dwarf we're emitting. 283 unsigned DwarfVersion; 284 285 // Maps from a type identifier to the actual MDNode. 286 DITypeIdentifierMap TypeIdentifierMap; 287 288 // DWARF5 Experimental Options 289 bool HasDwarfAccelTables; 290 bool HasSplitDwarf; 291 292 // Separated Dwarf Variables 293 // In general these will all be for bits that are left in the 294 // original object file, rather than things that are meant 295 // to be in the .dwo sections. 296 297 // Holder for the skeleton information. 298 DwarfFile SkeletonHolder; 299 300 /// Store file names for type units under fission in a line table header that 301 /// will be emitted into debug_line.dwo. 302 // FIXME: replace this with a map from comp_dir to table so that we can emit 303 // multiple tables during LTO each of which uses directory 0, referencing the 304 // comp_dir of all the type units that use it. 305 MCDwarfDwoLineTable SplitTypeUnitFileTable; 306 307 // True iff there are multiple CUs in this module. 308 bool SingleCU; 309 bool IsDarwin; 310 311 AddressPool AddrPool; 312 313 DwarfAccelTable AccelNames; 314 DwarfAccelTable AccelObjC; 315 DwarfAccelTable AccelNamespace; 316 DwarfAccelTable AccelTypes; 317 318 DenseMap<const Function *, DISubprogram> FunctionDIs; 319 320 MCDwarfDwoLineTable *getDwoLineTable(const DwarfCompileUnit &); 321 322 const SmallVectorImpl<std::unique_ptr<DwarfUnit>> &getUnits() { 323 return InfoHolder.getUnits(); 324 } 325 326 /// \brief Find abstract variable associated with Var. 327 DbgVariable *getExistingAbstractVariable(const DIVariable &DV, 328 DIVariable &Cleansed); 329 DbgVariable *getExistingAbstractVariable(const DIVariable &DV); 330 void createAbstractVariable(const DIVariable &DV, LexicalScope *Scope); 331 void ensureAbstractVariableIsCreated(const DIVariable &Var, 332 const MDNode *Scope); 333 void ensureAbstractVariableIsCreatedIfScoped(const DIVariable &Var, 334 const MDNode *Scope); 335 336 /// \brief Construct a DIE for this abstract scope. 337 void constructAbstractSubprogramScopeDIE(LexicalScope *Scope); 338 339 /// \brief Emit initial Dwarf sections with a label at the start of each one. 340 void emitSectionLabels(); 341 342 /// \brief Compute the size and offset of a DIE given an incoming Offset. 343 unsigned computeSizeAndOffset(DIE *Die, unsigned Offset); 344 345 /// \brief Compute the size and offset of all the DIEs. 346 void computeSizeAndOffsets(); 347 348 /// \brief Collect info for variables that were optimized out. 349 void collectDeadVariables(); 350 351 void finishVariableDefinitions(); 352 353 void finishSubprogramDefinitions(); 354 355 /// \brief Finish off debug information after all functions have been 356 /// processed. 357 void finalizeModuleInfo(); 358 359 /// \brief Emit labels to close any remaining sections that have been left 360 /// open. 361 void endSections(); 362 363 /// \brief Emit the debug info section. 364 void emitDebugInfo(); 365 366 /// \brief Emit the abbreviation section. 367 void emitAbbreviations(); 368 369 /// \brief Emit the last address of the section and the end of 370 /// the line matrix. 371 void emitEndOfLineMatrix(unsigned SectionEnd); 372 373 /// \brief Emit a specified accelerator table. 374 void emitAccel(DwarfAccelTable &Accel, const MCSection *Section, 375 StringRef TableName, StringRef SymName); 376 377 /// \brief Emit visible names into a hashed accelerator table section. 378 void emitAccelNames(); 379 380 /// \brief Emit objective C classes and categories into a hashed 381 /// accelerator table section. 382 void emitAccelObjC(); 383 384 /// \brief Emit namespace dies into a hashed accelerator table. 385 void emitAccelNamespaces(); 386 387 /// \brief Emit type dies into a hashed accelerator table. 388 void emitAccelTypes(); 389 390 /// \brief Emit visible names into a debug pubnames section. 391 /// \param GnuStyle determines whether or not we want to emit 392 /// additional information into the table ala newer gcc for gdb 393 /// index. 394 void emitDebugPubNames(bool GnuStyle = false); 395 396 /// \brief Emit visible types into a debug pubtypes section. 397 /// \param GnuStyle determines whether or not we want to emit 398 /// additional information into the table ala newer gcc for gdb 399 /// index. 400 void emitDebugPubTypes(bool GnuStyle = false); 401 402 void 403 emitDebugPubSection(bool GnuStyle, const MCSection *PSec, StringRef Name, 404 const StringMap<const DIE *> &(DwarfUnit::*Accessor)() 405 const); 406 407 /// \brief Emit visible names into a debug str section. 408 void emitDebugStr(); 409 410 /// \brief Emit visible names into a debug loc section. 411 void emitDebugLoc(); 412 413 /// \brief Emit visible names into a debug loc dwo section. 414 void emitDebugLocDWO(); 415 416 /// \brief Emit visible names into a debug aranges section. 417 void emitDebugARanges(); 418 419 /// \brief Emit visible names into a debug ranges section. 420 void emitDebugRanges(); 421 422 /// \brief Emit inline info using custom format. 423 void emitDebugInlineInfo(); 424 425 /// DWARF 5 Experimental Split Dwarf Emitters 426 427 /// \brief Initialize common features of skeleton units. 428 void initSkeletonUnit(const DwarfUnit &U, DIE &Die, 429 std::unique_ptr<DwarfUnit> NewU); 430 431 /// \brief Construct the split debug info compile unit for the debug info 432 /// section. 433 DwarfCompileUnit &constructSkeletonCU(const DwarfCompileUnit &CU); 434 435 /// \brief Construct the split debug info compile unit for the debug info 436 /// section. 437 DwarfTypeUnit &constructSkeletonTU(DwarfTypeUnit &TU); 438 439 /// \brief Emit the debug info dwo section. 440 void emitDebugInfoDWO(); 441 442 /// \brief Emit the debug abbrev dwo section. 443 void emitDebugAbbrevDWO(); 444 445 /// \brief Emit the debug line dwo section. 446 void emitDebugLineDWO(); 447 448 /// \brief Emit the debug str dwo section. 449 void emitDebugStrDWO(); 450 451 /// Flags to let the linker know we have emitted new style pubnames. Only 452 /// emit it here if we don't have a skeleton CU for split dwarf. 453 void addGnuPubAttributes(DwarfUnit &U, DIE &D) const; 454 455 /// \brief Create new DwarfCompileUnit for the given metadata node with tag 456 /// DW_TAG_compile_unit. 457 DwarfCompileUnit &constructDwarfCompileUnit(DICompileUnit DIUnit); 458 459 /// \brief Construct imported_module or imported_declaration DIE. 460 void constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU, 461 const MDNode *N); 462 463 /// \brief Register a source line with debug info. Returns the unique 464 /// label that was emitted and which provides correspondence to the 465 /// source line list. 466 void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope, 467 unsigned Flags); 468 469 /// \brief Indentify instructions that are marking the beginning of or 470 /// ending of a scope. 471 void identifyScopeMarkers(); 472 473 /// \brief Populate LexicalScope entries with variables' info. 474 void collectVariableInfo(DwarfCompileUnit &TheCU, DISubprogram SP, 475 SmallPtrSetImpl<const MDNode *> &ProcessedVars); 476 477 /// \brief Build the location list for all DBG_VALUEs in the 478 /// function that describe the same variable. 479 void buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc, 480 const DbgValueHistoryMap::InstrRanges &Ranges); 481 482 /// \brief Collect variable information from the side table maintained 483 /// by MMI. 484 void collectVariableInfoFromMMITable(SmallPtrSetImpl<const MDNode *> &P); 485 486 /// \brief Ensure that a label will be emitted before MI. 487 void requestLabelBeforeInsn(const MachineInstr *MI) { 488 LabelsBeforeInsn.insert(std::make_pair(MI, nullptr)); 489 } 490 491 /// \brief Ensure that a label will be emitted after MI. 492 void requestLabelAfterInsn(const MachineInstr *MI) { 493 LabelsAfterInsn.insert(std::make_pair(MI, nullptr)); 494 } 495 496 public: 497 //===--------------------------------------------------------------------===// 498 // Main entry points. 499 // 500 DwarfDebug(AsmPrinter *A, Module *M); 501 502 ~DwarfDebug() override; 503 504 void insertDIE(const MDNode *TypeMD, DIE *Die) { 505 MDTypeNodeToDieMap.insert(std::make_pair(TypeMD, Die)); 506 } 507 DIE *getDIE(const MDNode *TypeMD) { 508 return MDTypeNodeToDieMap.lookup(TypeMD); 509 } 510 511 /// \brief Emit all Dwarf sections that should come prior to the 512 /// content. 513 void beginModule(); 514 515 /// \brief Emit all Dwarf sections that should come after the content. 516 void endModule() override; 517 518 /// \brief Gather pre-function debug information. 519 void beginFunction(const MachineFunction *MF) override; 520 521 /// \brief Gather and emit post-function debug information. 522 void endFunction(const MachineFunction *MF) override; 523 524 /// \brief Process beginning of an instruction. 525 void beginInstruction(const MachineInstr *MI) override; 526 527 /// \brief Process end of an instruction. 528 void endInstruction() override; 529 530 /// \brief Add a DIE to the set of types that we're going to pull into 531 /// type units. 532 void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier, 533 DIE &Die, DICompositeType CTy); 534 535 /// \brief Add a label so that arange data can be generated for it. 536 void addArangeLabel(SymbolCU SCU) { ArangeLabels.push_back(SCU); } 537 538 /// \brief For symbols that have a size designated (e.g. common symbols), 539 /// this tracks that size. 540 void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override { 541 SymSize[Sym] = Size; 542 } 543 544 /// \brief Recursively Emits a debug information entry. 545 void emitDIE(DIE &Die); 546 547 // Experimental DWARF5 features. 548 549 /// \brief Returns whether or not to emit tables that dwarf consumers can 550 /// use to accelerate lookup. 551 bool useDwarfAccelTables() const { return HasDwarfAccelTables; } 552 553 /// \brief Returns whether or not to change the current debug info for the 554 /// split dwarf proposal support. 555 bool useSplitDwarf() const { return HasSplitDwarf; } 556 557 /// Returns the Dwarf Version. 558 unsigned getDwarfVersion() const { return DwarfVersion; } 559 560 /// Returns the section symbol for the .debug_loc section. 561 MCSymbol *getDebugLocSym() const { return DwarfDebugLocSectionSym; } 562 563 /// Returns the section symbol for the .debug_str section. 564 MCSymbol *getDebugStrSym() const { return DwarfStrSectionSym; } 565 566 /// Returns the section symbol for the .debug_ranges section. 567 MCSymbol *getRangeSectionSym() const { return DwarfDebugRangeSectionSym; } 568 569 /// Returns the previous CU that was being updated 570 const DwarfCompileUnit *getPrevCU() const { return PrevCU; } 571 void setPrevCU(const DwarfCompileUnit *PrevCU) { this->PrevCU = PrevCU; } 572 573 /// Returns the entries for the .debug_loc section. 574 const SmallVectorImpl<DebugLocList> & 575 getDebugLocEntries() const { 576 return DotDebugLocEntries; 577 } 578 579 /// \brief Emit an entry for the debug loc section. This can be used to 580 /// handle an entry that's going to be emitted into the debug loc section. 581 void emitDebugLocEntry(ByteStreamer &Streamer, const DebugLocEntry &Entry); 582 /// \brief emit a single value for the debug loc section. 583 void emitDebugLocValue(ByteStreamer &Streamer, 584 const DebugLocEntry::Value &Value); 585 /// Emits an optimal (=sorted) sequence of DW_OP_pieces. 586 void emitLocPieces(ByteStreamer &Streamer, 587 const DITypeIdentifierMap &Map, 588 ArrayRef<DebugLocEntry::Value> Values); 589 590 /// Emit the location for a debug loc entry, including the size header. 591 void emitDebugLocEntryLocation(const DebugLocEntry &Entry); 592 593 /// Find the MDNode for the given reference. 594 template <typename T> T resolve(DIRef<T> Ref) const { 595 return Ref.resolve(TypeIdentifierMap); 596 } 597 598 /// \brief Return the TypeIdentifierMap. 599 const DITypeIdentifierMap &getTypeIdentifierMap() const { 600 return TypeIdentifierMap; 601 } 602 603 /// Find the DwarfCompileUnit for the given CU Die. 604 DwarfCompileUnit *lookupUnit(const DIE *CU) const { 605 return CUDieMap.lookup(CU); 606 } 607 /// isSubprogramContext - Return true if Context is either a subprogram 608 /// or another context nested inside a subprogram. 609 bool isSubprogramContext(const MDNode *Context); 610 611 void addSubprogramNames(DISubprogram SP, DIE &Die); 612 613 AddressPool &getAddressPool() { return AddrPool; } 614 615 void addAccelName(StringRef Name, const DIE &Die); 616 617 void addAccelObjC(StringRef Name, const DIE &Die); 618 619 void addAccelNamespace(StringRef Name, const DIE &Die); 620 621 void addAccelType(StringRef Name, const DIE &Die, char Flags); 622 623 const MachineFunction *getCurrentFunction() const { return CurFn; } 624 const MCSymbol *getFunctionBeginSym() const { return FunctionBeginSym; } 625 const MCSymbol *getFunctionEndSym() const { return FunctionEndSym; } 626 627 iterator_range<ImportedEntityMap::const_iterator> 628 findImportedEntitiesForScope(const MDNode *Scope) const { 629 return make_range(std::equal_range( 630 ScopesWithImportedEntities.begin(), ScopesWithImportedEntities.end(), 631 std::pair<const MDNode *, const MDNode *>(Scope, nullptr), 632 less_first())); 633 } 634 635 /// \brief A helper function to check whether the DIE for a given Scope is 636 /// going to be null. 637 bool isLexicalScopeDIENull(LexicalScope *Scope); 638 639 /// \brief Return Label preceding the instruction. 640 MCSymbol *getLabelBeforeInsn(const MachineInstr *MI); 641 642 /// \brief Return Label immediately following the instruction. 643 MCSymbol *getLabelAfterInsn(const MachineInstr *MI); 644 645 // FIXME: Consider rolling ranges up into DwarfDebug since we use a single 646 // range_base anyway, so there's no need to keep them as separate per-CU range 647 // lists. (though one day we might end up with a range.dwo section, in which 648 // case it'd go to DwarfFile) 649 unsigned getNextRangeNumber() { return GlobalRangeCount++; } 650 651 // FIXME: Sink these functions down into DwarfFile/Dwarf*Unit. 652 653 DenseMap<const MDNode *, DIE *> &getAbstractSPDies() { 654 return AbstractSPDies; 655 } 656 657 SmallPtrSet<const MDNode *, 16> &getProcessedSPNodes() { 658 return ProcessedSPNodes; 659 } 660 }; 661 } // End of namespace llvm 662 663 #endif 664