[llvm-commits] CVS: llvm/tools/llvm-ld/llvm-ld.cpp

Chris Lattner sabre at nondot.org
Tue Jun 19 09:47:10 PDT 2007



Changes in directory llvm/tools/llvm-ld:

llvm-ld.cpp updated: 1.53 -> 1.54
---
Log message:

Fix pr1448: http://llvm.org/PR1448 


---
Diffs of the changes:  (+20 -14)

 llvm-ld.cpp |   34 ++++++++++++++++++++--------------
 1 files changed, 20 insertions(+), 14 deletions(-)


Index: llvm/tools/llvm-ld/llvm-ld.cpp
diff -u llvm/tools/llvm-ld/llvm-ld.cpp:1.53 llvm/tools/llvm-ld/llvm-ld.cpp:1.54
--- llvm/tools/llvm-ld/llvm-ld.cpp:1.53	Sun May  6 04:29:57 2007
+++ llvm/tools/llvm-ld/llvm-ld.cpp	Tue Jun 19 11:46:48 2007
@@ -326,46 +326,52 @@
   //  We can't just assemble and link the file with the system assembler
   //  and linker because we don't know where to put the _start symbol.
   //  GCC mysteriously knows how to do it.
-  std::vector<const char*> args;
+  std::vector<std::string> args;
   args.push_back(gcc.c_str());
   args.push_back("-fno-strict-aliasing");
   args.push_back("-O3");
   args.push_back("-o");
-  args.push_back(OutputFilename.c_str());
-  args.push_back(InputFilename.c_str());
+  args.push_back(OutputFilename);
+  args.push_back(InputFilename);
 
   // Add in the library paths
   for (unsigned index = 0; index < LibPaths.size(); index++) {
     args.push_back("-L");
-    args.push_back(LibPaths[index].c_str());
+    args.push_back(LibPaths[index]);
   }
 
   // Add the requested options
   for (unsigned index = 0; index < XLinker.size(); index++) {
-    args.push_back(XLinker[index].c_str());
-    args.push_back(Libraries[index].c_str());
+    args.push_back(XLinker[index]);
+    args.push_back(Libraries[index]);
   }
 
   // Add in the libraries to link.
   for (unsigned index = 0; index < LinkItems.size(); index++)
     if (LinkItems[index].first != "crtend") {
-      if (LinkItems[index].second) {
-        std::string lib_name = "-l" + LinkItems[index].first;
-        args.push_back(lib_name.c_str());
-      } else
-        args.push_back(LinkItems[index].first.c_str());
+      if (LinkItems[index].second)
+        args.push_back("-l" + LinkItems[index].first);
+      else
+        args.push_back(LinkItems[index].first);
     }
 
-  args.push_back(0);
+      
+  // Now that "args" owns all the std::strings for the arguments, call the c_str
+  // method to get the underlying string array.  We do this game so that the
+  // std::string array is guaranteed to outlive the const char* array.
+  std::vector<const char *> Args;
+  for (unsigned i = 0, e = args.size(); i != e; ++i)
+    Args.push_back(args[i].c_str());
+  Args.push_back(0);
 
   if (Verbose) {
     cout << "Generating Native Executable With:\n";
-    PrintCommand(args);
+    PrintCommand(Args);
   }
 
   // Run the compiler to assembly and link together the program.
   int R = sys::Program::ExecuteAndWait(
-    gcc, &args[0], (const char**)clean_env, 0, 0, 0, &ErrMsg);
+    gcc, &Args[0], (const char**)clean_env, 0, 0, 0, &ErrMsg);
   delete [] clean_env;
   return R;
 }






More information about the llvm-commits mailing list