[llvm] r215790 - Revert "[Support] Promote cl::StringSaver to a separate utility"

Sean Silva chisophugis at gmail.com
Fri Aug 15 16:39:03 PDT 2014


Author: silvas
Date: Fri Aug 15 18:39:01 2014
New Revision: 215790

URL: http://llvm.org/viewvc/llvm-project?rev=215790&view=rev
Log:
Revert "[Support] Promote cl::StringSaver to a separate utility"

This reverts commit r215784 / 3f8a26f6fe16cc76c98ab21db2c600bd7defbbaa.

LLD has 3 StringSaver's, one of which takes a lock when saving the
string... Need to investigate more closely.

Removed:
    llvm/trunk/include/llvm/Support/StringSaver.h
Modified:
    llvm/trunk/include/llvm/Support/CommandLine.h
    llvm/trunk/lib/Support/CommandLine.cpp
    llvm/trunk/unittests/Support/CommandLineTest.cpp

Modified: llvm/trunk/include/llvm/Support/CommandLine.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CommandLine.h?rev=215790&r1=215789&r2=215790&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/CommandLine.h (original)
+++ llvm/trunk/include/llvm/Support/CommandLine.h Fri Aug 15 18:39:01 2014
@@ -24,7 +24,6 @@
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/Compiler.h"
-#include "llvm/Support/StringSaver.h"
 #include <cassert>
 #include <climits>
 #include <cstdarg>
@@ -1773,6 +1772,15 @@ void getRegisteredOptions(StringMap<Opti
 // Standalone command line processing utilities.
 //
 
+/// \brief Saves strings in the inheritor's stable storage and returns a stable
+/// raw character pointer.
+class StringSaver {
+  virtual void anchor();
+public:
+  virtual const char *SaveString(const char *Str) = 0;
+  virtual ~StringSaver() {};  // Pacify -Wnon-virtual-dtor.
+};
+
 /// \brief Tokenizes a command line that can contain escapes and quotes.
 //
 /// The quoting rules match those used by GCC and other tools that use

Removed: llvm/trunk/include/llvm/Support/StringSaver.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/StringSaver.h?rev=215789&view=auto
==============================================================================
--- llvm/trunk/include/llvm/Support/StringSaver.h (original)
+++ llvm/trunk/include/llvm/Support/StringSaver.h (removed)
@@ -1,33 +0,0 @@
-//===- llvm/Support/StringSaver.h - Stable storage for strings --*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_SUPPORT_STRINGSAVER_H
-#define LLVM_SUPPORT_STRINGSAVER_H
-
-#include "llvm/Support/Allocator.h"
-#include <cstring>
-
-namespace llvm {
-
-/// \brief Saves strings in stable storage that it owns.
-class StringSaver {
-  BumpPtrAllocator Alloc;
-
-public:
-  const char *saveCStr(const char *CStr) {
-    auto Len = std::strlen(CStr) + 1; // Don't forget the NUL!
-    char *Buf = Alloc.Allocate<char>(Len);
-    std::memcpy(Buf, CStr, Len);
-    return Buf;
-  }
-};
-
-} // end namespace llvm
-
-#endif

Modified: llvm/trunk/lib/Support/CommandLine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/CommandLine.cpp?rev=215790&r1=215789&r2=215790&view=diff
==============================================================================
--- llvm/trunk/lib/Support/CommandLine.cpp (original)
+++ llvm/trunk/lib/Support/CommandLine.cpp Fri Aug 15 18:39:01 2014
@@ -76,6 +76,7 @@ void parser<double>::anchor() {}
 void parser<float>::anchor() {}
 void parser<std::string>::anchor() {}
 void parser<char>::anchor() {}
+void StringSaver::anchor() {}
 
 //===----------------------------------------------------------------------===//
 
@@ -508,7 +509,7 @@ void cl::TokenizeGNUCommandLine(StringRe
     // End the token if this is whitespace.
     if (isWhitespace(Src[I])) {
       if (!Token.empty())
-        NewArgv.push_back(Saver.saveCStr(Token.c_str()));
+        NewArgv.push_back(Saver.SaveString(Token.c_str()));
       Token.clear();
       continue;
     }
@@ -519,7 +520,7 @@ void cl::TokenizeGNUCommandLine(StringRe
 
   // Append the last token after hitting EOF with no whitespace.
   if (!Token.empty())
-    NewArgv.push_back(Saver.saveCStr(Token.c_str()));
+    NewArgv.push_back(Saver.SaveString(Token.c_str()));
 }
 
 /// Backslashes are interpreted in a rather complicated way in the Windows-style
@@ -592,7 +593,7 @@ void cl::TokenizeWindowsCommandLine(Stri
     if (State == UNQUOTED) {
       // Whitespace means the end of the token.
       if (isWhitespace(Src[I])) {
-        NewArgv.push_back(Saver.saveCStr(Token.c_str()));
+        NewArgv.push_back(Saver.SaveString(Token.c_str()));
         Token.clear();
         State = INIT;
         continue;
@@ -624,7 +625,7 @@ void cl::TokenizeWindowsCommandLine(Stri
   }
   // Append the last token after hitting EOF with no whitespace.
   if (!Token.empty())
-    NewArgv.push_back(Saver.saveCStr(Token.c_str()));
+    NewArgv.push_back(Saver.SaveString(Token.c_str()));
 }
 
 static bool ExpandResponseFile(const char *FName, StringSaver &Saver,
@@ -690,6 +691,25 @@ bool cl::ExpandResponseFiles(StringSaver
   return AllExpanded;
 }
 
+namespace {
+  class StrDupSaver : public StringSaver {
+    std::vector<char*> Dups;
+  public:
+    ~StrDupSaver() {
+      for (std::vector<char *>::iterator I = Dups.begin(), E = Dups.end();
+           I != E; ++I) {
+        char *Dup = *I;
+        free(Dup);
+      }
+    }
+    const char *SaveString(const char *Str) override {
+      char *Dup = strdup(Str);
+      Dups.push_back(Dup);
+      return Dup;
+    }
+  };
+}
+
 /// ParseEnvironmentOptions - An alternative entry point to the
 /// CommandLine library, which allows you to read the program's name
 /// from the caller (as PROGNAME) and its command-line arguments from
@@ -709,8 +729,8 @@ void cl::ParseEnvironmentOptions(const c
   // Get program's "name", which we wouldn't know without the caller
   // telling us.
   SmallVector<const char *, 20> newArgv;
-  StringSaver Saver;
-  newArgv.push_back(Saver.saveCStr(progName));
+  StrDupSaver Saver;
+  newArgv.push_back(Saver.SaveString(progName));
 
   // Parse the value of the environment variable into a "command line"
   // and hand it off to ParseCommandLineOptions().
@@ -734,7 +754,7 @@ void cl::ParseCommandLineOptions(int arg
   SmallVector<const char *, 20> newArgv;
   for (int i = 0; i != argc; ++i)
     newArgv.push_back(argv[i]);
-  StringSaver Saver;
+  StrDupSaver Saver;
   ExpandResponseFiles(Saver, TokenizeGNUCommandLine, newArgv);
   argv = &newArgv[0];
   argc = static_cast<int>(newArgv.size());

Modified: llvm/trunk/unittests/Support/CommandLineTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CommandLineTest.cpp?rev=215790&r1=215789&r2=215790&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/CommandLineTest.cpp (original)
+++ llvm/trunk/unittests/Support/CommandLineTest.cpp Fri Aug 15 18:39:01 2014
@@ -146,19 +146,26 @@ TEST(CommandLineTest, UseOptionCategory)
                                                   "Category.";
 }
 
-typedef void ParserFunction(StringRef Source, StringSaver &Saver,
+class StrDupSaver : public cl::StringSaver {
+  const char *SaveString(const char *Str) override {
+    return strdup(Str);
+  }
+};
+
+typedef void ParserFunction(StringRef Source, llvm::cl::StringSaver &Saver,
                             SmallVectorImpl<const char *> &NewArgv);
 
 
 void testCommandLineTokenizer(ParserFunction *parse, const char *Input,
                               const char *const Output[], size_t OutputSize) {
   SmallVector<const char *, 0> Actual;
-  StringSaver Saver;
+  StrDupSaver Saver;
   parse(Input, Saver, Actual);
   EXPECT_EQ(OutputSize, Actual.size());
   for (unsigned I = 0, E = Actual.size(); I != E; ++I) {
     if (I < OutputSize)
       EXPECT_STREQ(Output[I], Actual[I]);
+    free(const_cast<char *>(Actual[I]));
   }
 }
 





More information about the llvm-commits mailing list