summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-04-06 16:43:13 +0000
committerChris Lattner <sabre@nondot.org>2004-04-06 16:43:13 +0000
commit69e8d282bf7b34b3e86c57c8fa17cda9ab8e69aa (patch)
treec2f3f2152616a2667a11802013a0c153dcece10d /tools
parente80e637793d3ff3808e564b304b2831f6c7a1625 (diff)
downloadllvm-69e8d282bf7b34b3e86c57c8fa17cda9ab8e69aa.tar.gz
llvm-69e8d282bf7b34b3e86c57c8fa17cda9ab8e69aa.tar.bz2
llvm-69e8d282bf7b34b3e86c57c8fa17cda9ab8e69aa.tar.xz
Add a new gccld -native-cbe option which causes gccld to generate native code
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
Diffstat (limited to 'tools')
-rw-r--r--tools/gccld/GenerateCode.cpp19
-rw-r--r--tools/gccld/gccld.cpp27
-rw-r--r--tools/gccld/gccld.h3
3 files changed, 48 insertions, 1 deletions
diff --git a/tools/gccld/GenerateCode.cpp b/tools/gccld/GenerateCode.cpp
index d2c0f3dd31..dad1bc2442 100644
--- a/tools/gccld/GenerateCode.cpp
+++ b/tools/gccld/GenerateCode.cpp
@@ -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());
diff --git a/tools/gccld/gccld.cpp b/tools/gccld/gccld.cpp
index 0f5bc18a31..389a6b13da 100644
--- a/tools/gccld/gccld.cpp
+++ b/tools/gccld/gccld.cpp
@@ -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());
diff --git a/tools/gccld/gccld.h b/tools/gccld/gccld.h
index e5b865e3a4..8913d379fb 100644
--- a/tools/gccld/gccld.h
+++ b/tools/gccld/gccld.h
@@ -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,