Stop leaking std::strings in GetDwarfFile.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 29 Jul 2010 13:53:19 +0000 (13:53 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 29 Jul 2010 13:53:19 +0000 (13:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109746 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCContext.h
include/llvm/MC/MCDwarf.h
lib/MC/MCContext.cpp

index 86f83ad240f8d2c12aee0ad105380e2504709a07..8b30bfcd374ee7a8826cd4f76eb3ded6757f9901 100644 (file)
@@ -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.
     ///
index 4ba401a49aef2c5b3f996db3be9d3f69e392f5fd..619351400d3e8f42141f30cc6d0016f79250a21d 100644 (file)
@@ -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;
index 7470e8d0031c39e9c478441aaf55492ca849d13c..5812622bb0a2cae84dbf69a21eca163323cdc0bd 100644 (file)
@@ -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;