diff --git a/tools/gccld/GenerateCode.cpp b/tools/gccld/GenerateCode.cpp index fa054e79b70..1f1a261248f 100644 --- a/tools/gccld/GenerateCode.cpp +++ b/tools/gccld/GenerateCode.cpp @@ -120,6 +120,13 @@ static void RemoveEnv(const char * name, char ** const envp) { return; } +static void dumpArgs(const char **args) { + std::cout << *args++; + while (*args) + std::cout << ' ' << *args++; + std::cout << '\n'; +} + static inline void addPass(PassManager &PM, Pass *P) { // Add the pass to the pass manager... PM.add(P); @@ -297,7 +304,8 @@ int llvm::GenerateBytecode(Module *M, int StripLevel, bool Internalize, /// int llvm::GenerateAssembly(const std::string &OutputFilename, const std::string &InputFilename, - const sys::Path &llc) { + const sys::Path &llc, + bool Verbose) { // Run LLC to convert the bytecode file into assembly code. std::vector args; args.push_back(llc.c_str()); @@ -306,7 +314,7 @@ int llvm::GenerateAssembly(const std::string &OutputFilename, args.push_back(OutputFilename.c_str()); args.push_back(InputFilename.c_str()); args.push_back(0); - + if (Verbose) dumpArgs(&args[0]); return sys::Program::ExecuteAndWait(llc, &args[0]); } @@ -314,7 +322,8 @@ int llvm::GenerateAssembly(const std::string &OutputFilename, /// specified bytecode file. int llvm::GenerateCFile(const std::string &OutputFile, const std::string &InputFile, - const sys::Path &llc) { + const sys::Path &llc, + bool Verbose) { // Run LLC to convert the bytecode file into C. std::vector args; args.push_back(llc.c_str()); @@ -324,6 +333,7 @@ int llvm::GenerateCFile(const std::string &OutputFile, args.push_back(OutputFile.c_str()); args.push_back(InputFile.c_str()); args.push_back(0); + if (Verbose) dumpArgs(&args[0]); return sys::Program::ExecuteAndWait(llc, &args[0]); } @@ -349,7 +359,8 @@ int llvm::GenerateNative(const std::string &OutputFilename, const sys::Path &gcc, char ** const envp, bool Shared, const std::string &RPath, - const std::string &SOName) { + const std::string &SOName, + bool Verbose) { // Remove these environment variables from the environment of the // programs that we will execute. It appears that GCC sets these // environment variables so that the programs it uses can configure @@ -417,6 +428,7 @@ int llvm::GenerateNative(const std::string &OutputFilename, args.push_back(0); // 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); } diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp index 8698cc88991..98e7dea3258 100644 --- a/tools/gccld/gccld.cpp +++ b/tools/gccld/gccld.cpp @@ -83,6 +83,10 @@ namespace { cl::opt NativeCBE("native-cbe", cl::desc("Generate a native binary with the C backend and GCC")); + + cl::opt + SaveTemps("save-temps", + cl::desc("Do not delete temporary files")); cl::opt RPath("rpath", @@ -300,16 +304,19 @@ int main(int argc, char **argv, char **envp ) { // Generate an assembly language file for the bytecode. if (Verbose) std::cout << "Generating Assembly Code\n"; - GenerateAssembly(AssemblyFile.toString(), RealBytecodeOutput, llc); + GenerateAssembly(AssemblyFile.toString(), RealBytecodeOutput, llc, + Verbose); if (Verbose) std::cout << "Generating Native Code\n"; GenerateNative(OutputFilename, AssemblyFile.toString(), LibPaths, Libraries, gcc, envp, LinkAsLibrary, RPath, - SOName ); + SOName, Verbose); - // Remove the assembly language file. - AssemblyFile.destroyFile(); - // Remove the bytecode language file. - sys::Path(RealBytecodeOutput).destroyFile(); + if (!SaveTemps) { + // Remove the assembly language file. + AssemblyFile.destroyFile(); + // Remove the bytecode language file. + sys::Path(RealBytecodeOutput).destroyFile(); + } } else if (NativeCBE) { sys::Path CFile (OutputFilename); @@ -329,18 +336,19 @@ int main(int argc, char **argv, char **envp ) { return PrintAndReturn(argv[0], "Failed to find gcc"); // Generate an assembly language file for the bytecode. - if (Verbose) std::cout << "Generating Assembly Code\n"; - GenerateCFile(CFile.toString(), RealBytecodeOutput, llc); + if (Verbose) std::cout << "Generating C Source Code\n"; + GenerateCFile(CFile.toString(), RealBytecodeOutput, llc, Verbose); if (Verbose) std::cout << "Generating Native Code\n"; GenerateNative(OutputFilename, CFile.toString(), LibPaths, Libraries, gcc, envp, LinkAsLibrary, RPath, - SOName ); + SOName, Verbose); - // Remove the assembly language file. - CFile.destroyFile(); - - // Remove the bytecode language file. - sys::Path(RealBytecodeOutput).destroyFile(); + if (!SaveTemps) { + // Remove the assembly language file. + CFile.destroyFile(); + // Remove the bytecode language file. + sys::Path(RealBytecodeOutput).destroyFile(); + } } else if (!LinkAsLibrary) { EmitShellScript(argv); diff --git a/tools/gccld/gccld.h b/tools/gccld/gccld.h index ea9a8ee3a1d..85dfb2d5c5c 100644 --- a/tools/gccld/gccld.h +++ b/tools/gccld/gccld.h @@ -29,12 +29,14 @@ GenerateBytecode (Module * M, int GenerateAssembly (const std::string & OutputFilename, const std::string & InputFilename, - const sys::Path & llc); + const sys::Path & llc, + bool Verbose=false); int GenerateCFile (const std::string &OutputFile, const std::string &InputFile, - const sys::Path &llc); + const sys::Path &llc, + bool Verbose=false); int GenerateNative (const std::string & OutputFilename, const std::string & InputFilename, @@ -44,6 +46,7 @@ GenerateNative (const std::string & OutputFilename, char ** const envp, bool Shared, const std::string & RPath, - const std::string & SOName); + const std::string & SOName, + bool Verbose=false); } // End llvm namespace