diff --git a/lib/ExecutionEngine/Interpreter/Execution.cpp b/lib/ExecutionEngine/Interpreter/Execution.cpp index 9ad5abab2d9..1f2d6f132d8 100644 --- a/lib/ExecutionEngine/Interpreter/Execution.cpp +++ b/lib/ExecutionEngine/Interpreter/Execution.cpp @@ -544,7 +544,7 @@ static void executeLoadInst(LoadInst *I, ExecutionContext &SF) { case Type::LongTyID: Result.LongVal = Ptr->LongVal; break; case Type::FloatTyID: Result.FloatVal = Ptr->FloatVal; break; case Type::DoubleTyID: Result.DoubleVal = Ptr->DoubleVal; break; - case Type::PointerTyID: Result.PointerVal = Ptr->PointerVal; break; + case Type::PointerTyID: Result.PointerVal =(GenericValue*)Ptr->LongVal; break; default: cout << "Cannot load value of type " << I->getType() << "!\n"; } diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.h b/lib/ExecutionEngine/Interpreter/Interpreter.h index d9a6834128d..5b123466aa6 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.h +++ b/lib/ExecutionEngine/Interpreter/Interpreter.h @@ -88,7 +88,7 @@ public: // Hack until we can parse command line args... bool callMainMethod(const string &MainName, - const string &InputFilename); + const vector &InputFilename); void list(); // Do the 'list' command void printStackTrace(); // Do the 'backtrace' command diff --git a/lib/ExecutionEngine/Interpreter/UserInput.cpp b/lib/ExecutionEngine/Interpreter/UserInput.cpp index 2989ae95e86..efe7150c137 100644 --- a/lib/ExecutionEngine/Interpreter/UserInput.cpp +++ b/lib/ExecutionEngine/Interpreter/UserInput.cpp @@ -212,12 +212,28 @@ bool Interpreter::callMethod(const string &Name) { return false; } +static void *CreateArgv(const vector &InputArgv) { + // Pointers are 64 bits... + uint64_t *Result = new uint64_t[InputArgv.size()+1]; + + for (unsigned i = 0; i < InputArgv.size(); ++i) { + unsigned Size = InputArgv[i].size()+1; + char *Dest = new char[Size]; + copy(InputArgv[i].begin(), InputArgv[i].end(), Dest); + Dest[Size-1] = 0; + Result[i] = (uint64_t)Dest; + } + + Result[InputArgv.size()] = 0; + return Result; +} + // callMainMethod - This is a nasty gross hack that will dissapear when // callMethod can parse command line options and stuff for us. // bool Interpreter::callMainMethod(const string &Name, - const string &InputFilename) { + const vector &InputArgv) { vector Options = LookupMatchingNames(Name); for (unsigned i = 0; i < Options.size(); ++i) { // Remove nonmethod matches... @@ -246,8 +262,8 @@ bool Interpreter::callMainMethod(const string &Name, << SPP->getDescription() << "'!\n"; return true; } - // TODO: - GenericValue GV; GV.PointerVal = 0; + + GenericValue GV; GV.PointerVal = (GenericValue*)CreateArgv(InputArgv); Args.push_back(GV); } // fallthrough @@ -256,7 +272,7 @@ bool Interpreter::callMainMethod(const string &Name, cout << "First argument of '" << Name << "' should be integral!\n"; return true; } else { - GenericValue GV; GV.IntVal = 1; + GenericValue GV; GV.UIntVal = InputArgv.size(); Args.insert(Args.begin(), GV); } // fallthrough diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 818931c5f79..29d45d68306 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -10,7 +10,7 @@ #include "Interpreter.h" #include "llvm/Support/CommandLine.h" -cl::String InputFilename("" , "Input filename", cl::NoFlags, "-"); +cl::StringList InputArgv("" , "Input command line", cl::ConsumeAfter); cl::String MainFunction ("f" , "Function to execute", cl::NoFlags, "main"); cl::Flag DebugMode ("debug" , "Start program in debugger"); cl::Alias DebugModeA ("d" , "Alias for -debug", cl::NoFlags, DebugMode); @@ -21,7 +21,7 @@ cl::Flag ProfileMode ("profile", "Enable Profiling [unimp]"); // Interpreter::Interpreter() : ExitCode(0), Profile(ProfileMode), CurFrame(-1) { CurMod = 0; - loadModule(InputFilename); + loadModule(InputArgv.size() ? InputArgv[0] : ""); // Initialize the "backend" initializeExecutionEngine(); @@ -49,7 +49,7 @@ int main(int argc, char** argv) { // Start interpreter into the main function... // - if (!I.callMainMethod(MainFunction, InputFilename) && !DebugMode) { + if (!I.callMainMethod(MainFunction, InputArgv) && !DebugMode) { // If not in debug mode and if the call succeeded, run the code now... I.run(); }