MCDwarf: Extract the DWARF line table header handling into its own type

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203856 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie 2014-03-13 21:47:12 +00:00
parent 303d39f1c4
commit 91d5586086
2 changed files with 34 additions and 20 deletions

View File

@ -23,6 +23,7 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include <string> #include <string>
#include <utility>
namespace llvm { namespace llvm {
class MCAsmBackend; class MCAsmBackend;
@ -174,38 +175,49 @@ public:
} }
}; };
class MCDwarfFileTable { struct MCDwarfLineTableHeader {
MCSymbol *Label; MCSymbol *Label;
SmallVector<std::string, 3> MCDwarfDirs; SmallVector<std::string, 3> MCDwarfDirs;
SmallVector<MCDwarfFile, 3> MCDwarfFiles; SmallVector<MCDwarfFile, 3> MCDwarfFiles;
unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber);
std::pair<MCSymbol *, MCSymbol *> Emit(MCStreamer *MCOS) const;
};
class MCDwarfFileTable {
MCDwarfLineTableHeader Header;
MCLineSection MCLineSections; MCLineSection MCLineSections;
public: public:
//
// This emits the Dwarf file and the line tables for all Compile Units. // This emits the Dwarf file and the line tables for all Compile Units.
//
static const MCSymbol *Emit(MCStreamer *MCOS); static const MCSymbol *Emit(MCStreamer *MCOS);
//
// This emits the Dwarf file and the line tables for a given Compile Unit. // This emits the Dwarf file and the line tables for a given Compile Unit.
//
const MCSymbol *EmitCU(MCStreamer *MCOS) const; const MCSymbol *EmitCU(MCStreamer *MCOS) const;
unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber); unsigned getFile(StringRef Directory, StringRef FileName, unsigned FileNumber);
MCSymbol *getLabel() const {
return Header.Label;
}
void setLabel(MCSymbol *Label) {
Header.Label = Label;
}
const SmallVectorImpl<std::string> &getMCDwarfDirs() const { const SmallVectorImpl<std::string> &getMCDwarfDirs() const {
return MCDwarfDirs; return Header.MCDwarfDirs;
} }
SmallVectorImpl<std::string> &getMCDwarfDirs() { SmallVectorImpl<std::string> &getMCDwarfDirs() {
return MCDwarfDirs; return Header.MCDwarfDirs;
} }
const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() const { const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() const {
return MCDwarfFiles; return Header.MCDwarfFiles;
} }
SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() { SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() {
return MCDwarfFiles; return Header.MCDwarfFiles;
} }
const MCLineSection &getMCLineSections() const { const MCLineSection &getMCLineSections() const {
@ -214,14 +226,6 @@ public:
MCLineSection &getMCLineSections() { MCLineSection &getMCLineSections() {
return MCLineSections; return MCLineSections;
} }
MCSymbol *getLabel() const {
return Label;
}
void setLabel(MCSymbol *Label) {
this->Label = Label;
}
}; };
class MCDwarfLineAddr { class MCDwarfLineAddr {

View File

@ -224,11 +224,9 @@ const MCSymbol *MCDwarfFileTable::Emit(MCStreamer *MCOS) {
return LineStartSym; return LineStartSym;
} }
const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const { std::pair<MCSymbol *, MCSymbol *> MCDwarfLineTableHeader::Emit(MCStreamer *MCOS) const {
MCContext &context = MCOS->getContext(); MCContext &context = MCOS->getContext();
// Create a symbol at the beginning of the line table. // Create a symbol at the beginning of the line table.
MCSymbol *LineStartSym = Label; MCSymbol *LineStartSym = Label;
if (!LineStartSym) if (!LineStartSym)
@ -302,6 +300,14 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
// end of the prologue (that was used in a previous expression). // end of the prologue (that was used in a previous expression).
MCOS->EmitLabel(ProEndSym); MCOS->EmitLabel(ProEndSym);
return std::make_pair(LineStartSym, LineEndSym);
}
const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
MCSymbol *LineStartSym;
MCSymbol *LineEndSym;
std::tie(LineStartSym, LineEndSym) = Header.Emit(MCOS);
// Put out the line tables. // Put out the line tables.
for (const auto &LineSec : MCLineSections.getMCLineEntries()) for (const auto &LineSec : MCLineSections.getMCLineEntries())
EmitDwarfLineTable(MCOS, LineSec.first, LineSec.second); EmitDwarfLineTable(MCOS, LineSec.first, LineSec.second);
@ -326,6 +332,10 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
} }
unsigned MCDwarfFileTable::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) { unsigned MCDwarfFileTable::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) {
return Header.getFile(Directory, FileName, FileNumber);
}
unsigned MCDwarfLineTableHeader::getFile(StringRef Directory, StringRef FileName, unsigned FileNumber) {
// Make space for this FileNumber in the MCDwarfFiles vector if needed. // Make space for this FileNumber in the MCDwarfFiles vector if needed.
MCDwarfFiles.resize(FileNumber + 1); MCDwarfFiles.resize(FileNumber + 1);