Add a new gccld -native-cbe option which causes gccld to generate native code
authorChris Lattner <sabre@nondot.org>
Tue, 6 Apr 2004 16:43:13 +0000 (16:43 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 6 Apr 2004 16:43:13 +0000 (16:43 +0000)
for the application with the C backend instead of the native LLVM code generator

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12698 91177308-0d34-0410-b5e6-96231b3b80d8

tools/gccld/GenerateCode.cpp
tools/gccld/gccld.cpp
tools/gccld/gccld.h

index d2c0f3dd31ad8f3808c7c2106580002b91c54f85..dad1bc2442f2cb6153be694966afb3332e859d17 100644 (file)
@@ -25,7 +25,6 @@
 #include "llvm/Transforms/Utils/Linker.h"
 #include "Support/SystemUtils.h"
 #include "Support/CommandLine.h"
-
 using namespace llvm;
 
 namespace {
@@ -182,6 +181,23 @@ GenerateAssembly(const std::string &OutputFilename,
   return ExecWait(cmd, envp);
 }
 
+/// GenerateAssembly - generates a native assembly language source file from the
+/// specified bytecode file.
+int GenerateCFile(const std::string &OutputFile, const std::string &InputFile,
+                  const std::string &llc, char ** const envp) {
+  // Run LLC to convert the bytecode file into C.
+  const char *cmd[8];
+
+  cmd[0] = llc.c_str();
+  cmd[1] = "-march=c";
+  cmd[2] = "-f";
+  cmd[3] = "-o";
+  cmd[4] = OutputFile.c_str();
+  cmd[5] = InputFile.c_str();
+  cmd[6] = NULL;
+  return ExecWait(cmd, envp);
+}
+
 /// GenerateNative - generates a native assembly language source file from the
 /// specified assembly source file.
 ///
@@ -230,6 +246,7 @@ GenerateNative(const std::string &OutputFilename,
   //  and linker because we don't know where to put the _start symbol.
   //  GCC mysteriously knows how to do it.
   cmd.push_back(gcc.c_str());
+  cmd.push_back("-O3");
   cmd.push_back("-o");
   cmd.push_back(OutputFilename.c_str());
   cmd.push_back(InputFilename.c_str());
index 0f5bc18a31fbf4a8635dc4d5e8ce6c5c6dee211d..389a6b13da4161058034d7589e4ba4a55b894ab9 100644 (file)
@@ -78,6 +78,9 @@ namespace {
   cl::opt<bool>    
   Native("native",
          cl::desc("Generate a native binary instead of a shell script"));
+  cl::opt<bool>    
+  NativeCBE("native-cbe",
+            cl::desc("Generate a native binary with the C backend and GCC"));
   
   // Compatibility options that are ignored but supported by LD
   cl::opt<std::string>
@@ -276,6 +279,30 @@ int main(int argc, char **argv, char **envp) {
 
       // Remove the assembly language file.
       removeFile (AssemblyFile);
+    } else if (NativeCBE) {
+      std::string CFile = OutputFilename + ".cbe.c";
+
+      // Mark the output files for removal if we get an interrupt.
+      RemoveFileOnSignal(CFile);
+      RemoveFileOnSignal(OutputFilename);
+
+      // Determine the locations of the llc and gcc programs.
+      std::string llc = FindExecutable("llc", argv[0]);
+      std::string gcc = FindExecutable("gcc", argv[0]);
+      if (llc.empty())
+        return PrintAndReturn(argv[0], "Failed to find llc");
+      if (gcc.empty())
+        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, RealBytecodeOutput, llc, envp);
+      if (Verbose) std::cout << "Generating Native Code\n";
+      GenerateNative(OutputFilename, CFile, Libraries, LibPaths, gcc, envp);
+
+      // Remove the assembly language file.
+      removeFile(CFile);
+
     } else {
       // Output the script to start the program...
       std::ofstream Out2(OutputFilename.c_str());
index e5b865e3a4fe43e03d77e6f937bac5c223664d97..8913d379fb9b3add504971500895ee07780e9614 100644 (file)
@@ -47,6 +47,9 @@ GenerateAssembly (const std::string & OutputFilename,
                   const std::string & InputFilename,
                   const std::string & llc,
                   char ** const envp);
+
+int GenerateCFile(const std::string &OutputFile, const std::string &InputFile,
+                  const std::string &llc, char ** const envp);
 int
 GenerateNative (const std::string & OutputFilename,
                 const std::string & InputFilename,