diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index cdd8f58bec4..86578cc419c 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -322,7 +322,7 @@ namespace llvm { return I->second; } - const SmallVectorImpl &getMCDwarfFiles(unsigned CUID = 0) { + const SmallVectorImpl &getMCDwarfFiles(unsigned CUID = 0) { return getMCDwarfFileTable(CUID).getMCDwarfFiles(); } const SmallVectorImpl &getMCDwarfDirs(unsigned CUID = 0) { diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index 7ad2ad0ff68..6ad26c4721b 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -40,7 +40,7 @@ class SMLoc; struct MCDwarfFile { // Name - 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. unsigned DirIndex; @@ -176,7 +176,7 @@ public: class MCDwarfFileTable { MCSymbol *Label; SmallVector MCDwarfDirs; - SmallVector MCDwarfFiles; + SmallVector MCDwarfFiles; MCLineSection MCLineSections; public: @@ -197,11 +197,11 @@ public: return MCDwarfDirs; } - const SmallVectorImpl &getMCDwarfFiles() const { + const SmallVectorImpl &getMCDwarfFiles() const { return MCDwarfFiles; } - SmallVectorImpl &getMCDwarfFiles() { + SmallVectorImpl &getMCDwarfFiles() { return MCDwarfFiles; } diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 5ec5c35630c..3c8de997124 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -338,20 +338,19 @@ const MCSectionCOFF *MCContext::getCOFFSection(StringRef Section) { unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName, unsigned FileNumber, unsigned CUID) { MCDwarfFileTable &Table = MCDwarfFileTablesCUMap[CUID]; - SmallVectorImpl& MCDwarfFiles = Table.getMCDwarfFiles(); + SmallVectorImpl& MCDwarfFiles = Table.getMCDwarfFiles(); SmallVectorImpl& MCDwarfDirs = Table.getMCDwarfDirs(); // Make space for this FileNumber in the MCDwarfFiles vector if needed. if (FileNumber >= MCDwarfFiles.size()) { 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. - 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()) { // Separate the directory part from the basename of the FileName. @@ -387,13 +386,8 @@ unsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName, DirIndex++; } - // Now make the MCDwarfFile entry and place it in the slot in the MCDwarfFiles - // vector. - char *Buf = static_cast(Allocate(FileName.size())); - memcpy(Buf, FileName.data(), FileName.size()); - File = new (*this) MCDwarfFile; - File->Name = StringRef(Buf, FileName.size()); - File->DirIndex = DirIndex; + File.Name = FileName; + File.DirIndex = DirIndex; // return the allocated 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 /// currently is assigned and false otherwise. bool MCContext::isValidDwarfFileNumber(unsigned FileNumber, unsigned CUID) { - const SmallVectorImpl& MCDwarfFiles = getMCDwarfFiles(CUID); + const SmallVectorImpl& MCDwarfFiles = getMCDwarfFiles(CUID); if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size()) return false; - return MCDwarfFiles[FileNumber] != 0; + return !MCDwarfFiles[FileNumber].Name.empty(); } void MCContext::FatalError(SMLoc Loc, const Twine &Msg) { diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index d1e24fd65f0..2c1874f5e91 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -289,10 +289,10 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS) const { // Second the file table. 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 // 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); // filesize (always 0) } @@ -602,9 +602,9 @@ static void EmitGenDwarfInfo(MCStreamer *MCOS, MCOS->EmitBytes(MCDwarfDirs[0]); MCOS->EmitBytes("/"); } - const SmallVectorImpl &MCDwarfFiles = + const SmallVectorImpl &MCDwarfFiles = MCOS->getContext().getMCDwarfFiles(); - MCOS->EmitBytes(MCDwarfFiles[1]->Name); + MCOS->EmitBytes(MCDwarfFiles[1].Name); MCOS->EmitIntValue(0, 1); // NULL byte to terminate the string. // AT_comp_dir, the working directory the assembly was done in. diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 889fb9dcb34..f3cf8f2d1c7 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -662,10 +662,10 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) { return TokError("unmatched .ifs or .elses"); // Check to see there are no empty DwarfFile slots. - const SmallVectorImpl &MCDwarfFiles = + const SmallVectorImpl &MCDwarfFiles = getContext().getMCDwarfFiles(); 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"); } @@ -1589,10 +1589,10 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info) { // 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 // Dwarf File table for it and adjust the line number for the .loc. - const SmallVectorImpl &MCDwarfFiles = + const SmallVectorImpl &MCDwarfFiles = getContext().getMCDwarfFiles(); if (CppHashFilename.size() != 0) { - if (MCDwarfFiles[getContext().getGenDwarfFileNumber()]->Name != + if (MCDwarfFiles[getContext().getGenDwarfFileNumber()].Name != CppHashFilename) getStreamer().EmitDwarfFileDirective( getContext().nextGenDwarfFileNumber(), StringRef(),