MCDwarf: Simplify MCDwarfFile to just use std::string instead of cunning use of MCContext's allocator.

There aren't /that/ many files, and we are already using various maps
and other standard containers that don't use MCContext's allocator to
store these values, so this doesn't seem to be critical and simplifies
the design (I'll be moving construction out of MCContext shortly so it'd
be annoying to have to pass the allocator around to allocate these
things... and we'll have non-MCContext users (debug_line.dwo) shortly)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203831 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie 2014-03-13 18:55:04 +00:00
parent ed2ca70ccf
commit 8c987f5340
5 changed files with 23 additions and 29 deletions

View File

@ -322,7 +322,7 @@ namespace llvm {
return I->second; return I->second;
} }
const SmallVectorImpl<MCDwarfFile *> &getMCDwarfFiles(unsigned CUID = 0) { const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles(unsigned CUID = 0) {
return getMCDwarfFileTable(CUID).getMCDwarfFiles(); return getMCDwarfFileTable(CUID).getMCDwarfFiles();
} }
const SmallVectorImpl<StringRef> &getMCDwarfDirs(unsigned CUID = 0) { const SmallVectorImpl<StringRef> &getMCDwarfDirs(unsigned CUID = 0) {

View File

@ -40,7 +40,7 @@ class SMLoc;
struct MCDwarfFile { struct MCDwarfFile {
// Name - the base name of the file without its directory path. // Name - the base name of the file without its directory path.
// The StringRef references memory allocated in the MCContext. // 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. // DirIndex - the index into the list of directory names for this file name.
unsigned DirIndex; unsigned DirIndex;
@ -176,7 +176,7 @@ public:
class MCDwarfFileTable { class MCDwarfFileTable {
MCSymbol *Label; MCSymbol *Label;
SmallVector<StringRef, 3> MCDwarfDirs; SmallVector<StringRef, 3> MCDwarfDirs;
SmallVector<MCDwarfFile *, 3> MCDwarfFiles; SmallVector<MCDwarfFile, 3> MCDwarfFiles;
MCLineSection MCLineSections; MCLineSection MCLineSections;
public: public:
@ -197,11 +197,11 @@ public:
return MCDwarfDirs; return MCDwarfDirs;
} }
const SmallVectorImpl<MCDwarfFile *> &getMCDwarfFiles() const { const SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() const {
return MCDwarfFiles; return MCDwarfFiles;
} }
SmallVectorImpl<MCDwarfFile *> &getMCDwarfFiles() { SmallVectorImpl<MCDwarfFile> &getMCDwarfFiles() {
return MCDwarfFiles; return MCDwarfFiles;
} }

View File

@ -338,20 +338,19 @@ const MCSectionCOFF *MCContext::getCOFFSection(StringRef Section) {
unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName, unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
unsigned FileNumber, unsigned CUID) { unsigned FileNumber, unsigned CUID) {
MCDwarfFileTable &Table = MCDwarfFileTablesCUMap[CUID]; MCDwarfFileTable &Table = MCDwarfFileTablesCUMap[CUID];
SmallVectorImpl<MCDwarfFile *>& MCDwarfFiles = Table.getMCDwarfFiles(); SmallVectorImpl<MCDwarfFile>& MCDwarfFiles = Table.getMCDwarfFiles();
SmallVectorImpl<StringRef>& MCDwarfDirs = Table.getMCDwarfDirs(); SmallVectorImpl<StringRef>& MCDwarfDirs = Table.getMCDwarfDirs();
// Make space for this FileNumber in the MCDwarfFiles vector if needed. // Make space for this FileNumber in the MCDwarfFiles vector if needed.
if (FileNumber >= MCDwarfFiles.size()) { if (FileNumber >= MCDwarfFiles.size()) {
MCDwarfFiles.resize(FileNumber + 1); MCDwarfFiles.resize(FileNumber + 1);
} else {
MCDwarfFile *&ExistingFile = MCDwarfFiles[FileNumber];
if (ExistingFile)
// It is an error to use see the same number more than once.
return 0;
} }
// Get the new MCDwarfFile slot for this FileNumber. // Get the new MCDwarfFile slot for this FileNumber.
MCDwarfFile *&File = MCDwarfFiles[FileNumber]; MCDwarfFile &File = MCDwarfFiles[FileNumber];
// It is an error to use see the same number more than once.
if (!File.Name.empty())
return 0;
if (Directory.empty()) { if (Directory.empty()) {
// Separate the directory part from the basename of the FileName. // Separate the directory part from the basename of the FileName.
@ -387,13 +386,8 @@ unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
DirIndex++; DirIndex++;
} }
// Now make the MCDwarfFile entry and place it in the slot in the MCDwarfFiles File.Name = FileName;
// vector. File.DirIndex = DirIndex;
char *Buf = static_cast<char *>(Allocate(FileName.size()));
memcpy(Buf, FileName.data(), FileName.size());
File = new (*this) MCDwarfFile;
File->Name = StringRef(Buf, FileName.size());
File->DirIndex = DirIndex;
// return the allocated FileNumber. // return the allocated FileNumber.
return FileNumber; return FileNumber;
@ -402,11 +396,11 @@ unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName,
/// isValidDwarfFileNumber - takes a dwarf file number and returns true if it /// isValidDwarfFileNumber - takes a dwarf file number and returns true if it
/// currently is assigned and false otherwise. /// currently is assigned and false otherwise.
bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) { bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) {
const SmallVectorImpl<MCDwarfFile *>& MCDwarfFiles = getMCDwarfFiles(CUID); const SmallVectorImpl<MCDwarfFile>& MCDwarfFiles = getMCDwarfFiles(CUID);
if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size()) if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size())
return false; return false;
return MCDwarfFiles[FileNumber] != 0; return !MCDwarfFiles[FileNumber].Name.empty();
} }
void MCContext::FatalError(SMLoc Loc, const Twine &Msg) { void MCContext::FatalError(SMLoc Loc, const Twine &Msg) {

View File

@ -289,10 +289,10 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const {
// Second the file table. // Second the file table.
for (unsigned i = 1; i < MCDwarfFiles.size(); i++) { for (unsigned i = 1; i < MCDwarfFiles.size(); i++) {
MCOS->EmitBytes(MCDwarfFiles[i]->Name); // FileName MCOS->EmitBytes(MCDwarfFiles[i].Name); // FileName
MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string MCOS->EmitBytes(StringRef("\0", 1)); // the null term. of the string
// the Directory num // the Directory num
MCOS->EmitULEB128IntValue(MCDwarfFiles[i]->DirIndex); MCOS->EmitULEB128IntValue(MCDwarfFiles[i].DirIndex);
MCOS->EmitIntValue(0, 1); // last modification timestamp (always 0) MCOS->EmitIntValue(0, 1); // last modification timestamp (always 0)
MCOS->EmitIntValue(0, 1); // filesize (always 0) MCOS->EmitIntValue(0, 1); // filesize (always 0)
} }
@ -602,9 +602,9 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS,
MCOS->EmitBytes(MCDwarfDirs[0]); MCOS->EmitBytes(MCDwarfDirs[0]);
MCOS->EmitBytes("/"); MCOS->EmitBytes("/");
} }
const SmallVectorImpl<MCDwarfFile *> &MCDwarfFiles = const SmallVectorImpl<MCDwarfFile> &MCDwarfFiles =
MCOS->getContext().getMCDwarfFiles(); MCOS->getContext().getMCDwarfFiles();
MCOS->EmitBytes(MCDwarfFiles[1]->Name); MCOS->EmitBytes(MCDwarfFiles[1].Name);
MCOS->EmitIntValue(0, 1); // NULL byte to terminate the string. MCOS->EmitIntValue(0, 1); // NULL byte to terminate the string.
// AT_comp_dir, the working directory the assembly was done in. // AT_comp_dir, the working directory the assembly was done in.

View File

@ -662,10 +662,10 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) {
return TokError("unmatched .ifs or .elses"); return TokError("unmatched .ifs or .elses");
// Check to see there are no empty DwarfFile slots. // Check to see there are no empty DwarfFile slots.
const SmallVectorImpl<MCDwarfFile *> &MCDwarfFiles = const SmallVectorImpl<MCDwarfFile> &MCDwarfFiles =
getContext().getMCDwarfFiles(); getContext().getMCDwarfFiles();
for (unsigned i = 1; i < MCDwarfFiles.size(); i++) { for (unsigned i = 1; i < MCDwarfFiles.size(); i++) {
if (!MCDwarfFiles[i]) if (MCDwarfFiles[i].Name.empty())
TokError("unassigned file number: " + Twine(i) + " for .file directives"); TokError("unassigned file number: " + Twine(i) + " for .file directives");
} }
@ -1589,10 +1589,10 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info) {
// If we previously parsed a cpp hash file line comment then make sure the // If we previously parsed a cpp hash file line comment then make sure the
// current Dwarf File is for the CppHashFilename if not then emit the // current Dwarf File is for the CppHashFilename if not then emit the
// Dwarf File table for it and adjust the line number for the .loc. // Dwarf File table for it and adjust the line number for the .loc.
const SmallVectorImpl<MCDwarfFile *> &MCDwarfFiles = const SmallVectorImpl<MCDwarfFile> &MCDwarfFiles =
getContext().getMCDwarfFiles(); getContext().getMCDwarfFiles();
if (CppHashFilename.size() != 0) { if (CppHashFilename.size() != 0) {
if (MCDwarfFiles[getContext().getGenDwarfFileNumber()]->Name != if (MCDwarfFiles[getContext().getGenDwarfFileNumber()].Name !=
CppHashFilename) CppHashFilename)
getStreamer().EmitDwarfFileDirective( getStreamer().EmitDwarfFileDirective(
getContext().nextGenDwarfFileNumber(), StringRef(), getContext().nextGenDwarfFileNumber(), StringRef(),