aboutsummaryrefslogtreecommitdiff
path: root/tools/gccld/gccld.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gccld/gccld.cpp')
-rw-r--r--tools/gccld/gccld.cpp27
1 files changed, 27 insertions, 0 deletions
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());