X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FMC%2FMCDwarf.h;h=8a50863a0c3933d1449a1899bbfc19a492f06e37;hb=ff65de018b6bb5bc4da3e923bbc0f55c5ca8e039;hp=c671dd9fbbce4bfb782cdfa858c2f75cd5f308f2;hpb=ca7b43d01d963deafcc704389935f0f77dcfab0a;p=oota-llvm.git diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index c671dd9fbbc..8a50863a0c3 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -15,76 +15,52 @@ #ifndef LLVM_MC_MCDWARF_H #define LLVM_MC_MCDWARF_H +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/MapVector.h" +#include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/MC/MCSection.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/raw_ostream.h" #include +#include +#include #include namespace llvm { +class MCAsmBackend; class MCContext; -class MCSection; +class MCObjectStreamer; class MCStreamer; class MCSymbol; class SourceMgr; class SMLoc; -/// MCDwarfFile - Instances of this class represent the name of the dwarf +/// \brief Instances of this class represent the name of the dwarf /// .file directive and its associated dwarf file number in the MC file, -/// and MCDwarfFile's are created and unique'd by the MCContext class where +/// and MCDwarfFile's are created and uniqued by the MCContext class where /// the file number for each is its index into the vector of DwarfFiles (note /// index 0 is not used and not a valid dwarf file number). -class MCDwarfFile { - // Name - the base name of the file without its directory path. +struct MCDwarfFile { + // \brief The base name of the file without its directory path. // The StringRef references memory allocated in the MCContext. - StringRef Name; + std::string Name; - // DirIndex - the index into the list of directory names for this file name. + // \brief The index into the list of directory names for this file name. unsigned DirIndex; - -private: // MCContext creates and uniques these. - friend class MCContext; - MCDwarfFile(StringRef name, unsigned dirIndex) - : Name(name), DirIndex(dirIndex) {} - - MCDwarfFile(const MCDwarfFile &) LLVM_DELETED_FUNCTION; - void operator=(const MCDwarfFile &) LLVM_DELETED_FUNCTION; - -public: - /// getName - Get the base name of this MCDwarfFile. - StringRef getName() const { return Name; } - - /// getDirIndex - Get the dirIndex of this MCDwarfFile. - unsigned getDirIndex() const { return DirIndex; } - - /// print - Print the value to the stream \p OS. - void print(raw_ostream &OS) const; - - /// dump - Print the value to stderr. - void dump() const; }; -inline raw_ostream &operator<<(raw_ostream &OS, const MCDwarfFile &DwarfFile) { - DwarfFile.print(OS); - return OS; -} - -/// MCDwarfLoc - Instances of this class represent the information from a +/// \brief Instances of this class represent the information from a /// dwarf .loc directive. class MCDwarfLoc { - // FileNum - the file number. - unsigned FileNum; - // Line - the line number. - unsigned Line; - // Column - the column position. - unsigned Column; + uint32_t FileNum; + uint32_t Line; + uint16_t Column; // Flags (see #define's below) - unsigned Flags; - // Isa - unsigned Isa; - // Discriminator - unsigned Discriminator; + uint8_t Flags; + uint8_t Isa; + uint32_t Discriminator; // Flag that indicates the initial value of the is_stmt_start flag. #define DWARF2_LINE_DEFAULT_IS_STMT 1 @@ -106,46 +82,55 @@ private: // MCContext manages these // for an MCDwarfLoc object. public: - /// getFileNum - Get the FileNum of this MCDwarfLoc. + /// \brief Get the FileNum of this MCDwarfLoc. unsigned getFileNum() const { return FileNum; } - /// getLine - Get the Line of this MCDwarfLoc. + /// \brief Get the Line of this MCDwarfLoc. unsigned getLine() const { return Line; } - /// getColumn - Get the Column of this MCDwarfLoc. + /// \brief Get the Column of this MCDwarfLoc. unsigned getColumn() const { return Column; } - /// getFlags - Get the Flags of this MCDwarfLoc. + /// \brief Get the Flags of this MCDwarfLoc. unsigned getFlags() const { return Flags; } - /// getIsa - Get the Isa of this MCDwarfLoc. + /// \brief Get the Isa of this MCDwarfLoc. unsigned getIsa() const { return Isa; } - /// getDiscriminator - Get the Discriminator of this MCDwarfLoc. + /// \brief Get the Discriminator of this MCDwarfLoc. unsigned getDiscriminator() const { return Discriminator; } - /// setFileNum - Set the FileNum of this MCDwarfLoc. + /// \brief Set the FileNum of this MCDwarfLoc. void setFileNum(unsigned fileNum) { FileNum = fileNum; } - /// setLine - Set the Line of this MCDwarfLoc. + /// \brief Set the Line of this MCDwarfLoc. void setLine(unsigned line) { Line = line; } - /// setColumn - Set the Column of this MCDwarfLoc. - void setColumn(unsigned column) { Column = column; } + /// \brief Set the Column of this MCDwarfLoc. + void setColumn(unsigned column) { + assert(column <= UINT16_MAX); + Column = column; + } - /// setFlags - Set the Flags of this MCDwarfLoc. - void setFlags(unsigned flags) { Flags = flags; } + /// \brief Set the Flags of this MCDwarfLoc. + void setFlags(unsigned flags) { + assert(flags <= UINT8_MAX); + Flags = flags; + } - /// setIsa - Set the Isa of this MCDwarfLoc. - void setIsa(unsigned isa) { Isa = isa; } + /// \brief Set the Isa of this MCDwarfLoc. + void setIsa(unsigned isa) { + assert(isa <= UINT8_MAX); + Isa = isa; + } - /// setDiscriminator - Set the Discriminator of this MCDwarfLoc. + /// \brief Set the Discriminator of this MCDwarfLoc. void setDiscriminator(unsigned discriminator) { Discriminator = discriminator; } }; -/// MCLineEntry - Instances of this class represent the line information for +/// \brief Instances of this class represent the line information for /// the dwarf line table entries. Which is created after a machine /// instruction is assembled and uses an address from a temporary label /// created at the current address in the current section and the info from @@ -167,72 +152,137 @@ public: // This is called when an instruction is assembled into the specified // section and if there is information from the last .loc directive that // has yet to have a line entry made for it is made. - static void Make(MCStreamer *MCOS, const MCSection *Section); + static void Make(MCObjectStreamer *MCOS, MCSection *Section); }; -/// MCLineSection - Instances of this class represent the line information -/// for a section where machine instructions have been assembled after seeing -/// .loc directives. This is the information used to build the dwarf line +/// \brief Instances of this class represent the line information for a compile +/// unit where machine instructions have been assembled after seeing .loc +/// directives. This is the information used to build the dwarf line /// table for a section. class MCLineSection { - -private: - MCLineSection(const MCLineSection &) LLVM_DELETED_FUNCTION; - void operator=(const MCLineSection &) LLVM_DELETED_FUNCTION; - public: - // Constructor to create an MCLineSection with an empty MCLineEntries - // vector. - MCLineSection() {} - - // addLineEntry - adds an entry to this MCLineSection's line entries - void addLineEntry(const MCLineEntry &LineEntry, unsigned CUID) { - MCLineDivisions[CUID].push_back(LineEntry); + // \brief Add an entry to this MCLineSection's line entries. + void addLineEntry(const MCLineEntry &LineEntry, MCSection *Sec) { + MCLineDivisions[Sec].push_back(LineEntry); } typedef std::vector MCLineEntryCollection; typedef MCLineEntryCollection::iterator iterator; typedef MCLineEntryCollection::const_iterator const_iterator; - typedef std::map MCLineDivisionMap; + typedef MapVector MCLineDivisionMap; private: - // A collection of MCLineEntry for each Compile Unit ID. + // A collection of MCLineEntry for each section. MCLineDivisionMap MCLineDivisions; public: - // Returns whether MCLineSection contains entries for a given Compile - // Unit ID. - bool containEntriesForID(unsigned CUID) const { - return MCLineDivisions.count(CUID); - } // Returns the collection of MCLineEntry for a given Compile Unit ID. - const MCLineEntryCollection &getMCLineEntries(unsigned CUID) const { - MCLineDivisionMap::const_iterator CIter = MCLineDivisions.find(CUID); - assert(CIter != MCLineDivisions.end()); - return CIter->second; + const MCLineDivisionMap &getMCLineEntries() const { + return MCLineDivisions; } }; -class MCDwarfFileTable { +struct MCDwarfLineTableParams { + /// First special line opcode - leave room for the standard opcodes. + /// Note: If you want to change this, you'll have to update the + /// "StandardOpcodeLengths" table that is emitted in + /// \c Emit(). + uint8_t DWARF2LineOpcodeBase = 13; + /// Minimum line offset in a special line info. opcode. The value + /// -5 was chosen to give a reasonable range of values. + int8_t DWARF2LineBase = -5; + /// Range of line offsets in a special line info. opcode. + uint8_t DWARF2LineRange = 14; +}; + +struct MCDwarfLineTableHeader { + MCSymbol *Label; + SmallVector MCDwarfDirs; + SmallVector MCDwarfFiles; + StringMap SourceIdMap; + StringRef CompilationDir; + + MCDwarfLineTableHeader() : Label(nullptr) {} + unsigned getFile(StringRef &Directory, StringRef &FileName, + unsigned FileNumber = 0); + std::pair Emit(MCStreamer *MCOS, + MCDwarfLineTableParams Params) const; + std::pair + Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, + ArrayRef SpecialOpcodeLengths) const; +}; + +class MCDwarfDwoLineTable { + MCDwarfLineTableHeader Header; +public: + void setCompilationDir(StringRef CompilationDir) { + Header.CompilationDir = CompilationDir; + } + unsigned getFile(StringRef Directory, StringRef FileName) { + return Header.getFile(Directory, FileName); + } + void Emit(MCStreamer &MCOS, MCDwarfLineTableParams Params) const; +}; + +class MCDwarfLineTable { + MCDwarfLineTableHeader Header; + MCLineSection MCLineSections; + public: - // // This emits the Dwarf file and the line tables for all Compile Units. - // - static const MCSymbol *Emit(MCStreamer *MCOS); - // + static void Emit(MCObjectStreamer *MCOS, MCDwarfLineTableParams Params); + // This emits the Dwarf file and the line tables for a given Compile Unit. - // - static const MCSymbol *EmitCU(MCStreamer *MCOS, unsigned ID); + void EmitCU(MCObjectStreamer *MCOS, MCDwarfLineTableParams Params) const; + + unsigned getFile(StringRef &Directory, StringRef &FileName, + unsigned FileNumber = 0); + + MCSymbol *getLabel() const { + return Header.Label; + } + + void setLabel(MCSymbol *Label) { + Header.Label = Label; + } + + void setCompilationDir(StringRef CompilationDir) { + Header.CompilationDir = CompilationDir; + } + + const SmallVectorImpl &getMCDwarfDirs() const { + return Header.MCDwarfDirs; + } + + SmallVectorImpl &getMCDwarfDirs() { + return Header.MCDwarfDirs; + } + + const SmallVectorImpl &getMCDwarfFiles() const { + return Header.MCDwarfFiles; + } + + SmallVectorImpl &getMCDwarfFiles() { + return Header.MCDwarfFiles; + } + + const MCLineSection &getMCLineSections() const { + return MCLineSections; + } + MCLineSection &getMCLineSections() { + return MCLineSections; + } }; class MCDwarfLineAddr { public: /// Utility function to encode a Dwarf pair of LineDelta and AddrDeltas. - static void Encode(MCContext &Context, int64_t LineDelta, uint64_t AddrDelta, - raw_ostream &OS); + static void Encode(MCContext &Context, MCDwarfLineTableParams Params, + int64_t LineDelta, uint64_t AddrDelta, raw_ostream &OS); /// Utility function to emit the encoding to a streamer. - static void Emit(MCStreamer *MCOS, int64_t LineDelta, uint64_t AddrDelta); + static void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, + int64_t LineDelta, uint64_t AddrDelta); }; class MCGenDwarfInfo { @@ -241,7 +291,7 @@ public: // When generating dwarf for assembly source files this emits the Dwarf // sections. // - static void Emit(MCStreamer *MCOS, const MCSymbol *LineSectionSymbol); + static void Emit(MCStreamer *MCOS); }; // When generating dwarf for assembly source files this is the info that is @@ -289,7 +339,9 @@ public: OpEscape, OpRestore, OpUndefined, - OpRegister + OpRegister, + OpWindowSave, + OpGnuArgsSize }; private: @@ -363,6 +415,11 @@ public: return MCCFIInstruction(OpRegister, L, Register1, Register2); } + /// \brief .cfi_window_save SPARC register window is saved. + static MCCFIInstruction createWindowSave(MCSymbol *L) { + return MCCFIInstruction(OpWindowSave, L, 0, 0, ""); + } + /// \brief .cfi_restore says that the rule for Register is now the same as it /// was at the beginning of the function, after all initial instructions added /// by .cfi_startproc were executed. @@ -398,6 +455,11 @@ public: return MCCFIInstruction(OpEscape, L, 0, 0, Vals); } + /// \brief A special wrapper for .cfi_escape that indicates GNU_ARGS_SIZE + static MCCFIInstruction createGnuArgsSize(MCSymbol *L, int Size) { + return MCCFIInstruction(OpGnuArgsSize, L, 0, Size, ""); + } + OpType getOperation() const { return Operation; } MCSymbol *getLabel() const { return Label; } @@ -417,11 +479,11 @@ public: int getOffset() const { assert(Operation == OpDefCfa || Operation == OpOffset || Operation == OpRelOffset || Operation == OpDefCfaOffset || - Operation == OpAdjustCfaOffset); + Operation == OpAdjustCfaOffset || Operation == OpGnuArgsSize); return Offset; } - const StringRef getValues() const { + StringRef getValues() const { assert(Operation == OpEscape); return StringRef(&Values[0], Values.size()); } @@ -429,19 +491,21 @@ public: struct MCDwarfFrameInfo { MCDwarfFrameInfo() - : Begin(0), End(0), Personality(0), Lsda(0), Function(0), Instructions(), - PersonalityEncoding(), LsdaEncoding(0), CompactUnwindEncoding(0), - IsSignalFrame(false) {} + : Begin(nullptr), End(nullptr), Personality(nullptr), Lsda(nullptr), + Instructions(), CurrentCfaRegister(0), PersonalityEncoding(), + LsdaEncoding(0), CompactUnwindEncoding(0), IsSignalFrame(false), + IsSimple(false) {} MCSymbol *Begin; MCSymbol *End; const MCSymbol *Personality; const MCSymbol *Lsda; - const MCSymbol *Function; std::vector Instructions; + unsigned CurrentCfaRegister; unsigned PersonalityEncoding; unsigned LsdaEncoding; uint32_t CompactUnwindEncoding; bool IsSignalFrame; + bool IsSimple; }; class MCDwarfFrameEmitter { @@ -449,8 +513,8 @@ public: // // This emits the frame info section. // - static void Emit(MCStreamer &streamer, bool usingCFI, bool isEH); - static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta); + static void Emit(MCObjectStreamer &streamer, MCAsmBackend *MAB, bool isEH); + static void EmitAdvanceLoc(MCObjectStreamer &Streamer, uint64_t AddrDelta); static void EncodeAdvanceLoc(MCContext &Context, uint64_t AddrDelta, raw_ostream &OS); };