llvm-6502/include/llvm/CodeGen/DwarfWriter.h
2006-09-07 22:06:40 +00:00

429 lines
13 KiB
C++

//===-- llvm/CodeGen/DwarfWriter.h - Dwarf Framework ------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by James M. Laskey and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains support for writing Dwarf debug info into asm files. For
// Details on the Dwarf 3 specfication see DWARF Debugging Information Format
// V.3 reference manual http://dwarf.freestandards.org ,
//
// The role of the Dwarf Writer class is to extract debug information from the
// MachineDebugInfo object, organize it in Dwarf form and then emit it into asm
// the current asm file using data and high level Dwarf directives.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_DWARFWRITER_H
#define LLVM_CODEGEN_DWARFWRITER_H
#include "llvm/ADT/UniqueVector.h"
#include "llvm/Support/DataTypes.h"
#include <iosfwd>
#include <string>
namespace llvm {
// Forward declarations.
class AsmPrinter;
class CompileUnit;
class CompileUnitDesc;
class DebugInfoDesc;
class DebugVariable;
class DebugScope;
class DIE;
class DIEAbbrev;
class GlobalVariableDesc;
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.
//
//
/// 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);
//===--------------------------------------------------------------------===//
// Main entry points.
//
/// BeginModule - Emit all Dwarf sections that should come prior to the
/// content.
void BeginModule(Module *M);
/// EndModule - Emit all Dwarf sections that should come after the content.
///
void EndModule();
/// BeginFunction - Gather pre-function debug information. Assumes being
/// emitted immediately after the function entry point.
void BeginFunction(MachineFunction *MF);
/// EndFunction - Gather and emit post-function debug information.
///
void EndFunction();
/// NonFunction - Function does not have a true body.
///
void NonFunction();
};
} // end llvm namespace
#endif