X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FExecutionEngine%2FExecutionEngine.cpp;h=97384dbba6b9c791ee590074058eb407b0805717;hb=eb516e7f0aa3223eab7967f4c0f8132d82efd841;hp=208f8e2e834a2b22eb43e219feec089fca291850;hpb=bd1d382cc47dfc43ee758714bc22ab5a750bad15;p=oota-llvm.git diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp index 208f8e2e834..97384dbba6b 100644 --- a/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/lib/ExecutionEngine/ExecutionEngine.cpp @@ -1,12 +1,12 @@ //===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===// -// +// // 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 defines the common interface used by the various execution engine // subclasses. // @@ -19,13 +19,13 @@ #include "llvm/DerivedTypes.h" #include "llvm/Module.h" #include "llvm/ModuleProvider.h" +#include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/IntrinsicLowering.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/ExecutionEngine/GenericValue.h" -#include "llvm/Target/TargetData.h" #include "llvm/Support/Debug.h" -#include "llvm/ADT/Statistic.h" -#include "llvm/Support/DynamicLinker.h" +#include "llvm/System/DynamicLibrary.h" +#include "llvm/Target/TargetData.h" using namespace llvm; namespace { @@ -33,7 +33,7 @@ namespace { Statistic<> NumGlobals ("lli", "Number of global vars initialized"); } -ExecutionEngine::ExecutionEngine(ModuleProvider *P) : +ExecutionEngine::ExecutionEngine(ModuleProvider *P) : CurMod(*P->getModule()), MP(P) { assert(P && "ModuleProvider is null?"); } @@ -52,7 +52,7 @@ ExecutionEngine::~ExecutionEngine() { const GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) { // If we haven't computed the reverse mapping yet, do so first. if (GlobalAddressReverseMap.empty()) { - for (std::map::iterator I = + for (std::map::iterator I = GlobalAddressMap.begin(), E = GlobalAddressMap.end(); I != E; ++I) GlobalAddressReverseMap.insert(std::make_pair(I->second, I->first)); } @@ -77,10 +77,10 @@ static void *CreateArgv(ExecutionEngine *EE, unsigned Size = InputArgv[i].size()+1; char *Dest = new char[Size]; DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n"); - + std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest); Dest[Size-1] = 0; - + // Endian safe: Result[i] = (PointerTy)Dest; EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i*PtrSize), SBytePtr); @@ -124,9 +124,9 @@ int ExecutionEngine::runFunctionAsMain(Function *Fn, /// If possible, create a JIT, unless the caller specifically requests an /// Interpreter or there's an error. If even an Interpreter cannot be created, -/// NULL is returned. +/// NULL is returned. /// -ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP, +ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP, bool ForceInterpreter, IntrinsicLowering *IL) { ExecutionEngine *EE = 0; @@ -151,7 +151,13 @@ ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP, } } - if (EE == 0) delete IL; + if (EE == 0) + delete IL; + else + // Make sure we can resolve symbols in the program as well. The zero arg + // to the function tells DynamicLibrary to load the program, not a library. + sys::DynamicLibrary::LoadLibraryPermanently(0); + return EE; } @@ -167,9 +173,10 @@ void *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) { } /// FIXME: document -/// +/// GenericValue ExecutionEngine::getConstantValue(const Constant *C) { GenericValue Result; + if (isa(C)) return Result; if (ConstantExpr *CE = const_cast(dyn_cast(C))) { switch (CE->getOpcode()) { @@ -178,7 +185,7 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) { std::vector Indexes(CE->op_begin()+1, CE->op_end()); uint64_t Offset = TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes); - + Result.LongVal += Offset; return Result; } @@ -196,7 +203,7 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) { // Handle a cast of pointer to any integral type... if (isa(Op->getType()) && C->getType()->isIntegral()) return GV; - + // Handle cast of integer to a pointer... if (isa(C->getType()) && Op->getType()->isIntegral()) switch (Op->getType()->getTypeID()) { @@ -253,21 +260,21 @@ GenericValue ExecutionEngine::getConstantValue(const Constant *C) { std::cerr << "ConstantExpr not handled as global var init: " << *CE << "\n"; abort(); } - + switch (C->getType()->getTypeID()) { -#define GET_CONST_VAL(TY, CLASS) \ - case Type::TY##TyID: Result.TY##Val = cast(C)->getValue(); break - GET_CONST_VAL(Bool , ConstantBool); - GET_CONST_VAL(UByte , ConstantUInt); - GET_CONST_VAL(SByte , ConstantSInt); - GET_CONST_VAL(UShort , ConstantUInt); - GET_CONST_VAL(Short , ConstantSInt); - GET_CONST_VAL(UInt , ConstantUInt); - GET_CONST_VAL(Int , ConstantSInt); - GET_CONST_VAL(ULong , ConstantUInt); - GET_CONST_VAL(Long , ConstantSInt); - GET_CONST_VAL(Float , ConstantFP); - GET_CONST_VAL(Double , ConstantFP); +#define GET_CONST_VAL(TY, CTY, CLASS) \ + case Type::TY##TyID: Result.TY##Val = (CTY)cast(C)->getValue(); break + GET_CONST_VAL(Bool , bool , ConstantBool); + GET_CONST_VAL(UByte , unsigned char , ConstantUInt); + GET_CONST_VAL(SByte , signed char , ConstantSInt); + GET_CONST_VAL(UShort , unsigned short, ConstantUInt); + GET_CONST_VAL(Short , signed short , ConstantSInt); + GET_CONST_VAL(UInt , unsigned int , ConstantUInt); + GET_CONST_VAL(Int , signed int , ConstantSInt); + GET_CONST_VAL(ULong , uint64_t , ConstantUInt); + GET_CONST_VAL(Long , int64_t , ConstantSInt); + GET_CONST_VAL(Float , float , ConstantFP); + GET_CONST_VAL(Double , double , ConstantFP); #undef GET_CONST_VAL case Type::PointerTyID: if (isa(C)) @@ -311,15 +318,16 @@ void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr, goto Store4BytesLittleEndian; case Type::DoubleTyID: case Type::ULongTyID: - case Type::LongTyID: Ptr->Untyped[0] = Val.ULongVal & 255; - Ptr->Untyped[1] = (Val.ULongVal >> 8) & 255; - Ptr->Untyped[2] = (Val.ULongVal >> 16) & 255; - Ptr->Untyped[3] = (Val.ULongVal >> 24) & 255; - Ptr->Untyped[4] = (Val.ULongVal >> 32) & 255; - Ptr->Untyped[5] = (Val.ULongVal >> 40) & 255; - Ptr->Untyped[6] = (Val.ULongVal >> 48) & 255; - Ptr->Untyped[7] = (Val.ULongVal >> 56) & 255; - break; + case Type::LongTyID: + Ptr->Untyped[0] = (unsigned char)(Val.ULongVal ); + Ptr->Untyped[1] = (unsigned char)(Val.ULongVal >> 8); + Ptr->Untyped[2] = (unsigned char)(Val.ULongVal >> 16); + Ptr->Untyped[3] = (unsigned char)(Val.ULongVal >> 24); + Ptr->Untyped[4] = (unsigned char)(Val.ULongVal >> 32); + Ptr->Untyped[5] = (unsigned char)(Val.ULongVal >> 40); + Ptr->Untyped[6] = (unsigned char)(Val.ULongVal >> 48); + Ptr->Untyped[7] = (unsigned char)(Val.ULongVal >> 56); + break; default: std::cout << "Cannot store value of type " << *Ty << "!\n"; } @@ -344,15 +352,16 @@ void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr, goto Store4BytesBigEndian; case Type::DoubleTyID: case Type::ULongTyID: - case Type::LongTyID: Ptr->Untyped[7] = Val.ULongVal & 255; - Ptr->Untyped[6] = (Val.ULongVal >> 8) & 255; - Ptr->Untyped[5] = (Val.ULongVal >> 16) & 255; - Ptr->Untyped[4] = (Val.ULongVal >> 24) & 255; - Ptr->Untyped[3] = (Val.ULongVal >> 32) & 255; - Ptr->Untyped[2] = (Val.ULongVal >> 40) & 255; - Ptr->Untyped[1] = (Val.ULongVal >> 48) & 255; - Ptr->Untyped[0] = (Val.ULongVal >> 56) & 255; - break; + case Type::LongTyID: + Ptr->Untyped[7] = (unsigned char)(Val.ULongVal ); + Ptr->Untyped[6] = (unsigned char)(Val.ULongVal >> 8); + Ptr->Untyped[5] = (unsigned char)(Val.ULongVal >> 16); + Ptr->Untyped[4] = (unsigned char)(Val.ULongVal >> 24); + Ptr->Untyped[3] = (unsigned char)(Val.ULongVal >> 32); + Ptr->Untyped[2] = (unsigned char)(Val.ULongVal >> 40); + Ptr->Untyped[1] = (unsigned char)(Val.ULongVal >> 48); + Ptr->Untyped[0] = (unsigned char)(Val.ULongVal >> 56); + break; default: std::cout << "Cannot store value of type " << *Ty << "!\n"; } @@ -373,7 +382,7 @@ GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr, case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[0] | ((unsigned)Ptr->Untyped[1] << 8); break; - Load4BytesLittleEndian: + Load4BytesLittleEndian: case Type::FloatTyID: case Type::UIntTyID: case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[0] | @@ -447,15 +456,14 @@ void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); return; } else if (isa(Init)) { - unsigned Size = getTargetData().getTypeSize(Init->getType()); - memset(Addr, 0, Size); + memset(Addr, 0, (size_t)getTargetData().getTypeSize(Init->getType())); return; } switch (Init->getType()->getTypeID()) { case Type::ArrayTyID: { const ConstantArray *CPA = cast(Init); - unsigned ElementSize = + unsigned ElementSize = getTargetData().getTypeSize(cast(CPA->getType())->getElementType()); for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i) InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize); @@ -483,22 +491,23 @@ void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { /// void ExecutionEngine::emitGlobals() { const TargetData &TD = getTargetData(); - + // Loop over all of the global variables in the program, allocating the memory // to hold them. - for (Module::giterator I = getModule().gbegin(), E = getModule().gend(); + for (Module::const_global_iterator I = getModule().global_begin(), E = getModule().global_end(); I != E; ++I) if (!I->isExternal()) { // Get the type of the global... const Type *Ty = I->getType()->getElementType(); - + // Allocate some memory for it! unsigned Size = TD.getTypeSize(Ty); addGlobalMapping(I, new char[Size]); } else { // External variable reference. Try to use the dynamic loader to // get a pointer to it. - if (void *SymAddr = GetAddressOfSymbol(I->getName().c_str())) + if (void *SymAddr = sys::DynamicLibrary::SearchForAddressOfSymbol( + I->getName().c_str())) addGlobalMapping(I, SymAddr); else { std::cerr << "Could not resolve external global address: " @@ -506,10 +515,10 @@ void ExecutionEngine::emitGlobals() { abort(); } } - + // Now that all of the globals are set up in memory, loop through them all and // initialize their contents. - for (Module::giterator I = getModule().gbegin(), E = getModule().gend(); + for (Module::const_global_iterator I = getModule().global_begin(), E = getModule().global_end(); I != E; ++I) if (!I->isExternal()) EmitGlobalVariable(I); @@ -523,13 +532,14 @@ void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) { DEBUG(std::cerr << "Global '" << GV->getName() << "' -> " << GA << "\n"); const Type *ElTy = GV->getType()->getElementType(); + size_t GVSize = (size_t)getTargetData().getTypeSize(ElTy); if (GA == 0) { // If it's not already specified, allocate memory for the global. - GA = new char[getTargetData().getTypeSize(ElTy)]; + GA = new char[GVSize]; addGlobalMapping(GV, GA); } InitializeMemory(GV->getInitializer(), GA); - NumInitBytes += getTargetData().getTypeSize(ElTy); + NumInitBytes += (unsigned)GVSize; ++NumGlobals; }