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

View File

@ -224,11 +224,9 @@ const MCSymbol *MCDwarfFileTable::Emit(MCStreamer *MCOS) {
return LineStartSym;
}
const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
std::pair<MCSymbol *, MCSymbol *> MCDwarfLineTableHeader::Emit(MCStreamer *MCOS) const {
MCContext &context = MCOS->getContext();
// Create a symbol at the beginning of the line table.
MCSymbol *LineStartSym = Label;
if (!LineStartSym)
@ -302,6 +300,14 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
// end of the prologue (that was used in a previous expression).
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.
for (const auto &LineSec : MCLineSections.getMCLineEntries())
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) {
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.
MCDwarfFiles.resize(FileNumber + 1);