|
@@ -11,7 +11,7 @@
|
|
|
// system 'ld' conventions. As such, the default output file is ./a.out.
|
|
|
// Additionally, this program outputs a shell script that is used to invoke LLI
|
|
|
// to execute the program. In this manner, the generated executable (a.out for
|
|
|
-// example), is directly executable, whereas the bytecode file actually lives in
|
|
|
+// example), is directly executable, whereas the bitcode file actually lives in
|
|
|
// the a.out.bc file generated by this program. Also, Force is on by default.
|
|
|
//
|
|
|
// Note that if someone (or a script) deletes the executable program generated,
|
|
@@ -42,7 +42,7 @@ using namespace llvm;
|
|
|
|
|
|
// Input/Output Options
|
|
|
static cl::list<std::string> InputFilenames(cl::Positional, cl::OneOrMore,
|
|
|
- cl::desc("<input bytecode files>"));
|
|
|
+ cl::desc("<input bitcode files>"));
|
|
|
|
|
|
static cl::opt<std::string> OutputFilename("o", cl::init("a.out"),
|
|
|
cl::desc("Override output filename"),
|
|
@@ -203,11 +203,11 @@ static void RemoveEnv(const char * name, char ** const envp) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-/// GenerateBytecode - generates a bytecode file from the module provided
|
|
|
-void GenerateBytecode(Module* M, const std::string& FileName) {
|
|
|
+/// GenerateBitcode - generates a bitcode file from the module provided
|
|
|
+void GenerateBitcode(Module* M, const std::string& FileName) {
|
|
|
|
|
|
if (Verbose)
|
|
|
- cout << "Generating Bytecode To " << FileName << '\n';
|
|
|
+ cout << "Generating Bitcode To " << FileName << '\n';
|
|
|
|
|
|
// Create the output file.
|
|
|
std::ios::openmode io_mode = std::ios::out | std::ios::trunc |
|
|
@@ -216,22 +216,22 @@ void GenerateBytecode(Module* M, const std::string& FileName) {
|
|
|
if (!Out.good())
|
|
|
PrintAndExit("error opening '" + FileName + "' for writing!");
|
|
|
|
|
|
- // Ensure that the bytecode file gets removed from the disk if we get a
|
|
|
+ // Ensure that the bitcode file gets removed from the disk if we get a
|
|
|
// terminating signal.
|
|
|
sys::RemoveFileOnSignal(sys::Path(FileName));
|
|
|
|
|
|
// Write it out
|
|
|
WriteBitcodeToFile(M, Out);
|
|
|
|
|
|
- // Close the bytecode file.
|
|
|
+ // Close the bitcode file.
|
|
|
Out.close();
|
|
|
}
|
|
|
|
|
|
/// GenerateAssembly - generates a native assembly language source file from the
|
|
|
-/// specified bytecode file.
|
|
|
+/// specified bitcode file.
|
|
|
///
|
|
|
/// Inputs:
|
|
|
-/// InputFilename - The name of the input bytecode file.
|
|
|
+/// InputFilename - The name of the input bitcode file.
|
|
|
/// OutputFilename - The name of the file to generate.
|
|
|
/// llc - The pathname to use for LLC.
|
|
|
/// envp - The environment to use when running LLC.
|
|
@@ -242,7 +242,7 @@ static int GenerateAssembly(const std::string &OutputFilename,
|
|
|
const std::string &InputFilename,
|
|
|
const sys::Path &llc,
|
|
|
std::string &ErrMsg ) {
|
|
|
- // Run LLC to convert the bytecode file into assembly code.
|
|
|
+ // Run LLC to convert the bitcode file into assembly code.
|
|
|
std::vector<const char*> args;
|
|
|
args.push_back(llc.c_str());
|
|
|
args.push_back("-f");
|
|
@@ -259,12 +259,12 @@ static int GenerateAssembly(const std::string &OutputFilename,
|
|
|
return sys::Program::ExecuteAndWait(llc, &args[0], 0, 0, 0, 0, &ErrMsg);
|
|
|
}
|
|
|
|
|
|
-/// GenerateCFile - generates a C source file from the specified bytecode file.
|
|
|
+/// GenerateCFile - generates a C source file from the specified bitcode file.
|
|
|
static int GenerateCFile(const std::string &OutputFile,
|
|
|
const std::string &InputFile,
|
|
|
const sys::Path &llc,
|
|
|
std::string& ErrMsg) {
|
|
|
- // Run LLC to convert the bytecode file into C.
|
|
|
+ // Run LLC to convert the bitcode file into C.
|
|
|
std::vector<const char*> args;
|
|
|
args.push_back(llc.c_str());
|
|
|
args.push_back("-march=c");
|
|
@@ -283,10 +283,10 @@ static int GenerateCFile(const std::string &OutputFile,
|
|
|
}
|
|
|
|
|
|
/// GenerateNative - generates a native object file from the
|
|
|
-/// specified bytecode file.
|
|
|
+/// specified bitcode file.
|
|
|
///
|
|
|
/// Inputs:
|
|
|
-/// InputFilename - The name of the input bytecode file.
|
|
|
+/// InputFilename - The name of the input bitcode file.
|
|
|
/// OutputFilename - The name of the file to generate.
|
|
|
/// NativeLinkItems - The native libraries, files, code with which to link
|
|
|
/// LibPaths - The list of directories in which to find libraries.
|
|
@@ -377,7 +377,7 @@ static int GenerateNative(const std::string &OutputFilename,
|
|
|
}
|
|
|
|
|
|
/// EmitShellScript - Output the wrapper file that invokes the JIT on the LLVM
|
|
|
-/// bytecode file for the program.
|
|
|
+/// bitcode file for the program.
|
|
|
static void EmitShellScript(char **argv) {
|
|
|
if (Verbose)
|
|
|
cout << "Emitting Shell Script\n";
|
|
@@ -478,7 +478,7 @@ int main(int argc, char **argv, char **envp) {
|
|
|
// Construct a Linker (now that Verbose is set)
|
|
|
Linker TheLinker(progname, OutputFilename, Verbose);
|
|
|
|
|
|
- // Keep track of the native link items (versus the bytecode items)
|
|
|
+ // Keep track of the native link items (versus the bitcode items)
|
|
|
Linker::ItemList NativeLinkItems;
|
|
|
|
|
|
// Add library paths to the linker
|
|
@@ -517,10 +517,10 @@ int main(int argc, char **argv, char **envp) {
|
|
|
// Optimize the module
|
|
|
Optimize(Composite.get());
|
|
|
|
|
|
- // Generate the bytecode for the optimized module.
|
|
|
- std::string RealBytecodeOutput = OutputFilename;
|
|
|
- if (!LinkAsLibrary) RealBytecodeOutput += ".bc";
|
|
|
- GenerateBytecode(Composite.get(), RealBytecodeOutput);
|
|
|
+ // Generate the bitcode for the optimized module.
|
|
|
+ std::string RealBitcodeOutput = OutputFilename;
|
|
|
+ if (!LinkAsLibrary) RealBitcodeOutput += ".bc";
|
|
|
+ GenerateBitcode(Composite.get(), RealBitcodeOutput);
|
|
|
|
|
|
// If we are not linking a library, generate either a native executable
|
|
|
// or a JIT shell script, depending upon what the user wants.
|
|
@@ -545,17 +545,17 @@ int main(int argc, char **argv, char **envp) {
|
|
|
|
|
|
const char* args[4];
|
|
|
args[0] = I->c_str();
|
|
|
- args[1] = RealBytecodeOutput.c_str();
|
|
|
+ args[1] = RealBitcodeOutput.c_str();
|
|
|
args[2] = tmp_output.c_str();
|
|
|
args[3] = 0;
|
|
|
if (0 == sys::Program::ExecuteAndWait(prog, args, 0,0,0,0, &ErrMsg)) {
|
|
|
- if (tmp_output.isBytecodeFile() || tmp_output.isBitcodeFile()) {
|
|
|
- sys::Path target(RealBytecodeOutput);
|
|
|
+ if (tmp_output.isBitcodeFile() || tmp_output.isBitcodeFile()) {
|
|
|
+ sys::Path target(RealBitcodeOutput);
|
|
|
target.eraseFromDisk();
|
|
|
if (tmp_output.renamePathOnDisk(target, &ErrMsg))
|
|
|
PrintAndExit(ErrMsg, 2);
|
|
|
} else
|
|
|
- PrintAndExit("Post-link optimization output is not bytecode");
|
|
|
+ PrintAndExit("Post-link optimization output is not bitcode");
|
|
|
} else {
|
|
|
PrintAndExit(ErrMsg);
|
|
|
}
|
|
@@ -563,9 +563,9 @@ int main(int argc, char **argv, char **envp) {
|
|
|
}
|
|
|
|
|
|
// If the user wants to generate a native executable, compile it from the
|
|
|
- // bytecode file.
|
|
|
+ // bitcode file.
|
|
|
//
|
|
|
- // Otherwise, create a script that will run the bytecode through the JIT.
|
|
|
+ // Otherwise, create a script that will run the bitcode through the JIT.
|
|
|
if (Native) {
|
|
|
// Name of the Assembly Language output file
|
|
|
sys::Path AssemblyFile ( OutputFilename);
|
|
@@ -584,9 +584,9 @@ int main(int argc, char **argv, char **envp) {
|
|
|
if (gcc.isEmpty())
|
|
|
PrintAndExit("Failed to find gcc");
|
|
|
|
|
|
- // Generate an assembly language file for the bytecode.
|
|
|
+ // Generate an assembly language file for the bitcode.
|
|
|
std::string ErrMsg;
|
|
|
- if (0 != GenerateAssembly(AssemblyFile.toString(), RealBytecodeOutput,
|
|
|
+ if (0 != GenerateAssembly(AssemblyFile.toString(), RealBitcodeOutput,
|
|
|
llc, ErrMsg))
|
|
|
PrintAndExit(ErrMsg);
|
|
|
|
|
@@ -613,10 +613,10 @@ int main(int argc, char **argv, char **envp) {
|
|
|
if (gcc.isEmpty())
|
|
|
PrintAndExit("Failed to find gcc");
|
|
|
|
|
|
- // Generate an assembly language file for the bytecode.
|
|
|
+ // Generate an assembly language file for the bitcode.
|
|
|
std::string ErrMsg;
|
|
|
if (0 != GenerateCFile(
|
|
|
- CFile.toString(), RealBytecodeOutput, llc, ErrMsg))
|
|
|
+ CFile.toString(), RealBitcodeOutput, llc, ErrMsg))
|
|
|
PrintAndExit(ErrMsg);
|
|
|
|
|
|
if (0 != GenerateNative(OutputFilename, CFile.toString(),
|
|
@@ -635,11 +635,11 @@ int main(int argc, char **argv, char **envp) {
|
|
|
if (sys::Path(OutputFilename).makeExecutableOnDisk(&ErrMsg))
|
|
|
PrintAndExit(ErrMsg);
|
|
|
|
|
|
- // Make the bytecode file readable and directly executable in LLEE as well
|
|
|
- if (sys::Path(RealBytecodeOutput).makeExecutableOnDisk(&ErrMsg))
|
|
|
+ // Make the bitcode file readable and directly executable in LLEE as well
|
|
|
+ if (sys::Path(RealBitcodeOutput).makeExecutableOnDisk(&ErrMsg))
|
|
|
PrintAndExit(ErrMsg);
|
|
|
|
|
|
- if (sys::Path(RealBytecodeOutput).makeReadableOnDisk(&ErrMsg))
|
|
|
+ if (sys::Path(RealBitcodeOutput).makeReadableOnDisk(&ErrMsg))
|
|
|
PrintAndExit(ErrMsg);
|
|
|
}
|
|
|
} catch (const std::string& msg) {
|