aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-09-23 06:05:46 +0000
committerChris Lattner <sabre@nondot.org>2005-09-23 06:05:46 +0000
commitf39421302171a9d3aef26bb42de2d46b7325cf9e (patch)
treea45762cac415924c3a830d9f7827a98de20bbd13 /tools
parent5ae7911b2437aec6f695d6820284ff7bc60ec97a (diff)
1. Do not use .c_str() to keep a persistent handle on a temporary string.
2. Concatenate -lfoo and -L/bar options into a single option instead of passing "-L /bar" (for example) which doesn't work on Darwin. 3. Send -v output to stderr instead of stdout git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23404 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/gccld/GenerateCode.cpp55
1 files changed, 32 insertions, 23 deletions
diff --git a/tools/gccld/GenerateCode.cpp b/tools/gccld/GenerateCode.cpp
index fa4a8fd390..432fa9d7cf 100644
--- a/tools/gccld/GenerateCode.cpp
+++ b/tools/gccld/GenerateCode.cpp
@@ -116,15 +116,13 @@ static void RemoveEnv(const char * name, char ** const envp) {
else
*p = '=';
}
-
- return;
}
static void dumpArgs(const char **args) {
- std::cout << *args++;
+ std::cerr << *args++;
while (*args)
- std::cout << ' ' << *args++;
- std::cout << '\n';
+ std::cerr << ' ' << *args++;
+ std::cerr << '\n' << std::flush;
}
static inline void addPass(PassManager &PM, Pass *P) {
@@ -159,13 +157,10 @@ static bool isBytecodeLPath(const std::string &LibPath) {
return isBytecodeLPath;
// Make sure its a directory
- try
- {
+ try {
if (!LPath.isDirectory())
return isBytecodeLPath;
- }
- catch (std::string& xcptn)
- {
+ } catch (std::string& xcptn) {
return isBytecodeLPath;
}
@@ -399,15 +394,23 @@ int llvm::GenerateNative(const std::string &OutputFilename,
args.push_back(OutputFilename.c_str());
args.push_back(InputFilename.c_str());
+ // StringsToDelete - We don't want to call c_str() on temporary strings.
+ // If we need a temporary string, copy it here so that the memory is not
+ // reclaimed until after the exec call. All of these strings are allocated
+ // with strdup.
+ std::vector<char*> StringsToDelete;
+
if (Shared) args.push_back("-shared");
if (ExportAllAsDynamic) args.push_back("-export-dynamic");
if (!RPath.empty()) {
std::string rp = "-Wl,-rpath," + RPath;
- args.push_back(rp.c_str());
+ StringsToDelete.push_back(strdup(rp.c_str()));
+ args.push_back(StringsToDelete.back());
}
if (!SOName.empty()) {
std::string so = "-Wl,-soname," + SOName;
- args.push_back(so.c_str());
+ StringsToDelete.push_back(strdup(so.c_str()));
+ args.push_back(StringsToDelete.back());
}
// Add in the libpaths to find the libraries.
@@ -419,24 +422,30 @@ int llvm::GenerateNative(const std::string &OutputFilename,
// Further, we don't want any -L paths that contain bytecode shared
// libraries or true bytecode archive files. We omit them in all such
// cases.
- for (unsigned index = 0; index < LibPaths.size(); index++) {
- if (!isBytecodeLPath( LibPaths[index]) ) {
- args.push_back("-L");
- args.push_back(LibPaths[index].c_str());
+ for (unsigned index = 0; index < LibPaths.size(); index++)
+ if (!isBytecodeLPath(LibPaths[index])) {
+ std::string Tmp = "-L"+LibPaths[index];
+ StringsToDelete.push_back(strdup(Tmp.c_str()));
+ args.push_back(StringsToDelete.back());
}
- }
// Add in the libraries to link.
- for (unsigned index = 0; index < Libraries.size(); index++) {
+ for (unsigned index = 0; index < Libraries.size(); index++)
if (Libraries[index] != "crtend") {
- args.push_back("-l");
- args.push_back(Libraries[index].c_str());
+ std::string Tmp = "-l"+Libraries[index];
+ StringsToDelete.push_back(strdup(Tmp.c_str()));
+ args.push_back(StringsToDelete.back());
}
- }
- args.push_back(0);
+ args.push_back(0); // Null terminate.
// Run the compiler to assembly and link together the program.
if (Verbose) dumpArgs(&args[0]);
- return sys::Program::ExecuteAndWait(gcc, &args[0], (const char**)clean_env);
+ int Res = sys::Program::ExecuteAndWait(gcc, &args[0], (const char**)clean_env);
+
+ while (!StringsToDelete.empty()) {
+ free(StringsToDelete.back());
+ StringsToDelete.pop_back();
+ }
+ return Res;
}