[PATCH] D11098: Re-use a single SmallString instance to reduce the stack frame size

Daniel Jasper djasper at google.com
Fri Jul 10 00:38:46 PDT 2015


djasper created this revision.
djasper added a reviewer: klimek.
djasper added a subscriber: cfe-commits.

In certain builds (msan), this can otherwise exceed the stack frame limit set for certain environments.

http://reviews.llvm.org/D11098

Files:
  lib/Driver/Tools.cpp

Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -3547,14 +3547,15 @@
         << ProfileGenerateArg->getSpelling()
         << ProfileUseArg->getSpelling();
 
+  SmallString<128> Path;
   if (ProfileGenerateArg &&
       ProfileGenerateArg->getOption().matches(
           options::OPT_fprofile_instr_generate_EQ))
     ProfileGenerateArg->render(Args, CmdArgs);
   else if (ProfileGenerateArg &&
            ProfileGenerateArg->getOption().matches(
                options::OPT_fprofile_generate_EQ)) {
-    SmallString<128> Path(ProfileGenerateArg->getValue());
+    Path = ProfileGenerateArg->getValue();
     llvm::sys::path::append(Path, "default.profraw");
     CmdArgs.push_back(
         Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
@@ -3568,8 +3569,7 @@
            (ProfileUseArg->getOption().matches(options::OPT_fprofile_use_EQ) ||
             ProfileUseArg->getOption().matches(
                 options::OPT_fprofile_instr_use))) {
-    SmallString<128> Path(
-        ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
+    Path = ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue();
     if (Path.empty() || llvm::sys::fs::is_directory(Path))
       llvm::sys::path::append(Path, "default.profdata");
     CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
@@ -3602,10 +3602,9 @@
         CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
       }
       if (llvm::sys::path::is_relative(CoverageFilename)) {
-        SmallString<128> Pwd;
-        if (!llvm::sys::fs::current_path(Pwd)) {
-          llvm::sys::path::append(Pwd, CoverageFilename);
-          CoverageFilename.swap(Pwd);
+        if (!llvm::sys::fs::current_path(Path)) {
+          llvm::sys::path::append(Path, CoverageFilename);
+          CoverageFilename.swap(Path);
         }
       }
       CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
@@ -4196,27 +4195,27 @@
 
   // -fmodule-cache-path specifies where our implicitly-built module files
   // should be written.
-  SmallString<128> ModuleCachePath;
+  Path = "";
   if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
-    ModuleCachePath = A->getValue();
+    Path = A->getValue();
   if (HaveModules) {
     if (C.isForDiagnostics()) {
       // When generating crash reports, we want to emit the modules along with
       // the reproduction sources, so we ignore any provided module path.
-      ModuleCachePath = Output.getFilename();
-      llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
-      llvm::sys::path::append(ModuleCachePath, "modules");
-    } else if (ModuleCachePath.empty()) {
+      Path = Output.getFilename();
+      llvm::sys::path::replace_extension(Path, ".cache");
+      llvm::sys::path::append(Path, "modules");
+    } else if (Path.empty()) {
       // No module path was provided: use the default.
       llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
-                                             ModuleCachePath);
-      llvm::sys::path::append(ModuleCachePath, "org.llvm.clang.");
-      appendUserToPath(ModuleCachePath);
-      llvm::sys::path::append(ModuleCachePath, "ModuleCache");
+                                             Path);
+      llvm::sys::path::append(Path, "org.llvm.clang.");
+      appendUserToPath(Path);
+      llvm::sys::path::append(Path, "ModuleCache");
     }
     const char Arg[] = "-fmodules-cache-path=";
-    ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
-    CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
+    Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
+    CmdArgs.push_back(Args.MakeArgString(Path));
   }
 
   // When building modules and generating crashdumps, we need to dump a module


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11098.29431.patch
Type: text/x-patch
Size: 3904 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150710/5e585ded/attachment.bin>


More information about the cfe-commits mailing list