mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
Service the doxygen comments in DwarfUnit and DwarfDebug.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242046 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ad7556d177
commit
8f5464d3ab
@ -49,7 +49,7 @@ class DwarfUnit;
|
||||
class MachineModuleInfo;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// \brief This class is used to record source line correspondence.
|
||||
/// This class is used to record source line correspondence.
|
||||
class SrcLineInfo {
|
||||
unsigned Line; // Source line number.
|
||||
unsigned Column; // Source column.
|
||||
@ -161,7 +161,7 @@ public:
|
||||
|
||||
return dwarf::DW_TAG_variable;
|
||||
}
|
||||
/// \brief Return true if DbgVariable is artificial.
|
||||
/// Return true if DbgVariable is artificial.
|
||||
bool isArtificial() const {
|
||||
if (Var->isArtificial())
|
||||
return true;
|
||||
@ -190,149 +190,152 @@ public:
|
||||
const DIType *getType() const;
|
||||
|
||||
private:
|
||||
/// resolve - Look in the DwarfDebug map for the MDNode that
|
||||
/// Look in the DwarfDebug map for the MDNode that
|
||||
/// corresponds to the reference.
|
||||
template <typename T> T *resolve(TypedDINodeRef<T> Ref) const;
|
||||
};
|
||||
|
||||
|
||||
/// \brief Helper used to pair up a symbol and its DWARF compile unit.
|
||||
/// Helper used to pair up a symbol and its DWARF compile unit.
|
||||
struct SymbolCU {
|
||||
SymbolCU(DwarfCompileUnit *CU, const MCSymbol *Sym) : Sym(Sym), CU(CU) {}
|
||||
const MCSymbol *Sym;
|
||||
DwarfCompileUnit *CU;
|
||||
};
|
||||
|
||||
/// \brief Collects and handles dwarf debug information.
|
||||
/// Collects and handles dwarf debug information.
|
||||
class DwarfDebug : public AsmPrinterHandler {
|
||||
// Target of Dwarf emission.
|
||||
/// Target of Dwarf emission.
|
||||
AsmPrinter *Asm;
|
||||
|
||||
// Collected machine module information.
|
||||
/// Collected machine module information.
|
||||
MachineModuleInfo *MMI;
|
||||
|
||||
// All DIEValues are allocated through this allocator.
|
||||
/// All DIEValues are allocated through this allocator.
|
||||
BumpPtrAllocator DIEValueAllocator;
|
||||
|
||||
// Maps MDNode with its corresponding DwarfCompileUnit.
|
||||
/// Maps MDNode with its corresponding DwarfCompileUnit.
|
||||
MapVector<const MDNode *, DwarfCompileUnit *> CUMap;
|
||||
|
||||
// Maps subprogram MDNode with its corresponding DwarfCompileUnit.
|
||||
/// Maps subprogram MDNode with its corresponding DwarfCompileUnit.
|
||||
MapVector<const MDNode *, DwarfCompileUnit *> SPMap;
|
||||
|
||||
// Maps a CU DIE with its corresponding DwarfCompileUnit.
|
||||
/// Maps a CU DIE with its corresponding DwarfCompileUnit.
|
||||
DenseMap<const DIE *, DwarfCompileUnit *> CUDieMap;
|
||||
|
||||
// List of all labels used in aranges generation.
|
||||
/// List of all labels used in aranges generation.
|
||||
std::vector<SymbolCU> ArangeLabels;
|
||||
|
||||
// Size of each symbol emitted (for those symbols that have a specific size).
|
||||
/// Size of each symbol emitted (for those symbols that have a specific size).
|
||||
DenseMap<const MCSymbol *, uint64_t> SymSize;
|
||||
|
||||
LexicalScopes LScopes;
|
||||
|
||||
// Collection of abstract variables.
|
||||
/// Collection of abstract variables.
|
||||
DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables;
|
||||
SmallVector<std::unique_ptr<DbgVariable>, 64> ConcreteVariables;
|
||||
|
||||
// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
|
||||
// can refer to them in spite of insertions into this list.
|
||||
/// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
|
||||
/// can refer to them in spite of insertions into this list.
|
||||
DebugLocStream DebugLocs;
|
||||
|
||||
// This is a collection of subprogram MDNodes that are processed to
|
||||
// create DIEs.
|
||||
/// This is a collection of subprogram MDNodes that are processed to
|
||||
/// create DIEs.
|
||||
SmallPtrSet<const MDNode *, 16> ProcessedSPNodes;
|
||||
|
||||
// Maps instruction with label emitted before instruction.
|
||||
/// Maps instruction with label emitted before instruction.
|
||||
DenseMap<const MachineInstr *, MCSymbol *> LabelsBeforeInsn;
|
||||
|
||||
// Maps instruction with label emitted after instruction.
|
||||
/// Maps instruction with label emitted after instruction.
|
||||
DenseMap<const MachineInstr *, MCSymbol *> LabelsAfterInsn;
|
||||
|
||||
// History of DBG_VALUE and clobber instructions for each user variable.
|
||||
// Variables are listed in order of appearance.
|
||||
/// History of DBG_VALUE and clobber instructions for each user
|
||||
/// variable. Variables are listed in order of appearance.
|
||||
DbgValueHistoryMap DbgValues;
|
||||
|
||||
// Previous instruction's location information. This is used to determine
|
||||
// label location to indicate scope boundries in dwarf debug info.
|
||||
/// Previous instruction's location information. This is used to
|
||||
/// determine label location to indicate scope boundries in dwarf
|
||||
/// debug info.
|
||||
DebugLoc PrevInstLoc;
|
||||
MCSymbol *PrevLabel;
|
||||
|
||||
// This location indicates end of function prologue and beginning of function
|
||||
// body.
|
||||
/// This location indicates end of function prologue and beginning of
|
||||
/// function body.
|
||||
DebugLoc PrologEndLoc;
|
||||
|
||||
// If nonnull, stores the current machine function we're processing.
|
||||
/// If nonnull, stores the current machine function we're processing.
|
||||
const MachineFunction *CurFn;
|
||||
|
||||
// If nonnull, stores the current machine instruction we're processing.
|
||||
/// If nonnull, stores the current machine instruction we're processing.
|
||||
const MachineInstr *CurMI;
|
||||
|
||||
// If nonnull, stores the CU in which the previous subprogram was contained.
|
||||
/// If nonnull, stores the CU in which the previous subprogram was contained.
|
||||
const DwarfCompileUnit *PrevCU;
|
||||
|
||||
// As an optimization, there is no need to emit an entry in the directory
|
||||
// table for the same directory as DW_AT_comp_dir.
|
||||
/// As an optimization, there is no need to emit an entry in the directory
|
||||
/// table for the same directory as DW_AT_comp_dir.
|
||||
StringRef CompilationDir;
|
||||
|
||||
// Holder for the file specific debug information.
|
||||
/// Holder for the file specific debug information.
|
||||
DwarfFile InfoHolder;
|
||||
|
||||
// Holders for the various debug information flags that we might need to
|
||||
// have exposed. See accessor functions below for description.
|
||||
/// Holders for the various debug information flags that we might need to
|
||||
/// have exposed. See accessor functions below for description.
|
||||
|
||||
// Holder for imported entities.
|
||||
/// Holder for imported entities.
|
||||
typedef SmallVector<std::pair<const MDNode *, const MDNode *>, 32>
|
||||
ImportedEntityMap;
|
||||
ImportedEntityMap ScopesWithImportedEntities;
|
||||
|
||||
// Map from MDNodes for user-defined types to the type units that describe
|
||||
// them.
|
||||
/// Map from MDNodes for user-defined types to the type units that
|
||||
/// describe them.
|
||||
DenseMap<const MDNode *, const DwarfTypeUnit *> DwarfTypeUnits;
|
||||
|
||||
SmallVector<
|
||||
std::pair<std::unique_ptr<DwarfTypeUnit>, const DICompositeType *>, 1>
|
||||
TypeUnitsUnderConstruction;
|
||||
|
||||
// Whether to emit the pubnames/pubtypes sections.
|
||||
/// Whether to emit the pubnames/pubtypes sections.
|
||||
bool HasDwarfPubSections;
|
||||
|
||||
// Whether or not to use AT_ranges for compilation units.
|
||||
/// Whether or not to use AT_ranges for compilation units.
|
||||
bool HasCURanges;
|
||||
|
||||
// Whether we emitted a function into a section other than the default
|
||||
// text.
|
||||
/// Whether we emitted a function into a section other than the
|
||||
/// default text.
|
||||
bool UsedNonDefaultText;
|
||||
|
||||
// Whether to use the GNU TLS opcode (instead of the standard opcode).
|
||||
/// Whether to use the GNU TLS opcode (instead of the standard opcode).
|
||||
bool UseGNUTLSOpcode;
|
||||
|
||||
// Version of dwarf we're emitting.
|
||||
/// Version of dwarf we're emitting.
|
||||
unsigned DwarfVersion;
|
||||
|
||||
// Maps from a type identifier to the actual MDNode.
|
||||
/// Maps from a type identifier to the actual MDNode.
|
||||
DITypeIdentifierMap TypeIdentifierMap;
|
||||
|
||||
// DWARF5 Experimental Options
|
||||
/// DWARF5 Experimental Options
|
||||
/// @{
|
||||
bool HasDwarfAccelTables;
|
||||
bool HasSplitDwarf;
|
||||
|
||||
// Separated Dwarf Variables
|
||||
// In general these will all be for bits that are left in the
|
||||
// original object file, rather than things that are meant
|
||||
// to be in the .dwo sections.
|
||||
/// Separated Dwarf Variables
|
||||
/// In general these will all be for bits that are left in the
|
||||
/// original object file, rather than things that are meant
|
||||
/// to be in the .dwo sections.
|
||||
|
||||
// Holder for the skeleton information.
|
||||
/// Holder for the skeleton information.
|
||||
DwarfFile SkeletonHolder;
|
||||
|
||||
/// Store file names for type units under fission in a line table header that
|
||||
/// will be emitted into debug_line.dwo.
|
||||
// FIXME: replace this with a map from comp_dir to table so that we can emit
|
||||
// multiple tables during LTO each of which uses directory 0, referencing the
|
||||
// comp_dir of all the type units that use it.
|
||||
/// Store file names for type units under fission in a line table
|
||||
/// header that will be emitted into debug_line.dwo.
|
||||
// FIXME: replace this with a map from comp_dir to table so that we
|
||||
// can emit multiple tables during LTO each of which uses directory
|
||||
// 0, referencing the comp_dir of all the type units that use it.
|
||||
MCDwarfDwoLineTable SplitTypeUnitFileTable;
|
||||
|
||||
// True iff there are multiple CUs in this module.
|
||||
/// @}
|
||||
|
||||
/// True iff there are multiple CUs in this module.
|
||||
bool SingleCU;
|
||||
bool IsDarwin;
|
||||
bool IsPS4;
|
||||
@ -354,7 +357,7 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
|
||||
typedef DbgValueHistoryMap::InlinedVariable InlinedVariable;
|
||||
|
||||
/// \brief Find abstract variable associated with Var.
|
||||
/// Find abstract variable associated with Var.
|
||||
DbgVariable *getExistingAbstractVariable(InlinedVariable IV,
|
||||
const DILocalVariable *&Cleansed);
|
||||
DbgVariable *getExistingAbstractVariable(InlinedVariable IV);
|
||||
@ -366,56 +369,56 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
|
||||
DbgVariable *createConcreteVariable(LexicalScope &Scope, InlinedVariable IV);
|
||||
|
||||
/// \brief Construct a DIE for this abstract scope.
|
||||
/// Construct a DIE for this abstract scope.
|
||||
void constructAbstractSubprogramScopeDIE(LexicalScope *Scope);
|
||||
|
||||
/// \brief Compute the size and offset of a DIE given an incoming Offset.
|
||||
/// Compute the size and offset of a DIE given an incoming Offset.
|
||||
unsigned computeSizeAndOffset(DIE *Die, unsigned Offset);
|
||||
|
||||
/// \brief Compute the size and offset of all the DIEs.
|
||||
/// Compute the size and offset of all the DIEs.
|
||||
void computeSizeAndOffsets();
|
||||
|
||||
/// \brief Collect info for variables that were optimized out.
|
||||
/// Collect info for variables that were optimized out.
|
||||
void collectDeadVariables();
|
||||
|
||||
void finishVariableDefinitions();
|
||||
|
||||
void finishSubprogramDefinitions();
|
||||
|
||||
/// \brief Finish off debug information after all functions have been
|
||||
/// Finish off debug information after all functions have been
|
||||
/// processed.
|
||||
void finalizeModuleInfo();
|
||||
|
||||
/// \brief Emit the debug info section.
|
||||
/// Emit the debug info section.
|
||||
void emitDebugInfo();
|
||||
|
||||
/// \brief Emit the abbreviation section.
|
||||
/// Emit the abbreviation section.
|
||||
void emitAbbreviations();
|
||||
|
||||
/// \brief Emit a specified accelerator table.
|
||||
/// Emit a specified accelerator table.
|
||||
void emitAccel(DwarfAccelTable &Accel, MCSection *Section,
|
||||
StringRef TableName);
|
||||
|
||||
/// \brief Emit visible names into a hashed accelerator table section.
|
||||
/// Emit visible names into a hashed accelerator table section.
|
||||
void emitAccelNames();
|
||||
|
||||
/// \brief Emit objective C classes and categories into a hashed
|
||||
/// Emit objective C classes and categories into a hashed
|
||||
/// accelerator table section.
|
||||
void emitAccelObjC();
|
||||
|
||||
/// \brief Emit namespace dies into a hashed accelerator table.
|
||||
/// Emit namespace dies into a hashed accelerator table.
|
||||
void emitAccelNamespaces();
|
||||
|
||||
/// \brief Emit type dies into a hashed accelerator table.
|
||||
/// Emit type dies into a hashed accelerator table.
|
||||
void emitAccelTypes();
|
||||
|
||||
/// \brief Emit visible names into a debug pubnames section.
|
||||
/// Emit visible names into a debug pubnames section.
|
||||
/// \param GnuStyle determines whether or not we want to emit
|
||||
/// additional information into the table ala newer gcc for gdb
|
||||
/// index.
|
||||
void emitDebugPubNames(bool GnuStyle = false);
|
||||
|
||||
/// \brief Emit visible types into a debug pubtypes section.
|
||||
/// Emit visible types into a debug pubtypes section.
|
||||
/// \param GnuStyle determines whether or not we want to emit
|
||||
/// additional information into the table ala newer gcc for gdb
|
||||
/// index.
|
||||
@ -425,91 +428,91 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
bool GnuStyle, MCSection *PSec, StringRef Name,
|
||||
const StringMap<const DIE *> &(DwarfCompileUnit::*Accessor)() const);
|
||||
|
||||
/// \brief Emit visible names into a debug str section.
|
||||
/// Emit visible names into a debug str section.
|
||||
void emitDebugStr();
|
||||
|
||||
/// \brief Emit visible names into a debug loc section.
|
||||
/// Emit visible names into a debug loc section.
|
||||
void emitDebugLoc();
|
||||
|
||||
/// \brief Emit visible names into a debug loc dwo section.
|
||||
/// Emit visible names into a debug loc dwo section.
|
||||
void emitDebugLocDWO();
|
||||
|
||||
/// \brief Emit visible names into a debug aranges section.
|
||||
/// Emit visible names into a debug aranges section.
|
||||
void emitDebugARanges();
|
||||
|
||||
/// \brief Emit visible names into a debug ranges section.
|
||||
/// Emit visible names into a debug ranges section.
|
||||
void emitDebugRanges();
|
||||
|
||||
/// \brief Emit inline info using custom format.
|
||||
/// Emit inline info using custom format.
|
||||
void emitDebugInlineInfo();
|
||||
|
||||
/// DWARF 5 Experimental Split Dwarf Emitters
|
||||
|
||||
/// \brief Initialize common features of skeleton units.
|
||||
/// Initialize common features of skeleton units.
|
||||
void initSkeletonUnit(const DwarfUnit &U, DIE &Die,
|
||||
std::unique_ptr<DwarfUnit> NewU);
|
||||
|
||||
/// \brief Construct the split debug info compile unit for the debug info
|
||||
/// Construct the split debug info compile unit for the debug info
|
||||
/// section.
|
||||
DwarfCompileUnit &constructSkeletonCU(const DwarfCompileUnit &CU);
|
||||
|
||||
/// \brief Construct the split debug info compile unit for the debug info
|
||||
/// Construct the split debug info compile unit for the debug info
|
||||
/// section.
|
||||
DwarfTypeUnit &constructSkeletonTU(DwarfTypeUnit &TU);
|
||||
|
||||
/// \brief Emit the debug info dwo section.
|
||||
/// Emit the debug info dwo section.
|
||||
void emitDebugInfoDWO();
|
||||
|
||||
/// \brief Emit the debug abbrev dwo section.
|
||||
/// Emit the debug abbrev dwo section.
|
||||
void emitDebugAbbrevDWO();
|
||||
|
||||
/// \brief Emit the debug line dwo section.
|
||||
/// Emit the debug line dwo section.
|
||||
void emitDebugLineDWO();
|
||||
|
||||
/// \brief Emit the debug str dwo section.
|
||||
/// Emit the debug str dwo section.
|
||||
void emitDebugStrDWO();
|
||||
|
||||
/// Flags to let the linker know we have emitted new style pubnames. Only
|
||||
/// emit it here if we don't have a skeleton CU for split dwarf.
|
||||
void addGnuPubAttributes(DwarfUnit &U, DIE &D) const;
|
||||
|
||||
/// \brief Create new DwarfCompileUnit for the given metadata node with tag
|
||||
/// Create new DwarfCompileUnit for the given metadata node with tag
|
||||
/// DW_TAG_compile_unit.
|
||||
DwarfCompileUnit &constructDwarfCompileUnit(const DICompileUnit *DIUnit);
|
||||
|
||||
/// \brief Construct imported_module or imported_declaration DIE.
|
||||
/// Construct imported_module or imported_declaration DIE.
|
||||
void constructAndAddImportedEntityDIE(DwarfCompileUnit &TheCU,
|
||||
const DIImportedEntity *N);
|
||||
|
||||
/// \brief Register a source line with debug info. Returns the unique
|
||||
/// Register a source line with debug info. Returns the unique
|
||||
/// label that was emitted and which provides correspondence to the
|
||||
/// source line list.
|
||||
void recordSourceLine(unsigned Line, unsigned Col, const MDNode *Scope,
|
||||
unsigned Flags);
|
||||
|
||||
/// \brief Indentify instructions that are marking the beginning of or
|
||||
/// Indentify instructions that are marking the beginning of or
|
||||
/// ending of a scope.
|
||||
void identifyScopeMarkers();
|
||||
|
||||
/// \brief Populate LexicalScope entries with variables' info.
|
||||
/// Populate LexicalScope entries with variables' info.
|
||||
void collectVariableInfo(DwarfCompileUnit &TheCU, const DISubprogram *SP,
|
||||
DenseSet<InlinedVariable> &ProcessedVars);
|
||||
|
||||
/// \brief Build the location list for all DBG_VALUEs in the
|
||||
/// Build the location list for all DBG_VALUEs in the
|
||||
/// function that describe the same variable.
|
||||
void buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
|
||||
const DbgValueHistoryMap::InstrRanges &Ranges);
|
||||
|
||||
/// \brief Collect variable information from the side table maintained
|
||||
/// Collect variable information from the side table maintained
|
||||
/// by MMI.
|
||||
void collectVariableInfoFromMMITable(DenseSet<InlinedVariable> &P);
|
||||
|
||||
/// \brief Ensure that a label will be emitted before MI.
|
||||
/// Ensure that a label will be emitted before MI.
|
||||
void requestLabelBeforeInsn(const MachineInstr *MI) {
|
||||
LabelsBeforeInsn.insert(std::make_pair(MI, nullptr));
|
||||
}
|
||||
|
||||
/// \brief Ensure that a label will be emitted after MI.
|
||||
/// Ensure that a label will be emitted after MI.
|
||||
void requestLabelAfterInsn(const MachineInstr *MI) {
|
||||
LabelsAfterInsn.insert(std::make_pair(MI, nullptr));
|
||||
}
|
||||
@ -522,50 +525,50 @@ public:
|
||||
|
||||
~DwarfDebug() override;
|
||||
|
||||
/// \brief Emit all Dwarf sections that should come prior to the
|
||||
/// Emit all Dwarf sections that should come prior to the
|
||||
/// content.
|
||||
void beginModule();
|
||||
|
||||
/// \brief Emit all Dwarf sections that should come after the content.
|
||||
/// Emit all Dwarf sections that should come after the content.
|
||||
void endModule() override;
|
||||
|
||||
/// \brief Gather pre-function debug information.
|
||||
/// Gather pre-function debug information.
|
||||
void beginFunction(const MachineFunction *MF) override;
|
||||
|
||||
/// \brief Gather and emit post-function debug information.
|
||||
/// Gather and emit post-function debug information.
|
||||
void endFunction(const MachineFunction *MF) override;
|
||||
|
||||
/// \brief Process beginning of an instruction.
|
||||
/// Process beginning of an instruction.
|
||||
void beginInstruction(const MachineInstr *MI) override;
|
||||
|
||||
/// \brief Process end of an instruction.
|
||||
/// Process end of an instruction.
|
||||
void endInstruction() override;
|
||||
|
||||
/// \brief Add a DIE to the set of types that we're going to pull into
|
||||
/// Add a DIE to the set of types that we're going to pull into
|
||||
/// type units.
|
||||
void addDwarfTypeUnitType(DwarfCompileUnit &CU, StringRef Identifier,
|
||||
DIE &Die, const DICompositeType *CTy);
|
||||
|
||||
/// \brief Add a label so that arange data can be generated for it.
|
||||
/// Add a label so that arange data can be generated for it.
|
||||
void addArangeLabel(SymbolCU SCU) { ArangeLabels.push_back(SCU); }
|
||||
|
||||
/// \brief For symbols that have a size designated (e.g. common symbols),
|
||||
/// For symbols that have a size designated (e.g. common symbols),
|
||||
/// this tracks that size.
|
||||
void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {
|
||||
SymSize[Sym] = Size;
|
||||
}
|
||||
|
||||
/// \brief Returns whether to use DW_OP_GNU_push_tls_address, instead of the
|
||||
/// Returns whether to use DW_OP_GNU_push_tls_address, instead of the
|
||||
/// standard DW_OP_form_tls_address opcode
|
||||
bool useGNUTLSOpcode() const { return UseGNUTLSOpcode; }
|
||||
|
||||
// Experimental DWARF5 features.
|
||||
|
||||
/// \brief Returns whether or not to emit tables that dwarf consumers can
|
||||
/// Returns whether or not to emit tables that dwarf consumers can
|
||||
/// use to accelerate lookup.
|
||||
bool useDwarfAccelTables() const { return HasDwarfAccelTables; }
|
||||
|
||||
/// \brief Returns whether or not to change the current debug info for the
|
||||
/// Returns whether or not to change the current debug info for the
|
||||
/// split dwarf proposal support.
|
||||
bool useSplitDwarf() const { return HasSplitDwarf; }
|
||||
|
||||
@ -579,7 +582,7 @@ public:
|
||||
/// Returns the entries for the .debug_loc section.
|
||||
const DebugLocStream &getDebugLocs() const { return DebugLocs; }
|
||||
|
||||
/// \brief Emit an entry for the debug loc section. This can be used to
|
||||
/// Emit an entry for the debug loc section. This can be used to
|
||||
/// handle an entry that's going to be emitted into the debug loc section.
|
||||
void emitDebugLocEntry(ByteStreamer &Streamer,
|
||||
const DebugLocStream::Entry &Entry);
|
||||
@ -592,7 +595,7 @@ public:
|
||||
return Ref.resolve(TypeIdentifierMap);
|
||||
}
|
||||
|
||||
/// \brief Return the TypeIdentifierMap.
|
||||
/// Return the TypeIdentifierMap.
|
||||
const DITypeIdentifierMap &getTypeIdentifierMap() const {
|
||||
return TypeIdentifierMap;
|
||||
}
|
||||
@ -627,14 +630,14 @@ public:
|
||||
less_first()));
|
||||
}
|
||||
|
||||
/// \brief A helper function to check whether the DIE for a given Scope is
|
||||
/// A helper function to check whether the DIE for a given Scope is
|
||||
/// going to be null.
|
||||
bool isLexicalScopeDIENull(LexicalScope *Scope);
|
||||
|
||||
/// \brief Return Label preceding the instruction.
|
||||
/// Return Label preceding the instruction.
|
||||
MCSymbol *getLabelBeforeInsn(const MachineInstr *MI);
|
||||
|
||||
/// \brief Return Label immediately following the instruction.
|
||||
/// Return Label immediately following the instruction.
|
||||
MCSymbol *getLabelAfterInsn(const MachineInstr *MI);
|
||||
|
||||
// FIXME: Sink these functions down into DwarfFile/Dwarf*Unit.
|
||||
|
@ -113,7 +113,7 @@ protected:
|
||||
DwarfUnit(unsigned UID, dwarf::Tag, const DICompileUnit *CU, AsmPrinter *A,
|
||||
DwarfDebug *DW, DwarfFile *DWU);
|
||||
|
||||
/// \brief Add a string attribute data and value.
|
||||
/// Add a string attribute data and value.
|
||||
///
|
||||
/// This is guaranteed to be in the local string pool instead of indirected.
|
||||
void addLocalString(DIE &Die, dwarf::Attribute Attribute, StringRef Str);
|
||||
@ -142,10 +142,10 @@ public:
|
||||
unsigned getDebugInfoOffset() const { return DebugInfoOffset; }
|
||||
void setDebugInfoOffset(unsigned DbgInfoOff) { DebugInfoOffset = DbgInfoOff; }
|
||||
|
||||
/// \brief Return true if this compile unit has something to write out.
|
||||
/// Return true if this compile unit has something to write out.
|
||||
bool hasContent() const { return UnitDie.hasChildren(); }
|
||||
|
||||
/// \brief Get string containing language specific context for a global name.
|
||||
/// Get string containing language specific context for a global name.
|
||||
///
|
||||
/// Walks the metadata parent chain in a language specific manner (using the
|
||||
/// compile unit language) and returns it as a string. This is done at the
|
||||
@ -162,42 +162,42 @@ public:
|
||||
virtual void addGlobalType(const DIType *Ty, const DIE &Die,
|
||||
const DIScope *Context) {}
|
||||
|
||||
/// \brief Add a new name to the namespace accelerator table.
|
||||
/// Add a new name to the namespace accelerator table.
|
||||
void addAccelNamespace(StringRef Name, const DIE &Die);
|
||||
|
||||
/// \brief Returns the DIE map slot for the specified debug variable.
|
||||
/// Returns the DIE map slot for the specified debug variable.
|
||||
///
|
||||
/// We delegate the request to DwarfDebug when the MDNode can be part of the
|
||||
/// type system, since DIEs for the type system can be shared across CUs and
|
||||
/// the mappings are kept in DwarfDebug.
|
||||
DIE *getDIE(const DINode *D) const;
|
||||
|
||||
/// \brief Returns a fresh newly allocated DIELoc.
|
||||
/// Returns a fresh newly allocated DIELoc.
|
||||
DIELoc *getDIELoc() { return new (DIEValueAllocator) DIELoc; }
|
||||
|
||||
/// \brief Insert DIE into the map.
|
||||
/// Insert DIE into the map.
|
||||
///
|
||||
/// We delegate the request to DwarfDebug when the MDNode can be part of the
|
||||
/// type system, since DIEs for the type system can be shared across CUs and
|
||||
/// the mappings are kept in DwarfDebug.
|
||||
void insertDIE(const DINode *Desc, DIE *D);
|
||||
|
||||
/// \brief Add a flag that is true to the DIE.
|
||||
/// Add a flag that is true to the DIE.
|
||||
void addFlag(DIE &Die, dwarf::Attribute Attribute);
|
||||
|
||||
/// \brief Add an unsigned integer attribute data and value.
|
||||
/// Add an unsigned integer attribute data and value.
|
||||
void addUInt(DIE &Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form,
|
||||
uint64_t Integer);
|
||||
|
||||
void addUInt(DIE &Block, dwarf::Form Form, uint64_t Integer);
|
||||
|
||||
/// \brief Add an signed integer attribute data and value.
|
||||
/// Add an signed integer attribute data and value.
|
||||
void addSInt(DIE &Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form,
|
||||
int64_t Integer);
|
||||
|
||||
void addSInt(DIELoc &Die, Optional<dwarf::Form> Form, int64_t Integer);
|
||||
|
||||
/// \brief Add a string attribute data and value.
|
||||
/// Add a string attribute data and value.
|
||||
///
|
||||
/// We always emit a reference to the string pool instead of immediate
|
||||
/// strings so that DIEs have more predictable sizes. In the case of split
|
||||
@ -205,38 +205,38 @@ public:
|
||||
/// into the string table.
|
||||
void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str);
|
||||
|
||||
/// \brief Add a Dwarf label attribute data and value.
|
||||
/// Add a Dwarf label attribute data and value.
|
||||
DIE::value_iterator addLabel(DIE &Die, dwarf::Attribute Attribute,
|
||||
dwarf::Form Form, const MCSymbol *Label);
|
||||
|
||||
void addLabel(DIELoc &Die, dwarf::Form Form, const MCSymbol *Label);
|
||||
|
||||
/// \brief Add an offset into a section attribute data and value.
|
||||
/// Add an offset into a section attribute data and value.
|
||||
void addSectionOffset(DIE &Die, dwarf::Attribute Attribute, uint64_t Integer);
|
||||
|
||||
/// \brief Add a dwarf op address data and value using the form given and an
|
||||
/// Add a dwarf op address data and value using the form given and an
|
||||
/// op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
|
||||
void addOpAddress(DIELoc &Die, const MCSymbol *Label);
|
||||
|
||||
/// \brief Add a label delta attribute data and value.
|
||||
/// Add a label delta attribute data and value.
|
||||
void addLabelDelta(DIE &Die, dwarf::Attribute Attribute, const MCSymbol *Hi,
|
||||
const MCSymbol *Lo);
|
||||
|
||||
/// \brief Add a DIE attribute data and value.
|
||||
/// Add a DIE attribute data and value.
|
||||
void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry);
|
||||
|
||||
/// \brief Add a DIE attribute data and value.
|
||||
/// Add a DIE attribute data and value.
|
||||
void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIEEntry Entry);
|
||||
|
||||
void addDIETypeSignature(DIE &Die, const DwarfTypeUnit &Type);
|
||||
|
||||
/// \brief Add block data.
|
||||
/// Add block data.
|
||||
void addBlock(DIE &Die, dwarf::Attribute Attribute, DIELoc *Block);
|
||||
|
||||
/// \brief Add block data.
|
||||
/// Add block data.
|
||||
void addBlock(DIE &Die, dwarf::Attribute Attribute, DIEBlock *Block);
|
||||
|
||||
/// \brief Add location information to specified debug information entry.
|
||||
/// Add location information to specified debug information entry.
|
||||
void addSourceLine(DIE &Die, unsigned Line, StringRef File,
|
||||
StringRef Directory);
|
||||
void addSourceLine(DIE &Die, const DILocalVariable *V);
|
||||
@ -246,30 +246,30 @@ public:
|
||||
void addSourceLine(DIE &Die, const DINamespace *NS);
|
||||
void addSourceLine(DIE &Die, const DIObjCProperty *Ty);
|
||||
|
||||
/// \brief Add constant value entry in variable DIE.
|
||||
/// Add constant value entry in variable DIE.
|
||||
void addConstantValue(DIE &Die, const MachineOperand &MO, const DIType *Ty);
|
||||
void addConstantValue(DIE &Die, const ConstantInt *CI, const DIType *Ty);
|
||||
void addConstantValue(DIE &Die, const APInt &Val, const DIType *Ty);
|
||||
void addConstantValue(DIE &Die, const APInt &Val, bool Unsigned);
|
||||
void addConstantValue(DIE &Die, bool Unsigned, uint64_t Val);
|
||||
|
||||
/// \brief Add constant value entry in variable DIE.
|
||||
/// Add constant value entry in variable DIE.
|
||||
void addConstantFPValue(DIE &Die, const MachineOperand &MO);
|
||||
void addConstantFPValue(DIE &Die, const ConstantFP *CFP);
|
||||
|
||||
/// \brief Add a linkage name, if it isn't empty.
|
||||
/// Add a linkage name, if it isn't empty.
|
||||
void addLinkageName(DIE &Die, StringRef LinkageName);
|
||||
|
||||
/// \brief Add template parameters in buffer.
|
||||
/// Add template parameters in buffer.
|
||||
void addTemplateParams(DIE &Buffer, DINodeArray TParams);
|
||||
|
||||
/// \brief Add register operand.
|
||||
/// Add register operand.
|
||||
/// \returns false if the register does not exist, e.g., because it was never
|
||||
/// materialized.
|
||||
bool addRegisterOpPiece(DIELoc &TheDie, unsigned Reg,
|
||||
unsigned SizeInBits = 0, unsigned OffsetInBits = 0);
|
||||
|
||||
/// \brief Add register offset.
|
||||
/// Add register offset.
|
||||
/// \returns false if the register does not exist, e.g., because it was never
|
||||
/// materialized.
|
||||
bool addRegisterOffset(DIELoc &TheDie, unsigned Reg, int64_t Offset);
|
||||
@ -283,7 +283,7 @@ public:
|
||||
dwarf::Attribute Attribute,
|
||||
const MachineLocation &Location);
|
||||
|
||||
/// \brief Add a new type attribute to the specified entity.
|
||||
/// Add a new type attribute to the specified entity.
|
||||
///
|
||||
/// This takes and attribute parameter because DW_AT_friend attributes are
|
||||
/// also type references.
|
||||
@ -297,19 +297,19 @@ public:
|
||||
void applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie,
|
||||
bool Minimal = false);
|
||||
|
||||
/// \brief Find existing DIE or create new DIE for the given type.
|
||||
/// Find existing DIE or create new DIE for the given type.
|
||||
DIE *getOrCreateTypeDIE(const MDNode *N);
|
||||
|
||||
/// \brief Get context owner's DIE.
|
||||
/// Get context owner's DIE.
|
||||
DIE *createTypeDIE(const DICompositeType *Ty);
|
||||
|
||||
/// \brief Get context owner's DIE.
|
||||
/// Get context owner's DIE.
|
||||
DIE *getOrCreateContextDIE(const DIScope *Context);
|
||||
|
||||
/// \brief Construct DIEs for types that contain vtables.
|
||||
/// Construct DIEs for types that contain vtables.
|
||||
void constructContainingTypeDIEs();
|
||||
|
||||
/// \brief Construct function argument DIEs.
|
||||
/// Construct function argument DIEs.
|
||||
void constructSubprogramArguments(DIE &Buffer, DITypeRefArray Args);
|
||||
|
||||
/// Create a DIE with the given Tag, add the DIE to its parent, and
|
||||
@ -332,14 +332,14 @@ public:
|
||||
void constructTypeDIE(DIE &Buffer, const DICompositeType *CTy);
|
||||
|
||||
protected:
|
||||
/// \brief Create new static data member DIE.
|
||||
/// Create new static data member DIE.
|
||||
DIE *getOrCreateStaticMemberDIE(const DIDerivedType *DT);
|
||||
|
||||
/// Look up the source ID with the given directory and source file names. If
|
||||
/// none currently exists, create a new ID and insert it in the line table.
|
||||
virtual unsigned getOrCreateSourceID(StringRef File, StringRef Directory) = 0;
|
||||
|
||||
/// \brief Look in the DwarfDebug map for the MDNode that corresponds to the
|
||||
/// Look in the DwarfDebug map for the MDNode that corresponds to the
|
||||
/// reference.
|
||||
template <typename T> T *resolve(TypedDINodeRef<T> Ref) const {
|
||||
return DD->resolve(Ref);
|
||||
@ -358,15 +358,15 @@ private:
|
||||
void constructTemplateValueParameterDIE(DIE &Buffer,
|
||||
const DITemplateValueParameter *TVP);
|
||||
|
||||
/// \brief Return the default lower bound for an array.
|
||||
/// Return the default lower bound for an array.
|
||||
///
|
||||
/// If the DWARF version doesn't handle the language, return -1.
|
||||
int64_t getDefaultLowerBound() const;
|
||||
|
||||
/// \brief Get an anonymous type for index type.
|
||||
/// Get an anonymous type for index type.
|
||||
DIE *getIndexTyDie();
|
||||
|
||||
/// \brief Set D as anonymous type for index which can be reused later.
|
||||
/// Set D as anonymous type for index which can be reused later.
|
||||
void setIndexTyDie(DIE *D) { IndexTyDie = D; }
|
||||
|
||||
/// If this is a named finished type then include it in the list of types for
|
||||
|
Loading…
Reference in New Issue
Block a user