diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 86f83ad240f..8b30bfcd374 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -70,7 +70,7 @@ namespace llvm { /// The dwarf file and directory tables from the dwarf .file directive. std::vector MCDwarfFiles; - std::vector MCDwarfDirs; + std::vector MCDwarfDirs; /// Allocator - Allocator object used for creating machine code objects. /// diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index 4ba401a49ae..619351400d3 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -16,7 +16,7 @@ #ifndef LLVM_MC_MCDWARF_H #define LLVM_MC_MCDWARF_H -#include +#include "llvm/ADT/StringRef.h" namespace llvm { class MCContext; @@ -29,21 +29,22 @@ namespace llvm { /// 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. - std::string Name; + // The StringRef references memory allocated in the MCContext. + StringRef Name; // DirIndex - the index into the list of directory names for this file name. unsigned DirIndex; private: // MCContext creates and uniques these. friend class MCContext; - MCDwarfFile(std::string name, unsigned dirIndex) + MCDwarfFile(StringRef name, unsigned dirIndex) : Name(name), DirIndex(dirIndex) {} MCDwarfFile(const MCDwarfFile&); // DO NOT IMPLEMENT void operator=(const MCDwarfFile&); // DO NOT IMPLEMENT public: /// getName - Get the base name of this MCDwarfFile. - std::string getName() const { return Name; } + StringRef getName() const { return Name; } /// print - Print the value to the stream \arg OS. void print(raw_ostream &OS) const; diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 7470e8d0031..5812622bb0a 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -213,7 +213,6 @@ unsigned MCContext::GetDwarfFile(StringRef FileName, unsigned FileNumber) { std::pair Slash = FileName.rsplit('/'); // Find or make a entry in the MCDwarfDirs vector for this Directory. - StringRef Directory; StringRef Name; unsigned DirIndex; // Capture directory name. @@ -221,23 +220,24 @@ unsigned MCContext::GetDwarfFile(StringRef FileName, unsigned FileNumber) { Name = Slash.first; DirIndex = 0; // For FileNames with no directories a DirIndex of 0 is used. } else { - Directory = Slash.first; + StringRef Directory = Slash.first; Name = Slash.second; for (DirIndex = 1; DirIndex < MCDwarfDirs.size(); DirIndex++) { - std::string *&Dir = MCDwarfDirs[DirIndex]; - if (Directory == *Dir) + if (Directory == MCDwarfDirs[DirIndex]) break; } if (DirIndex >= MCDwarfDirs.size()) { - MCDwarfDirs.resize(DirIndex + 1); - std::string *&NewDir = MCDwarfDirs[DirIndex]; - NewDir = new (*this) std::string(Directory); + char *Buf = static_cast(Allocate(Directory.size())); + memcpy(Buf, Directory.data(), Directory.size()); + MCDwarfDirs.push_back(StringRef(Buf, Directory.size())); } } // Now make the MCDwarfFile entry and place it in the slot in the MCDwarfFiles // vector. - File = new (*this) MCDwarfFile(Name, DirIndex); + char *Buf = static_cast(Allocate(Name.size())); + memcpy(Buf, Name.data(), Name.size()); + File = new (*this) MCDwarfFile(StringRef(Buf, Name.size()), DirIndex); // return the allocated FileNumber. return FileNumber;