diff --git a/tools/jello/VM.cpp b/tools/jello/VM.cpp index 5b0bf2f4ec3..e5e77c3e275 100644 --- a/tools/jello/VM.cpp +++ b/tools/jello/VM.cpp @@ -38,9 +38,14 @@ void VM::setupPassManager() { } int VM::run(Function *F) { - int(*PF)() = (int(*)())getPointerToFunction(F); + int(*PF)(int, char**) = (int(*)(int, char**))getPointerToFunction(F); assert(PF != 0 && "Null pointer to function?"); - return PF(); + + unsigned NumArgs = 0; + for (; Argv[NumArgs]; ++NumArgs) + ; + + return PF(NumArgs, Argv); } void *VM::resolveFunctionReference(void *RefAddr) { diff --git a/tools/jello/VM.h b/tools/jello/VM.h index 783b7dc12eb..c02b4044f75 100644 --- a/tools/jello/VM.h +++ b/tools/jello/VM.h @@ -24,6 +24,7 @@ class VM { TargetMachine &TM; // The current target we are compiling to PassManager PM; // Passes to compile a function MachineCodeEmitter *MCE; // MCE object + char **Argv; // GlobalAddress - A mapping between LLVM values and their native code // generated versions... @@ -35,8 +36,8 @@ class VM { // std::map FunctionRefs; public: - VM(const std::string &name, Module &m, TargetMachine &tm) - : ExeName(name), M(m), TM(tm) { + VM(const std::string &name, char **AV, Module &m, TargetMachine &tm) + : ExeName(name), M(m), TM(tm), Argv(AV) { MCE = createEmitter(*this); // Initialize MCE setupPassManager(); registerCallback(); diff --git a/tools/jello/jello.cpp b/tools/jello/jello.cpp index 52541f012c7..7fe37b02f65 100644 --- a/tools/jello/jello.cpp +++ b/tools/jello/jello.cpp @@ -16,6 +16,9 @@ namespace { cl::opt InputFile(cl::desc(""), cl::Positional, cl::init("-")); + cl::list + InputArgv(cl::ConsumeAfter, cl::desc("...")); + cl::opt MainFunction("f", cl::desc("Function to execute"), cl::init("main"), cl::value_desc("function name")); @@ -41,8 +44,18 @@ int main(int argc, char **argv) { return 1; } + // Build an argv vector... + InputArgv.insert(InputArgv.begin(), InputFile); + char **Argv = new char*[InputArgv.size()+1]; + for (unsigned i = 0, e = InputArgv.size(); i != e; ++i) { + Argv[i] = new char[InputArgv[i].size()+1]; + std::copy(InputArgv[i].begin(), InputArgv[i].end(), Argv[i]); + Argv[i][InputArgv[i].size()] = 0; + } + Argv[InputArgv.size()] = 0; + // Create the virtual machine object... - VM TheVM(argv[0], *M.get(), *Target.get()); + VM TheVM(argv[0], Argv, *M.get(), *Target.get()); Function *F = M.get()->getNamedFunction(MainFunction); if (F == 0) {