mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 15:10:33 +00:00
The JIT now passes the environment pointer to the main() function when it
starts a program. This allows the GNU env program to compile and JIT under LLVM. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8022 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7d8fab9eca
commit
69582b35b6
@ -41,10 +41,12 @@ public:
|
||||
Module &getModule() const { return CurMod; }
|
||||
const TargetData &getTargetData() const { return *TD; }
|
||||
|
||||
/// run - Start execution with the specified function and arguments.
|
||||
/// run - Start execution with the specified function, arguments, and
|
||||
/// environment.
|
||||
///
|
||||
virtual int run(const std::string &FnName,
|
||||
const std::vector<std::string> &Args) = 0;
|
||||
const std::vector<std::string> &Args,
|
||||
const char ** envp) = 0;
|
||||
|
||||
/// createJIT - Create an return a new JIT compiler if there is one available
|
||||
/// for the current target. Otherwise it returns null.
|
||||
|
@ -40,7 +40,8 @@ Interpreter::Interpreter(Module *M, unsigned Config,
|
||||
/// run - Start execution with the specified function and arguments.
|
||||
///
|
||||
int Interpreter::run(const std::string &MainFunction,
|
||||
const std::vector<std::string> &Args) {
|
||||
const std::vector<std::string> &Args,
|
||||
const char ** envp) {
|
||||
// Start interpreter into the main function...
|
||||
//
|
||||
if (!callMainFunction(MainFunction, Args) && !Debug) {
|
||||
|
@ -97,7 +97,8 @@ public:
|
||||
/// run - Start execution with the specified function and arguments.
|
||||
///
|
||||
virtual int run(const std::string &FnName,
|
||||
const std::vector<std::string> &Args);
|
||||
const std::vector<std::string> &Args,
|
||||
const char ** envp);
|
||||
|
||||
|
||||
// enableProfiling() - Turn profiling on, clear stats?
|
||||
|
@ -11,6 +11,8 @@
|
||||
#include "llvm/Module.h"
|
||||
#include "Support/CommandLine.h"
|
||||
|
||||
#include "Config/stdlib.h"
|
||||
|
||||
// FIXME: REMOVE THIS
|
||||
#include "llvm/PassManager.h"
|
||||
|
||||
@ -101,21 +103,43 @@ VM::VM(Module *M, TargetMachine *tm) : ExecutionEngine(M), TM(*tm) {
|
||||
emitGlobals();
|
||||
}
|
||||
|
||||
int VM::run(const std::string &FnName, const std::vector<std::string> &Args) {
|
||||
//
|
||||
// Method: run()
|
||||
//
|
||||
// Description:
|
||||
// This method begins the execution of a program beginning at the
|
||||
// specified function name. The function is called with the
|
||||
// specified arguments and array of environment variables (a la main()).
|
||||
//
|
||||
// Inputs:
|
||||
// FnName - The name of the function as a C++ string.
|
||||
// Args - A vector of C++ strings containing the arguments.
|
||||
// envp - An array of C strings containing the environment.
|
||||
//
|
||||
// Outputs:
|
||||
// None.
|
||||
//
|
||||
// Return value:
|
||||
// 1 - An error occurred.
|
||||
// Otherwise, the return value from the specified function is returned.
|
||||
//
|
||||
int VM::run(const std::string &FnName,
|
||||
const std::vector<std::string> &Args,
|
||||
const char ** envp) {
|
||||
Function *F = getModule().getNamedFunction(FnName);
|
||||
if (F == 0) {
|
||||
std::cerr << "Could not find function '" << FnName << "' in module!\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
int(*PF)(int, char**) = (int(*)(int, char**))getPointerToFunction(F);
|
||||
int(*PF)(int, char**, const char**) = (int(*)(int, char**, const char**))getPointerToFunction(F);
|
||||
assert(PF != 0 && "Null pointer to function?");
|
||||
|
||||
// Build an argv vector...
|
||||
char **Argv = (char**)CreateArgv(Args);
|
||||
|
||||
// Call the main function...
|
||||
int Result = PF(Args.size(), Argv);
|
||||
int Result = PF(Args.size(), Argv, envp);
|
||||
|
||||
// Run any atexit handlers now!
|
||||
runAtExitHandlers();
|
||||
|
@ -29,7 +29,8 @@ public:
|
||||
/// run - Start execution with the specified function and arguments.
|
||||
///
|
||||
virtual int run(const std::string &FnName,
|
||||
const std::vector<std::string> &Args);
|
||||
const std::vector<std::string> &Args,
|
||||
const char ** envp);
|
||||
|
||||
/// getPointerToNamedFunction - This method returns the address of the
|
||||
/// specified function by using the dlsym function call. As such it is only
|
||||
|
@ -29,7 +29,8 @@ public:
|
||||
/// run - Start execution with the specified function and arguments.
|
||||
///
|
||||
virtual int run(const std::string &FnName,
|
||||
const std::vector<std::string> &Args);
|
||||
const std::vector<std::string> &Args,
|
||||
const char ** envp);
|
||||
|
||||
/// getPointerToNamedFunction - This method returns the address of the
|
||||
/// specified function by using the dlsym function call. As such it is only
|
||||
|
@ -46,7 +46,7 @@ ExecutionEngine::~ExecutionEngine() {
|
||||
//===----------------------------------------------------------------------===//
|
||||
// main Driver function
|
||||
//
|
||||
int main(int argc, char** argv) {
|
||||
int main(int argc, char** argv, const char ** envp) {
|
||||
cl::ParseCommandLineOptions(argc, argv,
|
||||
" llvm interpreter & dynamic compiler\n");
|
||||
|
||||
@ -98,7 +98,7 @@ int main(int argc, char** argv) {
|
||||
InputArgv.insert(InputArgv.begin(), InputFile);
|
||||
|
||||
// Run the main function!
|
||||
int ExitCode = EE->run(MainFunction, InputArgv);
|
||||
int ExitCode = EE->run(MainFunction, InputArgv, envp);
|
||||
|
||||
// Now that we are done executing the program, shut down the execution engine
|
||||
delete EE;
|
||||
|
Loading…
Reference in New Issue
Block a user