diff options
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/Interpreter.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/Interpreter.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.cpp b/lib/ExecutionEngine/Interpreter/Interpreter.cpp index 4f8c407340..6b82dada33 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.cpp +++ b/lib/ExecutionEngine/Interpreter/Interpreter.cpp @@ -8,6 +8,8 @@ #include "Interpreter.h" #include "llvm/Module.h" +#include "llvm/DerivedTypes.h" +#include "llvm/Function.h" /// create - Create a new interpreter object. This can never fail. /// @@ -76,3 +78,45 @@ int Interpreter::run(const std::string &MainFunction, return ExitCode; } + +// callMainFunction - Construct call to typical C main() function and +// call it using callFunction(). +// +bool Interpreter::callMainFunction(const std::string &Name, + const std::vector<std::string> &InputArgv) { + Function *M = getModule().getNamedFunction(Name); + if (M == 0) { + std::cerr << "Could not find function '" << Name << "' in module!\n"; + return 1; + } + const FunctionType *MT = M->getFunctionType(); + + std::vector<GenericValue> Args; + if (MT->getParamTypes().size() >= 2) { + PointerType *SPP = PointerType::get(PointerType::get(Type::SByteTy)); + if (MT->getParamTypes()[1] != SPP) { + CW << "Second argument of '" << Name << "' should have type: '" + << SPP << "'!\n"; + return true; + } + Args.push_back(PTOGV(CreateArgv(InputArgv))); + } + + if (MT->getParamTypes().size() >= 1) { + if (!MT->getParamTypes()[0]->isInteger()) { + std::cout << "First argument of '" << Name + << "' should be an integer!\n"; + return true; + } else { + GenericValue GV; GV.UIntVal = InputArgv.size(); + Args.insert(Args.begin(), GV); + } + } + + callFunction(M, Args); // Start executing it... + + // Reset the current frame location to the top of stack + CurFrame = ECStack.size()-1; + + return false; +} |