forked from OSchip/llvm-project
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 llvm-svn: 12698
This commit is contained in:
parent
f2ee88eb5a
commit
ad733e733e
|
@ -25,7 +25,6 @@
|
||||||
#include "llvm/Transforms/Utils/Linker.h"
|
#include "llvm/Transforms/Utils/Linker.h"
|
||||||
#include "Support/SystemUtils.h"
|
#include "Support/SystemUtils.h"
|
||||||
#include "Support/CommandLine.h"
|
#include "Support/CommandLine.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -182,6 +181,23 @@ GenerateAssembly(const std::string &OutputFilename,
|
||||||
return ExecWait(cmd, envp);
|
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
|
/// GenerateNative - generates a native assembly language source file from the
|
||||||
/// specified assembly source file.
|
/// 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.
|
// and linker because we don't know where to put the _start symbol.
|
||||||
// GCC mysteriously knows how to do it.
|
// GCC mysteriously knows how to do it.
|
||||||
cmd.push_back(gcc.c_str());
|
cmd.push_back(gcc.c_str());
|
||||||
|
cmd.push_back("-O3");
|
||||||
cmd.push_back("-o");
|
cmd.push_back("-o");
|
||||||
cmd.push_back(OutputFilename.c_str());
|
cmd.push_back(OutputFilename.c_str());
|
||||||
cmd.push_back(InputFilename.c_str());
|
cmd.push_back(InputFilename.c_str());
|
||||||
|
|
|
@ -78,6 +78,9 @@ namespace {
|
||||||
cl::opt<bool>
|
cl::opt<bool>
|
||||||
Native("native",
|
Native("native",
|
||||||
cl::desc("Generate a native binary instead of a shell script"));
|
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
|
// Compatibility options that are ignored but supported by LD
|
||||||
cl::opt<std::string>
|
cl::opt<std::string>
|
||||||
|
@ -276,6 +279,30 @@ int main(int argc, char **argv, char **envp) {
|
||||||
|
|
||||||
// Remove the assembly language file.
|
// Remove the assembly language file.
|
||||||
removeFile (AssemblyFile);
|
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 {
|
} else {
|
||||||
// Output the script to start the program...
|
// Output the script to start the program...
|
||||||
std::ofstream Out2(OutputFilename.c_str());
|
std::ofstream Out2(OutputFilename.c_str());
|
||||||
|
|
|
@ -47,6 +47,9 @@ GenerateAssembly (const std::string & OutputFilename,
|
||||||
const std::string & InputFilename,
|
const std::string & InputFilename,
|
||||||
const std::string & llc,
|
const std::string & llc,
|
||||||
char ** const envp);
|
char ** const envp);
|
||||||
|
|
||||||
|
int GenerateCFile(const std::string &OutputFile, const std::string &InputFile,
|
||||||
|
const std::string &llc, char ** const envp);
|
||||||
int
|
int
|
||||||
GenerateNative (const std::string & OutputFilename,
|
GenerateNative (const std::string & OutputFilename,
|
||||||
const std::string & InputFilename,
|
const std::string & InputFilename,
|
||||||
|
|
Loading…
Reference in New Issue