index 635b5dd145454d8f05614d5544195aed2e924474..44eed9406fef639d35412700650730bd96835cd8 100644 (file)
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringMap.h"
-#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/CodeGen/LexicalScopes.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/MC/MachineLocation.h"
+#include "llvm/MC/MCDwarf.h"
#include "llvm/Support/Allocator.h"
namespace llvm {
+class AsmPrinter;
+class ByteStreamer;
+class DwarfDebug;
class DwarfUnit;
class DwarfCompileUnit;
class ConstantInt;
/// \brief This struct describes location entries emitted in the .debug_loc
/// section.
-class DotDebugLocEntry {
+class DebugLocEntry {
// Begin and end symbols for the address range that this location is valid.
const MCSymbol *Begin;
const MCSymbol *End;
// Type of entry that this represents.
- enum EntryType {
- E_Location,
- E_Integer,
- E_ConstantFP,
- E_ConstantInt
- };
+ enum EntryType { E_Location, E_Integer, E_ConstantFP, E_ConstantInt };
enum EntryType EntryKind;
union {
bool Merged;
public:
- DotDebugLocEntry() : Begin(0), End(0), Variable(0), Merged(false) {
+ DebugLocEntry() : Begin(0), End(0), Variable(0), Merged(false) {
Constants.Int = 0;
}
- DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
- const MDNode *V)
+ DebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L,
+ const MDNode *V)
: Begin(B), End(E), Loc(L), Variable(V), Merged(false) {
Constants.Int = 0;
EntryKind = E_Location;
}
- DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i)
+ DebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i)
: Begin(B), End(E), Variable(0), Merged(false) {
Constants.Int = i;
EntryKind = E_Integer;
}
- DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr)
+ DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr)
: Begin(B), End(E), Variable(0), Merged(false) {
Constants.CFP = FPtr;
EntryKind = E_ConstantFP;
}
- DotDebugLocEntry(const MCSymbol *B, const MCSymbol *E,
- const ConstantInt *IPtr)
+ DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr)
: Begin(B), End(E), Variable(0), Merged(false) {
Constants.CIP = IPtr;
EntryKind = E_ConstantInt;
/// \brief Empty entries are also used as a trigger to emit temp label. Such
/// labels are referenced is used to find debug_loc offset for a given DIE.
- bool isEmpty() { return Begin == 0 && End == 0; }
- bool isMerged() { return Merged; }
- void Merge(DotDebugLocEntry *Next) {
+ bool isEmpty() const { return Begin == 0 && End == 0; }
+ bool isMerged() const { return Merged; }
+ void Merge(DebugLocEntry *Next) {
if (!(Begin && Loc == Next->Loc && End == Next->Begin))
return;
Next->Begin = Begin;
/// of in DwarfCompileUnit.
DenseMap<const MDNode *, DIE *> MDTypeNodeToDieMap;
- // Stores the current file ID for a given compile unit.
- DenseMap<unsigned, unsigned> FileIDCUMap;
- // Source id map, i.e. CUID, source filename and directory,
- // separated by a zero byte, mapped to a unique id.
- StringMap<unsigned, BumpPtrAllocator &> SourceIdMap;
+ // Used to unique C++ member function declarations.
+ StringMap<const MDNode *> OdrMemberMap;
// List of all labels used in aranges generation.
std::vector<SymbolCU> ArangeLabels;
// Collection of abstract variables.
DenseMap<const MDNode *, DbgVariable *> AbstractVariables;
- // Collection of DotDebugLocEntry.
- SmallVector<DotDebugLocEntry, 4> DotDebugLocEntries;
+ // Collection of DebugLocEntry.
+ SmallVector<DebugLocEntry, 4> DotDebugLocEntries;
// Collection of subprogram DIEs that are marked (at the end of the module)
// as DW_AT_inline.
// 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.
+ MCDwarfDwoLineTable SplitTypeUnitFileTable;
+
void addScopeVariable(LexicalScope *LS, DbgVariable *Var);
const SmallVectorImpl<DwarfUnit *> &getUnits() {
/// index.
void emitDebugPubTypes(bool GnuStyle = false);
+ void
+ emitDebugPubSection(bool GnuStyle, const MCSection *PSec, StringRef Name,
+ const StringMap<const DIE *> &(DwarfUnit::*Accessor)()
+ const);
+
/// \brief Emit visible names into a debug str section.
void emitDebugStr();
/// \brief Emit the debug abbrev dwo section.
void emitDebugAbbrevDWO();
+ /// \brief Emit the debug line dwo section.
+ void emitDebugLineDWO();
+
/// \brief Emit the debug str dwo section.
void emitDebugStrDWO();
/// \brief Create new DwarfCompileUnit for the given metadata node with tag
/// DW_TAG_compile_unit.
- DwarfCompileUnit *constructDwarfCompileUnit(DICompileUnit DIUnit);
+ DwarfCompileUnit *constructDwarfCompileUnit(DICompileUnit DIUnit,
+ bool Singular);
/// \brief Construct subprogram DIE.
void constructSubprogramDIE(DwarfCompileUnit *TheCU, const MDNode *N);
/// \brief Return Label immediately following the instruction.
MCSymbol *getLabelAfterInsn(const MachineInstr *MI);
+ void attachLowHighPC(DwarfCompileUnit *Unit, DIE *D, MCSymbol *Begin,
+ MCSymbol *End);
+
public:
//===--------------------------------------------------------------------===//
// Main entry points.
return MDTypeNodeToDieMap.lookup(TypeMD);
}
+ /// \brief Look up or create an entry in the OdrMemberMap.
+ const MDNode *&getOrCreateOdrMember(StringRef Key) {
+ return OdrMemberMap.GetOrCreateValue(Key).getValue();
+ }
+
/// \brief Emit all Dwarf sections that should come prior to the
/// content.
void beginModule();
/// \brief Emit all Dwarf sections that should come after the content.
- void endModule();
+ void endModule() override;
/// \brief Gather pre-function debug information.
- void beginFunction(const MachineFunction *MF);
+ void beginFunction(const MachineFunction *MF) override;
/// \brief Gather and emit post-function debug information.
- void endFunction(const MachineFunction *MF);
+ void endFunction(const MachineFunction *MF) override;
/// \brief Process beginning of an instruction.
- void beginInstruction(const MachineInstr *MI);
+ void beginInstruction(const MachineInstr *MI) override;
/// \brief Process end of an instruction.
- void endInstruction();
+ void endInstruction() override;
/// \brief Add a DIE to the set of types that we're going to pull into
/// type units.
/// \brief For symbols that have a size designated (e.g. common symbols),
/// this tracks that size.
- void setSymbolSize(const MCSymbol *Sym, uint64_t Size) {
+ void setSymbolSize(const MCSymbol *Sym, uint64_t Size) override {
SymSize[Sym] = Size;
}
- /// \brief 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
- /// SourceIds map.
- unsigned getOrCreateSourceID(StringRef DirName, StringRef FullName,
- unsigned CUID);
-
/// \brief Recursively Emits a debug information entry.
void emitDIE(DIE *Die);
/// Returns the section symbol for the .debug_loc section.
MCSymbol *getDebugLocSym() const { return DwarfDebugLocSectionSym; }
+ /// Returns the entries for the .debug_loc section.
+ const SmallVectorImpl<DebugLocEntry> &getDebugLocEntries() const {
+ return DotDebugLocEntries;
+ }
+
+ /// \brief 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 DebugLocEntry &Entry);
+
/// Find the MDNode for the given reference.
template <typename T> T resolve(DIRef<T> Ref) const {
return Ref.resolve(TypeIdentifierMap);