mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
a8284f65e1
code in sections other than ".text", including weak sections like ctors and dtors. llvm-svn: 28909
499 lines
15 KiB
C++
499 lines
15 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 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 {
|
|
protected:
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Core attributes used by the Dwarf writer.
|
|
//
|
|
|
|
//
|
|
/// O - Stream to .s file.
|
|
///
|
|
std::ostream &O;
|
|
|
|
/// Asm - Target of Dwarf emission.
|
|
///
|
|
AsmPrinter *Asm;
|
|
|
|
/// 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;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Properties to be set by the derived class ctor, used to configure the
|
|
// Dwarf writer.
|
|
//
|
|
|
|
/// AddressSize - Size of addresses used in file.
|
|
///
|
|
unsigned AddressSize;
|
|
|
|
/// hasLEB128 - True if target asm supports leb128 directives.
|
|
///
|
|
bool hasLEB128; /// Defaults to false.
|
|
|
|
/// hasDotLoc - True if target asm supports .loc directives.
|
|
///
|
|
bool hasDotLoc; /// Defaults to false.
|
|
|
|
/// hasDotFile - True if target asm supports .file directives.
|
|
///
|
|
bool hasDotFile; /// Defaults to false.
|
|
|
|
/// needsSet - True if target asm can't compute addresses on data
|
|
/// directives.
|
|
bool needsSet; /// Defaults to false.
|
|
|
|
/// DwarfAbbrevSection - Section directive for Dwarf abbrev.
|
|
///
|
|
const char *DwarfAbbrevSection; /// Defaults to ".debug_abbrev".
|
|
|
|
/// DwarfInfoSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfInfoSection; /// Defaults to ".debug_info".
|
|
|
|
/// DwarfLineSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfLineSection; /// Defaults to ".debug_line".
|
|
|
|
/// DwarfFrameSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfFrameSection; /// Defaults to ".debug_frame".
|
|
|
|
/// DwarfPubNamesSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfPubNamesSection; /// Defaults to ".debug_pubnames".
|
|
|
|
/// DwarfPubTypesSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfPubTypesSection; /// Defaults to ".debug_pubtypes".
|
|
|
|
/// DwarfStrSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfStrSection; /// Defaults to ".debug_str".
|
|
|
|
/// DwarfLocSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfLocSection; /// Defaults to ".debug_loc".
|
|
|
|
/// DwarfARangesSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfARangesSection; /// Defaults to ".debug_aranges".
|
|
|
|
/// DwarfRangesSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfRangesSection; /// Defaults to ".debug_ranges".
|
|
|
|
/// DwarfMacInfoSection - Section directive for Dwarf info.
|
|
///
|
|
const char *DwarfMacInfoSection; /// Defaults to ".debug_macinfo".
|
|
|
|
/// TextSection - Section directive for standard text.
|
|
///
|
|
const char *TextSection; /// Defaults to ".text".
|
|
|
|
/// DataSection - Section directive for standard data.
|
|
///
|
|
const char *DataSection; /// Defaults to ".data".
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Emission and print routines
|
|
//
|
|
|
|
public:
|
|
/// getAddressSize - Return the size of a target address in bytes.
|
|
///
|
|
unsigned getAddressSize() const { return AddressSize; }
|
|
|
|
/// 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);
|
|
virtual ~DwarfWriter();
|
|
|
|
/// 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
|