mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
Simplify DwarfWriter header.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31295 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c35497fc2a
commit
6519546eda
@ -20,380 +20,32 @@
|
||||
#ifndef LLVM_CODEGEN_DWARFWRITER_H
|
||||
#define LLVM_CODEGEN_DWARFWRITER_H
|
||||
|
||||
#include "llvm/ADT/UniqueVector.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
// Forward declarations.
|
||||
|
||||
class AsmPrinter;
|
||||
class CompileUnit;
|
||||
class CompileUnitDesc;
|
||||
class DebugInfoDesc;
|
||||
class DebugVariable;
|
||||
class DebugScope;
|
||||
class DIE;
|
||||
class DIEAbbrev;
|
||||
class GlobalVariableDesc;
|
||||
class Dwarf;
|
||||
class MachineDebugInfo;
|
||||
class MachineFunction;
|
||||
class MachineLocation;
|
||||
class MachineMove;
|
||||
class Module;
|
||||
class MRegisterInfo;
|
||||
class SubprogramDesc;
|
||||
class SourceLineInfo;
|
||||
class TargetAsmInfo;
|
||||
class TargetData;
|
||||
class Type;
|
||||
class TypeDesc;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DWLabel - Labels are used to track locations in the assembler file.
|
||||
// Labels appear in the form <prefix>debug_<Tag><Number>, where the tag is a
|
||||
// category of label (Ex. location) and number is a value unique in that
|
||||
// category.
|
||||
class DWLabel {
|
||||
public:
|
||||
const char *Tag; // Label category tag. Should always be
|
||||
// a staticly declared C string.
|
||||
unsigned Number; // Unique number.
|
||||
|
||||
DWLabel(const char *T, unsigned N) : Tag(T), Number(N) {}
|
||||
};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DwarfWriter - Emits Dwarf debug and exception handling directives.
|
||||
//
|
||||
|
||||
class DwarfWriter {
|
||||
|
||||
private:
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Core attributes used by the Dwarf writer.
|
||||
//
|
||||
/// DM - Provides the DwarfWriter implementation.
|
||||
///
|
||||
Dwarf *DW;
|
||||
|
||||
//
|
||||
/// O - Stream to .s file.
|
||||
///
|
||||
std::ostream &O;
|
||||
|
||||
/// Asm - Target of Dwarf emission.
|
||||
///
|
||||
AsmPrinter *Asm;
|
||||
|
||||
/// TAI - Target Asm Printer.
|
||||
const TargetAsmInfo *TAI;
|
||||
|
||||
/// TD - Target data.
|
||||
const TargetData *TD;
|
||||
|
||||
/// RI - Register Information.
|
||||
const MRegisterInfo *RI;
|
||||
|
||||
/// M - Current module.
|
||||
///
|
||||
Module *M;
|
||||
|
||||
/// MF - Current machine function.
|
||||
///
|
||||
MachineFunction *MF;
|
||||
|
||||
/// DebugInfo - Collected debug information.
|
||||
///
|
||||
MachineDebugInfo *DebugInfo;
|
||||
|
||||
/// didInitial - Flag to indicate if initial emission has been done.
|
||||
///
|
||||
bool didInitial;
|
||||
|
||||
/// shouldEmit - Flag to indicate if debug information should be emitted.
|
||||
///
|
||||
bool shouldEmit;
|
||||
|
||||
/// SubprogramCount - The running count of functions being compiled.
|
||||
///
|
||||
unsigned SubprogramCount;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Attributes used to construct specific Dwarf sections.
|
||||
//
|
||||
|
||||
/// CompileUnits - All the compile units involved in this build. The index
|
||||
/// of each entry in this vector corresponds to the sources in DebugInfo.
|
||||
std::vector<CompileUnit *> CompileUnits;
|
||||
|
||||
/// Abbreviations - A UniqueVector of TAG structure abbreviations.
|
||||
///
|
||||
UniqueVector<DIEAbbrev> Abbreviations;
|
||||
|
||||
/// StringPool - A UniqueVector of strings used by indirect references.
|
||||
/// UnitMap - Map debug information descriptor to compile unit.
|
||||
///
|
||||
UniqueVector<std::string> StringPool;
|
||||
|
||||
/// UnitMap - Map debug information descriptor to compile unit.
|
||||
///
|
||||
std::map<DebugInfoDesc *, CompileUnit *> DescToUnitMap;
|
||||
|
||||
/// DescToDieMap - Tracks the mapping of top level debug informaton
|
||||
/// descriptors to debug information entries.
|
||||
std::map<DebugInfoDesc *, DIE *> DescToDieMap;
|
||||
|
||||
/// SectionMap - Provides a unique id per text section.
|
||||
///
|
||||
UniqueVector<std::string> SectionMap;
|
||||
|
||||
/// SectionSourceLines - Tracks line numbers per text section.
|
||||
///
|
||||
std::vector<std::vector<SourceLineInfo> > SectionSourceLines;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Emission and print routines
|
||||
//
|
||||
|
||||
/// PrintHex - Print a value as a hexidecimal value.
|
||||
///
|
||||
void PrintHex(int Value) const;
|
||||
|
||||
/// EOL - Print a newline character to asm stream. If a comment is present
|
||||
/// then it will be printed first. Comments should not contain '\n'.
|
||||
void EOL(const std::string &Comment) const;
|
||||
|
||||
/// EmitAlign - Print a align directive.
|
||||
///
|
||||
void EmitAlign(unsigned Alignment) const;
|
||||
|
||||
/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an
|
||||
/// unsigned leb128 value.
|
||||
void EmitULEB128Bytes(unsigned Value) const;
|
||||
|
||||
/// EmitSLEB128Bytes - print an assembler byte data directive to compose a
|
||||
/// signed leb128 value.
|
||||
void EmitSLEB128Bytes(int Value) const;
|
||||
|
||||
/// PrintULEB128 - Print a series of hexidecimal values (separated by
|
||||
/// commas) representing an unsigned leb128 value.
|
||||
void PrintULEB128(unsigned Value) const;
|
||||
|
||||
/// SizeULEB128 - Compute the number of bytes required for an unsigned
|
||||
/// leb128 value.
|
||||
static unsigned SizeULEB128(unsigned Value);
|
||||
|
||||
/// PrintSLEB128 - Print a series of hexidecimal values (separated by
|
||||
/// commas) representing a signed leb128 value.
|
||||
void PrintSLEB128(int Value) const;
|
||||
|
||||
/// SizeSLEB128 - Compute the number of bytes required for a signed leb128
|
||||
/// value.
|
||||
static unsigned SizeSLEB128(int Value);
|
||||
|
||||
/// EmitInt8 - Emit a byte directive and value.
|
||||
///
|
||||
void EmitInt8(int Value) const;
|
||||
|
||||
/// EmitInt16 - Emit a short directive and value.
|
||||
///
|
||||
void EmitInt16(int Value) const;
|
||||
|
||||
/// EmitInt32 - Emit a long directive and value.
|
||||
///
|
||||
void EmitInt32(int Value) const;
|
||||
|
||||
/// EmitInt64 - Emit a long long directive and value.
|
||||
///
|
||||
void EmitInt64(uint64_t Value) const;
|
||||
|
||||
/// EmitString - Emit a string with quotes and a null terminator.
|
||||
/// Special characters are emitted properly.
|
||||
/// \literal (Eg. '\t') \endliteral
|
||||
void EmitString(const std::string &String) const;
|
||||
|
||||
/// PrintLabelName - Print label name in form used by Dwarf writer.
|
||||
///
|
||||
void PrintLabelName(DWLabel Label) const {
|
||||
PrintLabelName(Label.Tag, Label.Number);
|
||||
}
|
||||
void PrintLabelName(const char *Tag, unsigned Number) const;
|
||||
|
||||
/// EmitLabel - Emit location label for internal use by Dwarf.
|
||||
///
|
||||
void EmitLabel(DWLabel Label) const {
|
||||
EmitLabel(Label.Tag, Label.Number);
|
||||
}
|
||||
void EmitLabel(const char *Tag, unsigned Number) const;
|
||||
|
||||
/// EmitReference - Emit a reference to a label.
|
||||
///
|
||||
void EmitReference(DWLabel Label) const {
|
||||
EmitReference(Label.Tag, Label.Number);
|
||||
}
|
||||
void EmitReference(const char *Tag, unsigned Number) const;
|
||||
void EmitReference(const std::string &Name) const;
|
||||
|
||||
/// EmitDifference - Emit the difference between two labels. Some
|
||||
/// assemblers do not behave with absolute expressions with data directives,
|
||||
/// so there is an option (needsSet) to use an intermediary set expression.
|
||||
void EmitDifference(DWLabel LabelHi, DWLabel LabelLo) const {
|
||||
EmitDifference(LabelHi.Tag, LabelHi.Number, LabelLo.Tag, LabelLo.Number);
|
||||
}
|
||||
void EmitDifference(const char *TagHi, unsigned NumberHi,
|
||||
const char *TagLo, unsigned NumberLo) const;
|
||||
|
||||
/// NewAbbreviation - Add the abbreviation to the Abbreviation vector.
|
||||
///
|
||||
unsigned NewAbbreviation(DIEAbbrev *Abbrev);
|
||||
|
||||
/// NewString - Add a string to the constant pool and returns a label.
|
||||
///
|
||||
DWLabel NewString(const std::string &String);
|
||||
|
||||
/// getDieMapSlotFor - Returns the debug information entry map slot for the
|
||||
/// specified debug descriptor.
|
||||
DIE *&getDieMapSlotFor(DebugInfoDesc *DD);
|
||||
|
||||
private:
|
||||
|
||||
/// AddSourceLine - Add location information to specified debug information
|
||||
/// entry.
|
||||
void AddSourceLine(DIE *Die, CompileUnitDesc *File, unsigned Line);
|
||||
|
||||
/// AddAddress - Add an address attribute to a die based on the location
|
||||
/// provided.
|
||||
void AddAddress(DIE *Die, unsigned Attribute,
|
||||
const MachineLocation &Location);
|
||||
|
||||
/// NewType - Create a new type DIE.
|
||||
///
|
||||
DIE *NewType(DIE *Context, TypeDesc *TyDesc, CompileUnit *Unit);
|
||||
|
||||
/// NewCompileUnit - Create new compile unit and it's die.
|
||||
///
|
||||
CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID);
|
||||
|
||||
/// FindCompileUnit - Get the compile unit for the given descriptor.
|
||||
///
|
||||
CompileUnit *FindCompileUnit(CompileUnitDesc *UnitDesc);
|
||||
|
||||
/// NewGlobalVariable - Make a new global variable DIE.
|
||||
///
|
||||
DIE *NewGlobalVariable(GlobalVariableDesc *GVD);
|
||||
|
||||
/// NewSubprogram - Add a new subprogram DIE.
|
||||
///
|
||||
DIE *NewSubprogram(SubprogramDesc *SPD);
|
||||
|
||||
/// NewScopeVariable - Create a new scope variable.
|
||||
///
|
||||
DIE *NewScopeVariable(DebugVariable *DV, CompileUnit *Unit);
|
||||
|
||||
/// ConstructScope - Construct the components of a scope.
|
||||
///
|
||||
void ConstructScope(DebugScope *ParentScope, DIE *ParentDie,
|
||||
CompileUnit *Unit);
|
||||
|
||||
/// ConstructRootScope - Construct the scope for the subprogram.
|
||||
///
|
||||
void ConstructRootScope(DebugScope *RootScope);
|
||||
|
||||
/// EmitInitial - Emit initial Dwarf declarations.
|
||||
///
|
||||
void EmitInitial();
|
||||
|
||||
/// EmitDIE - Recusively Emits a debug information entry.
|
||||
///
|
||||
void EmitDIE(DIE *Die) const;
|
||||
|
||||
/// SizeAndOffsetDie - Compute the size and offset of a DIE.
|
||||
///
|
||||
unsigned SizeAndOffsetDie(DIE *Die, unsigned Offset, bool Last);
|
||||
|
||||
/// SizeAndOffsets - Compute the size and offset of all the DIEs.
|
||||
///
|
||||
void SizeAndOffsets();
|
||||
|
||||
/// EmitFrameMoves - Emit frame instructions to describe the layout of the
|
||||
/// frame.
|
||||
void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
|
||||
std::vector<MachineMove *> &Moves);
|
||||
|
||||
/// EmitDebugInfo - Emit the debug info section.
|
||||
///
|
||||
void EmitDebugInfo() const;
|
||||
|
||||
/// EmitAbbreviations - Emit the abbreviation section.
|
||||
///
|
||||
void EmitAbbreviations() const;
|
||||
|
||||
/// EmitDebugLines - Emit source line information.
|
||||
///
|
||||
void EmitDebugLines() const;
|
||||
|
||||
/// EmitInitialDebugFrame - Emit common frame info into a debug frame section.
|
||||
///
|
||||
void EmitInitialDebugFrame();
|
||||
|
||||
/// EmitFunctionDebugFrame - Emit per function frame info into a debug frame
|
||||
/// section.
|
||||
void EmitFunctionDebugFrame();
|
||||
|
||||
/// EmitDebugPubNames - Emit info into a debug pubnames section.
|
||||
///
|
||||
void EmitDebugPubNames();
|
||||
|
||||
/// EmitDebugStr - Emit info into a debug str section.
|
||||
///
|
||||
void EmitDebugStr();
|
||||
|
||||
/// EmitDebugLoc - Emit info into a debug loc section.
|
||||
///
|
||||
void EmitDebugLoc();
|
||||
|
||||
/// EmitDebugARanges - Emit info into a debug aranges section.
|
||||
///
|
||||
void EmitDebugARanges();
|
||||
|
||||
/// EmitDebugRanges - Emit info into a debug ranges section.
|
||||
///
|
||||
void EmitDebugRanges();
|
||||
|
||||
/// EmitDebugMacInfo - Emit info into a debug macinfo section.
|
||||
///
|
||||
void EmitDebugMacInfo();
|
||||
|
||||
/// ConstructCompileUnitDIEs - Create a compile unit DIE for each source and
|
||||
/// header file.
|
||||
void ConstructCompileUnitDIEs();
|
||||
|
||||
/// ConstructGlobalDIEs - Create DIEs for each of the externally visible
|
||||
/// global variables.
|
||||
void ConstructGlobalDIEs();
|
||||
|
||||
/// ConstructSubprogramDIEs - Create DIEs for each of the externally visible
|
||||
/// subprograms.
|
||||
void ConstructSubprogramDIEs();
|
||||
|
||||
/// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
|
||||
///
|
||||
bool ShouldEmitDwarf() const { return shouldEmit; }
|
||||
|
||||
public:
|
||||
|
||||
DwarfWriter(std::ostream &OS, AsmPrinter *A, const TargetAsmInfo *T);
|
||||
virtual ~DwarfWriter();
|
||||
|
||||
// Accessors.
|
||||
//
|
||||
const TargetAsmInfo *getTargetAsmInfo() const { return TAI; }
|
||||
|
||||
/// SetDebugInfo - Set DebugInfo when it's known that pass manager has
|
||||
/// created it. Set by the target AsmPrinter.
|
||||
void SetDebugInfo(MachineDebugInfo *DI);
|
||||
@ -417,12 +69,9 @@ public:
|
||||
/// EndFunction - Gather and emit post-function debug information.
|
||||
///
|
||||
void EndFunction();
|
||||
|
||||
/// NonFunction - Function does not have a true body.
|
||||
///
|
||||
void NonFunction();
|
||||
};
|
||||
|
||||
|
||||
} // end llvm namespace
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user