mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
Stop leaking std::strings in GetDwarfFile.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109746 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
808ecfce6a
commit
3bce5adb32
@ -70,7 +70,7 @@ namespace llvm {
|
||||
|
||||
/// The dwarf file and directory tables from the dwarf .file directive.
|
||||
std::vector<MCDwarfFile *> MCDwarfFiles;
|
||||
std::vector<std::string *> MCDwarfDirs;
|
||||
std::vector<StringRef> MCDwarfDirs;
|
||||
|
||||
/// Allocator - Allocator object used for creating machine code objects.
|
||||
///
|
||||
|
@ -16,7 +16,7 @@
|
||||
#ifndef LLVM_MC_MCDWARF_H
|
||||
#define LLVM_MC_MCDWARF_H
|
||||
|
||||
#include <string>
|
||||
#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;
|
||||
|
@ -213,7 +213,6 @@ unsigned MCContext::GetDwarfFile(StringRef FileName, unsigned FileNumber) {
|
||||
std::pair<StringRef, StringRef> 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<char *>(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<char *>(Allocate(Name.size()));
|
||||
memcpy(Buf, Name.data(), Name.size());
|
||||
File = new (*this) MCDwarfFile(StringRef(Buf, Name.size()), DirIndex);
|
||||
|
||||
// return the allocated FileNumber.
|
||||
return FileNumber;
|
||||
|
Loading…
Reference in New Issue
Block a user