X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FExecutionEngine%2FInterpreter%2FInterpreter.cpp;h=8cb9d45bb6806759390f0015fd6ee9d340508503;hb=e02fce0ac900fb1e5fd8f3c437bee3e8a9259e29;hp=4728c95b7439344139216d3255afe71c4377b597;hpb=b71fd7897f6b4500cdbe602c5a9907316750cf5a;p=oota-llvm.git diff --git a/lib/ExecutionEngine/Interpreter/Interpreter.cpp b/lib/ExecutionEngine/Interpreter/Interpreter.cpp index 4728c95b743..8cb9d45bb68 100644 --- a/lib/ExecutionEngine/Interpreter/Interpreter.cpp +++ b/lib/ExecutionEngine/Interpreter/Interpreter.cpp @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -15,59 +15,49 @@ #include "Interpreter.h" #include "llvm/CodeGen/IntrinsicLowering.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Module.h" -#include "llvm/ModuleProvider.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Module.h" +#include using namespace llvm; +namespace { + static struct RegisterInterp { RegisterInterp() { Interpreter::Register(); } } InterpRegistrator; -namespace llvm { - void LinkInInterpreter() { - } } -/// create - Create a new interpreter object. This can never fail. -/// -ExecutionEngine *Interpreter::create(ModuleProvider *MP) { - Module *M; - try { - M = MP->materializeModule(); - } catch (...) { - return 0; // error materializing the module. - } - - if (M->getEndianness() == Module::AnyEndianness) { - int Test = 0; - *(char*)&Test = 1; // Return true if the host is little endian - bool isLittleEndian = (Test == 1); - M->setEndianness(isLittleEndian ? Module::LittleEndian : Module::BigEndian); - } +extern "C" void LLVMLinkInInterpreter() { } - if (M->getPointerSize() == Module::AnyPointerSize) { - // Follow host. - bool Ptr64 = sizeof(void*) == 8; - M->setPointerSize(Ptr64 ? Module::Pointer64 : Module::Pointer32); +/// Create a new interpreter object. +/// +ExecutionEngine *Interpreter::create(std::unique_ptr M, + std::string *ErrStr) { + // Tell this Module to materialize everything and release the GVMaterializer. + if (std::error_code EC = M->materializeAllPermanently()) { + if (ErrStr) + *ErrStr = EC.message(); + // We got an error, just return 0 + return nullptr; } - return new Interpreter(M); + return new Interpreter(std::move(M)); } //===----------------------------------------------------------------------===// // Interpreter ctor - Initialize stuff // -Interpreter::Interpreter(Module *M) : ExecutionEngine(M), TD(M) { - - memset(&ExitValue, 0, sizeof(ExitValue)); - setTargetData(&TD); +Interpreter::Interpreter(std::unique_ptr M) + : ExecutionEngine(std::move(M)) { + + memset(&ExitValue.Untyped, 0, sizeof(ExitValue.Untyped)); // Initialize the "backend" initializeExecutionEngine(); initializeExternalFunctions(); emitGlobals(); - IL = new IntrinsicLowering(); + IL = new IntrinsicLowering(getDataLayout()); } Interpreter::~Interpreter() { @@ -76,7 +66,7 @@ Interpreter::~Interpreter() { void Interpreter::runAtExitHandlers () { while (!AtExitHandlers.empty()) { - callFunction(AtExitHandlers.back(), std::vector()); + callFunction(AtExitHandlers.back(), None); AtExitHandlers.pop_back(); run(); } @@ -84,9 +74,8 @@ void Interpreter::runAtExitHandlers () { /// run - Start execution with the specified function and arguments. /// -GenericValue -Interpreter::runFunction(Function *F, - const std::vector &ArgValues) { +GenericValue Interpreter::runFunction(Function *F, + ArrayRef ArgValues) { assert (F && "Function *F was null at entry to run()"); // Try extra hard not to pass extra args to a function that isn't @@ -96,10 +85,9 @@ Interpreter::runFunction(Function *F, // parameters than it is declared to take. This does not attempt to // take into account gratuitous differences in declared types, // though. - std::vector ActualArgs; - const unsigned ArgCount = F->getFunctionType()->getNumParams(); - for (unsigned i = 0; i < ArgCount; ++i) - ActualArgs.push_back(ArgValues[i]); + const size_t ArgCount = F->getFunctionType()->getNumParams(); + ArrayRef ActualArgs = + ArgValues.slice(0, std::min(ArgValues.size(), ArgCount)); // Set up the function call. callFunction(F, ActualArgs); @@ -109,4 +97,3 @@ Interpreter::runFunction(Function *F, return ExitValue; } -