1857c21b4SMisha Brukman //===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===// 2996fe010SChris Lattner // 3482202a6SJohn Criswell // The LLVM Compiler Infrastructure 4482202a6SJohn Criswell // 5482202a6SJohn Criswell // This file was developed by the LLVM research group and is distributed under 6482202a6SJohn Criswell // the University of Illinois Open Source License. See LICENSE.TXT for details. 7482202a6SJohn Criswell // 8482202a6SJohn Criswell //===----------------------------------------------------------------------===// 9482202a6SJohn Criswell // 10996fe010SChris Lattner // This file defines the common interface used by the various execution engine 11996fe010SChris Lattner // subclasses. 12996fe010SChris Lattner // 13996fe010SChris Lattner //===----------------------------------------------------------------------===// 14996fe010SChris Lattner 15ee937c80SChris Lattner #define DEBUG_TYPE "jit" 16996fe010SChris Lattner #include "llvm/Constants.h" 17260b0c88SMisha Brukman #include "llvm/DerivedTypes.h" 18996fe010SChris Lattner #include "llvm/Module.h" 19260b0c88SMisha Brukman #include "llvm/ModuleProvider.h" 2070e37278SReid Spencer #include "llvm/ADT/Statistic.h" 21260b0c88SMisha Brukman #include "llvm/ExecutionEngine/ExecutionEngine.h" 22ad481312SChris Lattner #include "llvm/ExecutionEngine/GenericValue.h" 237c16caa3SReid Spencer #include "llvm/Support/Debug.h" 246d8dd189SChris Lattner #include "llvm/Support/MutexGuard.h" 2570e37278SReid Spencer #include "llvm/System/DynamicLibrary.h" 2670e37278SReid Spencer #include "llvm/Target/TargetData.h" 2729681deeSChris Lattner using namespace llvm; 28996fe010SChris Lattner 29c346ecd7SChris Lattner STATISTIC(NumInitBytes, "Number of bytes of global vars initialized"); 30c346ecd7SChris Lattner STATISTIC(NumGlobals , "Number of global vars initialized"); 31996fe010SChris Lattner 322d52c1b8SChris Lattner ExecutionEngine::EECtorFn ExecutionEngine::JITCtor = 0; 332d52c1b8SChris Lattner ExecutionEngine::EECtorFn ExecutionEngine::InterpCtor = 0; 342d52c1b8SChris Lattner 350621caefSChris Lattner ExecutionEngine::ExecutionEngine(ModuleProvider *P) { 3687aee74cSChris Lattner LazyCompilationDisabled = false; 370621caefSChris Lattner Modules.push_back(P); 38260b0c88SMisha Brukman assert(P && "ModuleProvider is null?"); 39260b0c88SMisha Brukman } 40260b0c88SMisha Brukman 410621caefSChris Lattner ExecutionEngine::ExecutionEngine(Module *M) { 4287aee74cSChris Lattner LazyCompilationDisabled = false; 43260b0c88SMisha Brukman assert(M && "Module is null?"); 440621caefSChris Lattner Modules.push_back(new ExistingModuleProvider(M)); 45260b0c88SMisha Brukman } 46260b0c88SMisha Brukman 4792f8b30dSBrian Gaeke ExecutionEngine::~ExecutionEngine() { 480621caefSChris Lattner for (unsigned i = 0, e = Modules.size(); i != e; ++i) 490621caefSChris Lattner delete Modules[i]; 5092f8b30dSBrian Gaeke } 5192f8b30dSBrian Gaeke 520621caefSChris Lattner /// FindFunctionNamed - Search all of the active modules to find the one that 530621caefSChris Lattner /// defines FnName. This is very slow operation and shouldn't be used for 540621caefSChris Lattner /// general code. 550621caefSChris Lattner Function *ExecutionEngine::FindFunctionNamed(const char *FnName) { 560621caefSChris Lattner for (unsigned i = 0, e = Modules.size(); i != e; ++i) { 570621caefSChris Lattner if (Function *F = Modules[i]->getModule()->getNamedFunction(FnName)) 580621caefSChris Lattner return F; 590621caefSChris Lattner } 600621caefSChris Lattner return 0; 610621caefSChris Lattner } 620621caefSChris Lattner 630621caefSChris Lattner 646d8dd189SChris Lattner /// addGlobalMapping - Tell the execution engine that the specified global is 656d8dd189SChris Lattner /// at the specified location. This is used internally as functions are JIT'd 666d8dd189SChris Lattner /// and as global variables are laid out in memory. It can and should also be 676d8dd189SChris Lattner /// used by clients of the EE that want to have an LLVM global overlay 686d8dd189SChris Lattner /// existing data in memory. 696d8dd189SChris Lattner void ExecutionEngine::addGlobalMapping(const GlobalValue *GV, void *Addr) { 706d8dd189SChris Lattner MutexGuard locked(lock); 716d8dd189SChris Lattner 726d8dd189SChris Lattner void *&CurVal = state.getGlobalAddressMap(locked)[GV]; 736d8dd189SChris Lattner assert((CurVal == 0 || Addr == 0) && "GlobalMapping already established!"); 746d8dd189SChris Lattner CurVal = Addr; 756d8dd189SChris Lattner 766d8dd189SChris Lattner // If we are using the reverse mapping, add it too 776d8dd189SChris Lattner if (!state.getGlobalAddressReverseMap(locked).empty()) { 786d8dd189SChris Lattner const GlobalValue *&V = state.getGlobalAddressReverseMap(locked)[Addr]; 796d8dd189SChris Lattner assert((V == 0 || GV == 0) && "GlobalMapping already established!"); 806d8dd189SChris Lattner V = GV; 816d8dd189SChris Lattner } 826d8dd189SChris Lattner } 836d8dd189SChris Lattner 846d8dd189SChris Lattner /// clearAllGlobalMappings - Clear all global mappings and start over again 856d8dd189SChris Lattner /// use in dynamic compilation scenarios when you want to move globals 866d8dd189SChris Lattner void ExecutionEngine::clearAllGlobalMappings() { 876d8dd189SChris Lattner MutexGuard locked(lock); 886d8dd189SChris Lattner 896d8dd189SChris Lattner state.getGlobalAddressMap(locked).clear(); 906d8dd189SChris Lattner state.getGlobalAddressReverseMap(locked).clear(); 916d8dd189SChris Lattner } 926d8dd189SChris Lattner 936d8dd189SChris Lattner /// updateGlobalMapping - Replace an existing mapping for GV with a new 946d8dd189SChris Lattner /// address. This updates both maps as required. If "Addr" is null, the 956d8dd189SChris Lattner /// entry for the global is removed from the mappings. 966d8dd189SChris Lattner void ExecutionEngine::updateGlobalMapping(const GlobalValue *GV, void *Addr) { 976d8dd189SChris Lattner MutexGuard locked(lock); 986d8dd189SChris Lattner 996d8dd189SChris Lattner // Deleting from the mapping? 1006d8dd189SChris Lattner if (Addr == 0) { 1016d8dd189SChris Lattner state.getGlobalAddressMap(locked).erase(GV); 1026d8dd189SChris Lattner if (!state.getGlobalAddressReverseMap(locked).empty()) 1036d8dd189SChris Lattner state.getGlobalAddressReverseMap(locked).erase(Addr); 1046d8dd189SChris Lattner return; 1056d8dd189SChris Lattner } 1066d8dd189SChris Lattner 1076d8dd189SChris Lattner void *&CurVal = state.getGlobalAddressMap(locked)[GV]; 1086d8dd189SChris Lattner if (CurVal && !state.getGlobalAddressReverseMap(locked).empty()) 1096d8dd189SChris Lattner state.getGlobalAddressReverseMap(locked).erase(CurVal); 1106d8dd189SChris Lattner CurVal = Addr; 1116d8dd189SChris Lattner 1126d8dd189SChris Lattner // If we are using the reverse mapping, add it too 1136d8dd189SChris Lattner if (!state.getGlobalAddressReverseMap(locked).empty()) { 1146d8dd189SChris Lattner const GlobalValue *&V = state.getGlobalAddressReverseMap(locked)[Addr]; 1156d8dd189SChris Lattner assert((V == 0 || GV == 0) && "GlobalMapping already established!"); 1166d8dd189SChris Lattner V = GV; 1176d8dd189SChris Lattner } 1186d8dd189SChris Lattner } 1196d8dd189SChris Lattner 1206d8dd189SChris Lattner /// getPointerToGlobalIfAvailable - This returns the address of the specified 1216d8dd189SChris Lattner /// global value if it is has already been codegen'd, otherwise it returns null. 1226d8dd189SChris Lattner /// 1236d8dd189SChris Lattner void *ExecutionEngine::getPointerToGlobalIfAvailable(const GlobalValue *GV) { 1246d8dd189SChris Lattner MutexGuard locked(lock); 1256d8dd189SChris Lattner 1266d8dd189SChris Lattner std::map<const GlobalValue*, void*>::iterator I = 1276d8dd189SChris Lattner state.getGlobalAddressMap(locked).find(GV); 1286d8dd189SChris Lattner return I != state.getGlobalAddressMap(locked).end() ? I->second : 0; 1296d8dd189SChris Lattner } 1306d8dd189SChris Lattner 131748e8579SChris Lattner /// getGlobalValueAtAddress - Return the LLVM global value object that starts 132748e8579SChris Lattner /// at the specified address. 133748e8579SChris Lattner /// 134748e8579SChris Lattner const GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) { 13579876f52SReid Spencer MutexGuard locked(lock); 13679876f52SReid Spencer 137748e8579SChris Lattner // If we haven't computed the reverse mapping yet, do so first. 13879876f52SReid Spencer if (state.getGlobalAddressReverseMap(locked).empty()) { 1396d8dd189SChris Lattner for (std::map<const GlobalValue*, void *>::iterator 1406d8dd189SChris Lattner I = state.getGlobalAddressMap(locked).begin(), 1416d8dd189SChris Lattner E = state.getGlobalAddressMap(locked).end(); I != E; ++I) 1426d8dd189SChris Lattner state.getGlobalAddressReverseMap(locked).insert(std::make_pair(I->second, 1436d8dd189SChris Lattner I->first)); 144748e8579SChris Lattner } 145748e8579SChris Lattner 146748e8579SChris Lattner std::map<void *, const GlobalValue*>::iterator I = 14779876f52SReid Spencer state.getGlobalAddressReverseMap(locked).find(Addr); 14879876f52SReid Spencer return I != state.getGlobalAddressReverseMap(locked).end() ? I->second : 0; 149748e8579SChris Lattner } 1505a0d4829SChris Lattner 1515a0d4829SChris Lattner // CreateArgv - Turn a vector of strings into a nice argv style array of 1525a0d4829SChris Lattner // pointers to null terminated strings. 1535a0d4829SChris Lattner // 1545a0d4829SChris Lattner static void *CreateArgv(ExecutionEngine *EE, 1555a0d4829SChris Lattner const std::vector<std::string> &InputArgv) { 15620a631fdSOwen Anderson unsigned PtrSize = EE->getTargetData()->getPointerSize(); 1575a0d4829SChris Lattner char *Result = new char[(InputArgv.size()+1)*PtrSize]; 1585a0d4829SChris Lattner 1595834fdb3SBill Wendling DOUT << "ARGV = " << (void*)Result << "\n"; 1600d54e78aSReid Spencer const Type *SBytePtr = PointerType::get(Type::Int8Ty); 1615a0d4829SChris Lattner 1625a0d4829SChris Lattner for (unsigned i = 0; i != InputArgv.size(); ++i) { 1635a0d4829SChris Lattner unsigned Size = InputArgv[i].size()+1; 1645a0d4829SChris Lattner char *Dest = new char[Size]; 1655834fdb3SBill Wendling DOUT << "ARGV[" << i << "] = " << (void*)Dest << "\n"; 1665a0d4829SChris Lattner 1675a0d4829SChris Lattner std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest); 1685a0d4829SChris Lattner Dest[Size-1] = 0; 1695a0d4829SChris Lattner 1705a0d4829SChris Lattner // Endian safe: Result[i] = (PointerTy)Dest; 1715a0d4829SChris Lattner EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i*PtrSize), 1725a0d4829SChris Lattner SBytePtr); 1735a0d4829SChris Lattner } 1745a0d4829SChris Lattner 1755a0d4829SChris Lattner // Null terminate it 1765a0d4829SChris Lattner EE->StoreValueToMemory(PTOGV(0), 1775a0d4829SChris Lattner (GenericValue*)(Result+InputArgv.size()*PtrSize), 1785a0d4829SChris Lattner SBytePtr); 1795a0d4829SChris Lattner return Result; 1805a0d4829SChris Lattner } 1815a0d4829SChris Lattner 182faae50b6SChris Lattner 183faae50b6SChris Lattner /// runStaticConstructorsDestructors - This method is used to execute all of 1840621caefSChris Lattner /// the static constructors or destructors for a program, depending on the 185faae50b6SChris Lattner /// value of isDtors. 186faae50b6SChris Lattner void ExecutionEngine::runStaticConstructorsDestructors(bool isDtors) { 187faae50b6SChris Lattner const char *Name = isDtors ? "llvm.global_dtors" : "llvm.global_ctors"; 1880621caefSChris Lattner 1890621caefSChris Lattner // Execute global ctors/dtors for each module in the program. 1900621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 1910621caefSChris Lattner GlobalVariable *GV = Modules[m]->getModule()->getNamedGlobal(Name); 192fe36eaebSChris Lattner 193fe36eaebSChris Lattner // If this global has internal linkage, or if it has a use, then it must be 194fe36eaebSChris Lattner // an old-style (llvmgcc3) static ctor with __main linked in and in use. If 1950621caefSChris Lattner // this is the case, don't execute any of the global ctors, __main will do 1960621caefSChris Lattner // it. 1970621caefSChris Lattner if (!GV || GV->isExternal() || GV->hasInternalLinkage()) continue; 198faae50b6SChris Lattner 1990621caefSChris Lattner // Should be an array of '{ int, void ()* }' structs. The first value is 2000621caefSChris Lattner // the init priority, which we ignore. 201faae50b6SChris Lattner ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 2020621caefSChris Lattner if (!InitList) continue; 203faae50b6SChris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 2040621caefSChris Lattner if (ConstantStruct *CS = 2050621caefSChris Lattner dyn_cast<ConstantStruct>(InitList->getOperand(i))) { 2060621caefSChris Lattner if (CS->getNumOperands() != 2) break; // Not array of 2-element structs. 207faae50b6SChris Lattner 208faae50b6SChris Lattner Constant *FP = CS->getOperand(1); 209faae50b6SChris Lattner if (FP->isNullValue()) 2100621caefSChris Lattner break; // Found a null terminator, exit. 211faae50b6SChris Lattner 212faae50b6SChris Lattner if (ConstantExpr *CE = dyn_cast<ConstantExpr>(FP)) 2136c38f0bbSReid Spencer if (CE->isCast()) 214faae50b6SChris Lattner FP = CE->getOperand(0); 215faae50b6SChris Lattner if (Function *F = dyn_cast<Function>(FP)) { 216faae50b6SChris Lattner // Execute the ctor/dtor function! 217faae50b6SChris Lattner runFunction(F, std::vector<GenericValue>()); 218faae50b6SChris Lattner } 219faae50b6SChris Lattner } 220faae50b6SChris Lattner } 2210621caefSChris Lattner } 222faae50b6SChris Lattner 2235a0d4829SChris Lattner /// runFunctionAsMain - This is a helper function which wraps runFunction to 2245a0d4829SChris Lattner /// handle the common task of starting up main with the specified argc, argv, 2255a0d4829SChris Lattner /// and envp parameters. 2265a0d4829SChris Lattner int ExecutionEngine::runFunctionAsMain(Function *Fn, 2275a0d4829SChris Lattner const std::vector<std::string> &argv, 2285a0d4829SChris Lattner const char * const * envp) { 2295a0d4829SChris Lattner std::vector<GenericValue> GVArgs; 2305a0d4829SChris Lattner GenericValue GVArgc; 2310d54e78aSReid Spencer GVArgc.Int32Val = argv.size(); 232b1cad0b3SChris Lattner unsigned NumArgs = Fn->getFunctionType()->getNumParams(); 233b1cad0b3SChris Lattner if (NumArgs) { 2345a0d4829SChris Lattner GVArgs.push_back(GVArgc); // Arg #0 = argc. 235b1cad0b3SChris Lattner if (NumArgs > 1) { 2365a0d4829SChris Lattner GVArgs.push_back(PTOGV(CreateArgv(this, argv))); // Arg #1 = argv. 237b1cad0b3SChris Lattner assert(((char **)GVTOP(GVArgs[1]))[0] && 238b1cad0b3SChris Lattner "argv[0] was null after CreateArgv"); 239b1cad0b3SChris Lattner if (NumArgs > 2) { 2405a0d4829SChris Lattner std::vector<std::string> EnvVars; 2415a0d4829SChris Lattner for (unsigned i = 0; envp[i]; ++i) 2425a0d4829SChris Lattner EnvVars.push_back(envp[i]); 2435a0d4829SChris Lattner GVArgs.push_back(PTOGV(CreateArgv(this, EnvVars))); // Arg #2 = envp. 244b1cad0b3SChris Lattner } 245b1cad0b3SChris Lattner } 246b1cad0b3SChris Lattner } 2470d54e78aSReid Spencer return runFunction(Fn, GVArgs).Int32Val; 2485a0d4829SChris Lattner } 2495a0d4829SChris Lattner 250260b0c88SMisha Brukman /// If possible, create a JIT, unless the caller specifically requests an 251260b0c88SMisha Brukman /// Interpreter or there's an error. If even an Interpreter cannot be created, 252260b0c88SMisha Brukman /// NULL is returned. 253857c21b4SMisha Brukman /// 2542f1e2002SMisha Brukman ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP, 2550b2de9f2SChris Lattner bool ForceInterpreter) { 2564bd3bd5bSBrian Gaeke ExecutionEngine *EE = 0; 2574bd3bd5bSBrian Gaeke 258c8c6c03dSChris Lattner // Unless the interpreter was explicitly selected, try making a JIT. 2592d52c1b8SChris Lattner if (!ForceInterpreter && JITCtor) 2600b2de9f2SChris Lattner EE = JITCtor(MP); 2614bd3bd5bSBrian Gaeke 2624bd3bd5bSBrian Gaeke // If we can't make a JIT, make an interpreter instead. 2632d52c1b8SChris Lattner if (EE == 0 && InterpCtor) 2640b2de9f2SChris Lattner EE = InterpCtor(MP); 265c8c6c03dSChris Lattner 2660b2de9f2SChris Lattner if (EE) { 26770e37278SReid Spencer // Make sure we can resolve symbols in the program as well. The zero arg 26870e37278SReid Spencer // to the function tells DynamicLibrary to load the program, not a library. 26963539389SChris Lattner try { 27070e37278SReid Spencer sys::DynamicLibrary::LoadLibraryPermanently(0); 27163539389SChris Lattner } catch (...) { 27263539389SChris Lattner } 2730b2de9f2SChris Lattner } 27470e37278SReid Spencer 2754bd3bd5bSBrian Gaeke return EE; 2764bd3bd5bSBrian Gaeke } 2774bd3bd5bSBrian Gaeke 278857c21b4SMisha Brukman /// getPointerToGlobal - This returns the address of the specified global 279857c21b4SMisha Brukman /// value. This may involve code generation if it's a function. 280857c21b4SMisha Brukman /// 281996fe010SChris Lattner void *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) { 2821678e859SBrian Gaeke if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV))) 283996fe010SChris Lattner return getPointerToFunction(F); 284996fe010SChris Lattner 28579876f52SReid Spencer MutexGuard locked(lock); 28669e84901SJeff Cohen void *p = state.getGlobalAddressMap(locked)[GV]; 28769e84901SJeff Cohen if (p) 28869e84901SJeff Cohen return p; 28969e84901SJeff Cohen 29069e84901SJeff Cohen // Global variable might have been added since interpreter started. 29169e84901SJeff Cohen if (GlobalVariable *GVar = 29269e84901SJeff Cohen const_cast<GlobalVariable *>(dyn_cast<GlobalVariable>(GV))) 29369e84901SJeff Cohen EmitGlobalVariable(GVar); 29469e84901SJeff Cohen else 29569e84901SJeff Cohen assert("Global hasn't had an address allocated yet!"); 29679876f52SReid Spencer return state.getGlobalAddressMap(locked)[GV]; 297996fe010SChris Lattner } 298996fe010SChris Lattner 2997a9c62baSReid Spencer /// This macro is used to handle a variety of situations involing integer 3007a9c62baSReid Spencer /// values where the action should be done to one of the GenericValue members. 3017a9c62baSReid Spencer /// THEINTTY is a const Type * for the integer type. ACTION1 comes before 3027a9c62baSReid Spencer /// the GenericValue, ACTION2 comes after. 3037a9c62baSReid Spencer #define DO_FOR_INTEGER(THEINTTY, ACTION) \ 3047a9c62baSReid Spencer { \ 3057a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(THEINTTY)->getBitWidth(); \ 3067a9c62baSReid Spencer if (BitWidth == 1) {\ 3077a9c62baSReid Spencer ACTION(Int1Val); \ 3087a9c62baSReid Spencer } else if (BitWidth <= 8) {\ 3097a9c62baSReid Spencer ACTION(Int8Val); \ 3107a9c62baSReid Spencer } else if (BitWidth <= 16) {\ 3117a9c62baSReid Spencer ACTION(Int16Val); \ 3127a9c62baSReid Spencer } else if (BitWidth <= 32) { \ 3137a9c62baSReid Spencer ACTION(Int32Val); \ 3147a9c62baSReid Spencer } else if (BitWidth <= 64) { \ 3157a9c62baSReid Spencer ACTION(Int64Val); \ 3167a9c62baSReid Spencer } else {\ 3177a9c62baSReid Spencer assert(0 && "Not implemented: integer types > 64 bits"); \ 3187a9c62baSReid Spencer } \ 3197a9c62baSReid Spencer } 3207a9c62baSReid Spencer 3216c38f0bbSReid Spencer /// This function converts a Constant* into a GenericValue. The interesting 3226c38f0bbSReid Spencer /// part is if C is a ConstantExpr. 3236c38f0bbSReid Spencer /// @brief Get a GenericValue for a Constnat* 324996fe010SChris Lattner GenericValue ExecutionEngine::getConstantValue(const Constant *C) { 3256c38f0bbSReid Spencer // Declare the result as garbage. 326996fe010SChris Lattner GenericValue Result; 3276c38f0bbSReid Spencer 3286c38f0bbSReid Spencer // If its undefined, return the garbage. 329d7a7a3f4SChris Lattner if (isa<UndefValue>(C)) return Result; 3309de0d14dSChris Lattner 3316c38f0bbSReid Spencer // If the value is a ConstantExpr 3326c38f0bbSReid Spencer if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 3339de0d14dSChris Lattner switch (CE->getOpcode()) { 3349de0d14dSChris Lattner case Instruction::GetElementPtr: { 3356c38f0bbSReid Spencer // Compute the index 33668cbcc3eSChris Lattner Result = getConstantValue(CE->getOperand(0)); 3379de0d14dSChris Lattner std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end()); 3389de0d14dSChris Lattner uint64_t Offset = 3399de0d14dSChris Lattner TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes); 3409de0d14dSChris Lattner 34120a631fdSOwen Anderson if (getTargetData()->getPointerSize() == 4) 3420d54e78aSReid Spencer Result.Int32Val += Offset; 343a551033eSChris Lattner else 3440d54e78aSReid Spencer Result.Int64Val += Offset; 3459de0d14dSChris Lattner return Result; 3469de0d14dSChris Lattner } 3476c38f0bbSReid Spencer case Instruction::Trunc: 3486c38f0bbSReid Spencer case Instruction::ZExt: 3496c38f0bbSReid Spencer case Instruction::SExt: 3506c38f0bbSReid Spencer case Instruction::FPTrunc: 3516c38f0bbSReid Spencer case Instruction::FPExt: 3526c38f0bbSReid Spencer case Instruction::UIToFP: 3536c38f0bbSReid Spencer case Instruction::SIToFP: 3546c38f0bbSReid Spencer case Instruction::FPToUI: 3556c38f0bbSReid Spencer case Instruction::FPToSI: 3566c38f0bbSReid Spencer break; 3576c38f0bbSReid Spencer case Instruction::PtrToInt: { 35868cbcc3eSChris Lattner Constant *Op = CE->getOperand(0); 3595def7a57SChris Lattner GenericValue GV = getConstantValue(Op); 3606c38f0bbSReid Spencer return GV; 3616c38f0bbSReid Spencer } 3626c38f0bbSReid Spencer case Instruction::BitCast: { 3636c38f0bbSReid Spencer // Bit casts are no-ops but we can only return the GV of the operand if 3646c38f0bbSReid Spencer // they are the same basic type (pointer->pointer, packed->packed, etc.) 3656c38f0bbSReid Spencer Constant *Op = CE->getOperand(0); 3666c38f0bbSReid Spencer GenericValue GV = getConstantValue(Op); 3676b727599SChris Lattner if (Op->getType()->getTypeID() == C->getType()->getTypeID()) 3685def7a57SChris Lattner return GV; 3696c38f0bbSReid Spencer break; 3706c38f0bbSReid Spencer } 3716c38f0bbSReid Spencer case Instruction::IntToPtr: { 3726c38f0bbSReid Spencer // IntToPtr casts are just so special. Cast to intptr_t first. 3736c38f0bbSReid Spencer Constant *Op = CE->getOperand(0); 3746c38f0bbSReid Spencer GenericValue GV = getConstantValue(Op); 3757a9c62baSReid Spencer #define INT_TO_PTR_ACTION(FIELD) \ 3767a9c62baSReid Spencer return PTOGV((void*)(uintptr_t)GV.FIELD) 3777a9c62baSReid Spencer DO_FOR_INTEGER(Op->getType(), INT_TO_PTR_ACTION) 3787a9c62baSReid Spencer #undef INT_TO_PTR_ACTION 37968cbcc3eSChris Lattner break; 38068cbcc3eSChris Lattner } 38168cbcc3eSChris Lattner case Instruction::Add: 382c4e6bb5fSChris Lattner switch (CE->getOperand(0)->getType()->getTypeID()) { 383c4e6bb5fSChris Lattner default: assert(0 && "Bad add type!"); abort(); 3847a9c62baSReid Spencer case Type::IntegerTyID: 3857a9c62baSReid Spencer #define ADD_ACTION(FIELD) \ 3867a9c62baSReid Spencer Result.FIELD = getConstantValue(CE->getOperand(0)).FIELD + \ 3877a9c62baSReid Spencer getConstantValue(CE->getOperand(1)).FIELD; 3887a9c62baSReid Spencer DO_FOR_INTEGER(CE->getOperand(0)->getType(),ADD_ACTION); 3897a9c62baSReid Spencer #undef ADD_ACTION 390c4e6bb5fSChris Lattner break; 391c4e6bb5fSChris Lattner case Type::FloatTyID: 392c4e6bb5fSChris Lattner Result.FloatVal = getConstantValue(CE->getOperand(0)).FloatVal + 393c4e6bb5fSChris Lattner getConstantValue(CE->getOperand(1)).FloatVal; 394c4e6bb5fSChris Lattner break; 395c4e6bb5fSChris Lattner case Type::DoubleTyID: 396c4e6bb5fSChris Lattner Result.DoubleVal = getConstantValue(CE->getOperand(0)).DoubleVal + 397c4e6bb5fSChris Lattner getConstantValue(CE->getOperand(1)).DoubleVal; 398c4e6bb5fSChris Lattner break; 399c4e6bb5fSChris Lattner } 40068cbcc3eSChris Lattner return Result; 4019de0d14dSChris Lattner default: 40268cbcc3eSChris Lattner break; 40368cbcc3eSChris Lattner } 404f3baad3eSBill Wendling cerr << "ConstantExpr not handled as global var init: " << *CE << "\n"; 4059de0d14dSChris Lattner abort(); 4069de0d14dSChris Lattner } 407996fe010SChris Lattner 4086b727599SChris Lattner switch (C->getType()->getTypeID()) { 409e0fc4dfcSReid Spencer #define GET_CONST_VAL(TY, CTY, CLASS, GETMETH) \ 410e0fc4dfcSReid Spencer case Type::TY##TyID: Result.TY##Val = (CTY)cast<CLASS>(C)->GETMETH(); break 411e0fc4dfcSReid Spencer GET_CONST_VAL(Float , float , ConstantFP, getValue); 412e0fc4dfcSReid Spencer GET_CONST_VAL(Double, double , ConstantFP, getValue); 413996fe010SChris Lattner #undef GET_CONST_VAL 4147a9c62baSReid Spencer case Type::IntegerTyID: { 4157a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(C->getType())->getBitWidth(); 4167a9c62baSReid Spencer if (BitWidth == 1) 4177a9c62baSReid Spencer Result.Int1Val = (bool)cast<ConstantInt>(C)->getZExtValue(); 4187a9c62baSReid Spencer else if (BitWidth <= 8) 4197a9c62baSReid Spencer Result.Int8Val = (uint8_t )cast<ConstantInt>(C)->getZExtValue(); 4207a9c62baSReid Spencer else if (BitWidth <= 16) 4217a9c62baSReid Spencer Result.Int16Val = (uint16_t )cast<ConstantInt>(C)->getZExtValue(); 4227a9c62baSReid Spencer else if (BitWidth <= 32) 4237a9c62baSReid Spencer Result.Int32Val = (uint32_t )cast<ConstantInt>(C)->getZExtValue(); 4247a9c62baSReid Spencer else if (BitWidth <= 64) 4257a9c62baSReid Spencer Result.Int64Val = (uint64_t )cast<ConstantInt>(C)->getZExtValue(); 4267a9c62baSReid Spencer else 4277a9c62baSReid Spencer assert("Integers with > 64-bits not implemented"); 4287a9c62baSReid Spencer break; 4297a9c62baSReid Spencer } 4307a9c62baSReid Spencer 431996fe010SChris Lattner case Type::PointerTyID: 4326a0fd73bSReid Spencer if (isa<ConstantPointerNull>(C)) 433996fe010SChris Lattner Result.PointerVal = 0; 4346a0fd73bSReid Spencer else if (const Function *F = dyn_cast<Function>(C)) 4356a0fd73bSReid Spencer Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F))); 4366a0fd73bSReid Spencer else if (const GlobalVariable* GV = dyn_cast<GlobalVariable>(C)) 4376a0fd73bSReid Spencer Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV))); 438e6492f10SChris Lattner else 439996fe010SChris Lattner assert(0 && "Unknown constant pointer type!"); 440996fe010SChris Lattner break; 441996fe010SChris Lattner default: 442f3baad3eSBill Wendling cerr << "ERROR: Constant unimp for type: " << *C->getType() << "\n"; 4439de0d14dSChris Lattner abort(); 444996fe010SChris Lattner } 445996fe010SChris Lattner return Result; 446996fe010SChris Lattner } 447996fe010SChris Lattner 4484ca2ea5bSNate Begeman /// StoreValueToMemory - Stores the data in Val of type Ty at address Ptr. Ptr 4494ca2ea5bSNate Begeman /// is the address of the memory at which to store Val, cast to GenericValue *. 4504ca2ea5bSNate Begeman /// It is not a pointer to a GenericValue containing the address at which to 4514ca2ea5bSNate Begeman /// store Val. 452857c21b4SMisha Brukman /// 453996fe010SChris Lattner void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr, 454996fe010SChris Lattner const Type *Ty) { 45520a631fdSOwen Anderson if (getTargetData()->isLittleEndian()) { 4566b727599SChris Lattner switch (Ty->getTypeID()) { 4577a9c62baSReid Spencer case Type::IntegerTyID: { 4587a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 459*01f7e06dSReid Spencer uint64_t BitMask = (1ull << BitWidth) - 1; 460*01f7e06dSReid Spencer GenericValue TmpVal = Val; 4617a9c62baSReid Spencer if (BitWidth <= 8) 462*01f7e06dSReid Spencer Ptr->Untyped[0] = Val.Int8Val & BitMask; 4637a9c62baSReid Spencer else if (BitWidth <= 16) { 464*01f7e06dSReid Spencer TmpVal.Int16Val &= BitMask; 465*01f7e06dSReid Spencer Ptr->Untyped[0] = TmpVal.Int16Val & 255; 466*01f7e06dSReid Spencer Ptr->Untyped[1] = (TmpVal.Int16Val >> 8) & 255; 4677a9c62baSReid Spencer } else if (BitWidth <= 32) { 468*01f7e06dSReid Spencer TmpVal.Int32Val &= BitMask; 469*01f7e06dSReid Spencer Ptr->Untyped[0] = TmpVal.Int32Val & 255; 470*01f7e06dSReid Spencer Ptr->Untyped[1] = (TmpVal.Int32Val >> 8) & 255; 471*01f7e06dSReid Spencer Ptr->Untyped[2] = (TmpVal.Int32Val >> 16) & 255; 472*01f7e06dSReid Spencer Ptr->Untyped[3] = (TmpVal.Int32Val >> 24) & 255; 4737a9c62baSReid Spencer } else if (BitWidth <= 64) { 474*01f7e06dSReid Spencer TmpVal.Int64Val &= BitMask; 475*01f7e06dSReid Spencer Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val ); 476*01f7e06dSReid Spencer Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 8); 477*01f7e06dSReid Spencer Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 16); 478*01f7e06dSReid Spencer Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 24); 479*01f7e06dSReid Spencer Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 32); 480*01f7e06dSReid Spencer Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 40); 481*01f7e06dSReid Spencer Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 48); 482*01f7e06dSReid Spencer Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val >> 56); 4837a9c62baSReid Spencer } else 4847a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 485996fe010SChris Lattner break; 4867a9c62baSReid Spencer } 487b348952dSChris Lattner Store4BytesLittleEndian: 488996fe010SChris Lattner case Type::FloatTyID: 4897a9c62baSReid Spencer Ptr->Untyped[0] = Val.Int32Val & 255; 4900d54e78aSReid Spencer Ptr->Untyped[1] = (Val.Int32Val >> 8) & 255; 4910d54e78aSReid Spencer Ptr->Untyped[2] = (Val.Int32Val >> 16) & 255; 4920d54e78aSReid Spencer Ptr->Untyped[3] = (Val.Int32Val >> 24) & 255; 493996fe010SChris Lattner break; 4947a9c62baSReid Spencer case Type::PointerTyID: 4957a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 496b348952dSChris Lattner goto Store4BytesLittleEndian; 4977a9c62baSReid Spencer /* FALL THROUGH */ 498996fe010SChris Lattner case Type::DoubleTyID: 4990d54e78aSReid Spencer Ptr->Untyped[0] = (unsigned char)(Val.Int64Val ); 5000d54e78aSReid Spencer Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >> 8); 5010d54e78aSReid Spencer Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 16); 5020d54e78aSReid Spencer Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 24); 5030d54e78aSReid Spencer Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 32); 5040d54e78aSReid Spencer Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 40); 5050d54e78aSReid Spencer Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >> 48); 5060d54e78aSReid Spencer Ptr->Untyped[7] = (unsigned char)(Val.Int64Val >> 56); 507996fe010SChris Lattner break; 508996fe010SChris Lattner default: 509f3baad3eSBill Wendling cerr << "Cannot store value of type " << *Ty << "!\n"; 510996fe010SChris Lattner } 511996fe010SChris Lattner } else { 5126b727599SChris Lattner switch (Ty->getTypeID()) { 5137a9c62baSReid Spencer case Type::IntegerTyID: { 5147a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 515*01f7e06dSReid Spencer uint64_t BitMask = (1ull << BitWidth) - 1; 516*01f7e06dSReid Spencer GenericValue TmpVal = Val; 5177a9c62baSReid Spencer if (BitWidth <= 8) 518*01f7e06dSReid Spencer Ptr->Untyped[0] = Val.Int8Val & BitMask; 5197a9c62baSReid Spencer else if (BitWidth <= 16) { 520*01f7e06dSReid Spencer TmpVal.Int16Val &= BitMask; 521*01f7e06dSReid Spencer Ptr->Untyped[1] = TmpVal.Int16Val & 255; 522*01f7e06dSReid Spencer Ptr->Untyped[0] = (TmpVal.Int16Val >> 8) & 255; 5237a9c62baSReid Spencer } else if (BitWidth <= 32) { 524*01f7e06dSReid Spencer TmpVal.Int32Val &= BitMask; 525*01f7e06dSReid Spencer Ptr->Untyped[3] = TmpVal.Int32Val & 255; 526*01f7e06dSReid Spencer Ptr->Untyped[2] = (TmpVal.Int32Val >> 8) & 255; 527*01f7e06dSReid Spencer Ptr->Untyped[1] = (TmpVal.Int32Val >> 16) & 255; 528*01f7e06dSReid Spencer Ptr->Untyped[0] = (TmpVal.Int32Val >> 24) & 255; 5297a9c62baSReid Spencer } else if (BitWidth <= 64) { 530*01f7e06dSReid Spencer TmpVal.Int64Val &= BitMask; 531*01f7e06dSReid Spencer Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val ); 532*01f7e06dSReid Spencer Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 8); 533*01f7e06dSReid Spencer Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 16); 534*01f7e06dSReid Spencer Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 24); 535*01f7e06dSReid Spencer Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 32); 536*01f7e06dSReid Spencer Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 40); 537*01f7e06dSReid Spencer Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 48); 538*01f7e06dSReid Spencer Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val >> 56); 5397a9c62baSReid Spencer } else 5407a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 541996fe010SChris Lattner break; 5427a9c62baSReid Spencer } 543b348952dSChris Lattner Store4BytesBigEndian: 544996fe010SChris Lattner case Type::FloatTyID: 5457a9c62baSReid Spencer Ptr->Untyped[3] = Val.Int32Val & 255; 5460d54e78aSReid Spencer Ptr->Untyped[2] = (Val.Int32Val >> 8) & 255; 5470d54e78aSReid Spencer Ptr->Untyped[1] = (Val.Int32Val >> 16) & 255; 5480d54e78aSReid Spencer Ptr->Untyped[0] = (Val.Int32Val >> 24) & 255; 549996fe010SChris Lattner break; 5507a9c62baSReid Spencer case Type::PointerTyID: 5517a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 552b348952dSChris Lattner goto Store4BytesBigEndian; 5537a9c62baSReid Spencer /* FALL THROUGH */ 554996fe010SChris Lattner case Type::DoubleTyID: 5550d54e78aSReid Spencer Ptr->Untyped[7] = (unsigned char)(Val.Int64Val ); 5560d54e78aSReid Spencer Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >> 8); 5570d54e78aSReid Spencer Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 16); 5580d54e78aSReid Spencer Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 24); 5590d54e78aSReid Spencer Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 32); 5600d54e78aSReid Spencer Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 40); 5610d54e78aSReid Spencer Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >> 48); 5620d54e78aSReid Spencer Ptr->Untyped[0] = (unsigned char)(Val.Int64Val >> 56); 563996fe010SChris Lattner break; 564996fe010SChris Lattner default: 565f3baad3eSBill Wendling cerr << "Cannot store value of type " << *Ty << "!\n"; 566996fe010SChris Lattner } 567996fe010SChris Lattner } 568996fe010SChris Lattner } 569996fe010SChris Lattner 570857c21b4SMisha Brukman /// FIXME: document 571857c21b4SMisha Brukman /// 5727f389e8cSChris Lattner GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr, 5737f389e8cSChris Lattner const Type *Ty) { 5747f389e8cSChris Lattner GenericValue Result; 57520a631fdSOwen Anderson if (getTargetData()->isLittleEndian()) { 5766b727599SChris Lattner switch (Ty->getTypeID()) { 5777a9c62baSReid Spencer case Type::IntegerTyID: { 5787a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 5797a9c62baSReid Spencer if (BitWidth <= 8) 5807a9c62baSReid Spencer Result.Int8Val = Ptr->Untyped[0]; 5817a9c62baSReid Spencer else if (BitWidth <= 16) { 5827a9c62baSReid Spencer Result.Int16Val = (unsigned)Ptr->Untyped[0] | 5837f389e8cSChris Lattner ((unsigned)Ptr->Untyped[1] << 8); 5847a9c62baSReid Spencer } else if (BitWidth <= 32) { 5857a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[0] | 5867a9c62baSReid Spencer ((unsigned)Ptr->Untyped[1] << 8) | 5877a9c62baSReid Spencer ((unsigned)Ptr->Untyped[2] << 16) | 5887a9c62baSReid Spencer ((unsigned)Ptr->Untyped[3] << 24); 5897a9c62baSReid Spencer } else if (BitWidth <= 64) { 5907a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[0] | 5917a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[1] << 8) | 5927a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[2] << 16) | 5937a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[3] << 24) | 5947a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[4] << 32) | 5957a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[5] << 40) | 5967a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[6] << 48) | 5977a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[7] << 56); 5987a9c62baSReid Spencer } else 5997a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 6007f389e8cSChris Lattner break; 6017a9c62baSReid Spencer } 6027f389e8cSChris Lattner Load4BytesLittleEndian: 6037f389e8cSChris Lattner case Type::FloatTyID: 6047a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[0] | 6057f389e8cSChris Lattner ((unsigned)Ptr->Untyped[1] << 8) | 6067f389e8cSChris Lattner ((unsigned)Ptr->Untyped[2] << 16) | 6077f389e8cSChris Lattner ((unsigned)Ptr->Untyped[3] << 24); 6087f389e8cSChris Lattner break; 6097a9c62baSReid Spencer case Type::PointerTyID: 6107a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 6117f389e8cSChris Lattner goto Load4BytesLittleEndian; 6127a9c62baSReid Spencer /* FALL THROUGH */ 6137f389e8cSChris Lattner case Type::DoubleTyID: 6147a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[0] | 6157f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[1] << 8) | 6167f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[2] << 16) | 6177f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[3] << 24) | 6187f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[4] << 32) | 6197f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[5] << 40) | 6207f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[6] << 48) | 6217f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[7] << 56); 6227f389e8cSChris Lattner break; 6237f389e8cSChris Lattner default: 624f3baad3eSBill Wendling cerr << "Cannot load value of type " << *Ty << "!\n"; 6257f389e8cSChris Lattner abort(); 6267f389e8cSChris Lattner } 6277f389e8cSChris Lattner } else { 6286b727599SChris Lattner switch (Ty->getTypeID()) { 6297a9c62baSReid Spencer case Type::IntegerTyID: { 6307a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 6317a9c62baSReid Spencer if (BitWidth <= 8) 6327a9c62baSReid Spencer Result.Int8Val = Ptr->Untyped[0]; 6337a9c62baSReid Spencer else if (BitWidth <= 16) { 6347a9c62baSReid Spencer Result.Int16Val = (unsigned)Ptr->Untyped[1] | 6357f389e8cSChris Lattner ((unsigned)Ptr->Untyped[0] << 8); 6367a9c62baSReid Spencer } else if (BitWidth <= 32) { 6377a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[3] | 6387a9c62baSReid Spencer ((unsigned)Ptr->Untyped[2] << 8) | 6397a9c62baSReid Spencer ((unsigned)Ptr->Untyped[1] << 16) | 6407a9c62baSReid Spencer ((unsigned)Ptr->Untyped[0] << 24); 6417a9c62baSReid Spencer } else if (BitWidth <= 64) { 6427a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[7] | 6437a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[6] << 8) | 6447a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[5] << 16) | 6457a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[4] << 24) | 6467a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[3] << 32) | 6477a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[2] << 40) | 6487a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[1] << 48) | 6497a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[0] << 56); 6507a9c62baSReid Spencer } else 6517a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 6527f389e8cSChris Lattner break; 6537a9c62baSReid Spencer } 6547f389e8cSChris Lattner Load4BytesBigEndian: 6557f389e8cSChris Lattner case Type::FloatTyID: 6567a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[3] | 6577f389e8cSChris Lattner ((unsigned)Ptr->Untyped[2] << 8) | 6587f389e8cSChris Lattner ((unsigned)Ptr->Untyped[1] << 16) | 6597f389e8cSChris Lattner ((unsigned)Ptr->Untyped[0] << 24); 6607f389e8cSChris Lattner break; 6617a9c62baSReid Spencer case Type::PointerTyID: 6627a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 6637f389e8cSChris Lattner goto Load4BytesBigEndian; 6647a9c62baSReid Spencer /* FALL THROUGH */ 6657f389e8cSChris Lattner case Type::DoubleTyID: 6667a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[7] | 6677f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[6] << 8) | 6687f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[5] << 16) | 6697f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[4] << 24) | 6707f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[3] << 32) | 6717f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[2] << 40) | 6727f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[1] << 48) | 6737f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[0] << 56); 6747f389e8cSChris Lattner break; 6757f389e8cSChris Lattner default: 676f3baad3eSBill Wendling cerr << "Cannot load value of type " << *Ty << "!\n"; 6777f389e8cSChris Lattner abort(); 6787f389e8cSChris Lattner } 6797f389e8cSChris Lattner } 6807f389e8cSChris Lattner return Result; 6817f389e8cSChris Lattner } 6827f389e8cSChris Lattner 683996fe010SChris Lattner // InitializeMemory - Recursive function to apply a Constant value into the 684996fe010SChris Lattner // specified memory location... 685996fe010SChris Lattner // 686996fe010SChris Lattner void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { 68761753bf8SChris Lattner if (isa<UndefValue>(Init)) { 68861753bf8SChris Lattner return; 68969d62138SRobert Bocchino } else if (const ConstantPacked *CP = dyn_cast<ConstantPacked>(Init)) { 69069d62138SRobert Bocchino unsigned ElementSize = 69120a631fdSOwen Anderson getTargetData()->getTypeSize(CP->getType()->getElementType()); 69269d62138SRobert Bocchino for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) 69369d62138SRobert Bocchino InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize); 69469d62138SRobert Bocchino return; 69561753bf8SChris Lattner } else if (Init->getType()->isFirstClassType()) { 696996fe010SChris Lattner GenericValue Val = getConstantValue(Init); 697996fe010SChris Lattner StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); 698996fe010SChris Lattner return; 699834b1272SChris Lattner } else if (isa<ConstantAggregateZero>(Init)) { 70020a631fdSOwen Anderson memset(Addr, 0, (size_t)getTargetData()->getTypeSize(Init->getType())); 701834b1272SChris Lattner return; 702996fe010SChris Lattner } 703996fe010SChris Lattner 7046b727599SChris Lattner switch (Init->getType()->getTypeID()) { 705996fe010SChris Lattner case Type::ArrayTyID: { 706996fe010SChris Lattner const ConstantArray *CPA = cast<ConstantArray>(Init); 707996fe010SChris Lattner unsigned ElementSize = 70820a631fdSOwen Anderson getTargetData()->getTypeSize(CPA->getType()->getElementType()); 70983243725SAlkis Evlogimenos for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i) 71083243725SAlkis Evlogimenos InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize); 711996fe010SChris Lattner return; 712996fe010SChris Lattner } 713996fe010SChris Lattner 714996fe010SChris Lattner case Type::StructTyID: { 715996fe010SChris Lattner const ConstantStruct *CPS = cast<ConstantStruct>(Init); 716996fe010SChris Lattner const StructLayout *SL = 71720a631fdSOwen Anderson getTargetData()->getStructLayout(cast<StructType>(CPS->getType())); 71883243725SAlkis Evlogimenos for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i) 71983243725SAlkis Evlogimenos InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->MemberOffsets[i]); 720996fe010SChris Lattner return; 721996fe010SChris Lattner } 722996fe010SChris Lattner 723996fe010SChris Lattner default: 724f3baad3eSBill Wendling cerr << "Bad Type: " << *Init->getType() << "\n"; 725996fe010SChris Lattner assert(0 && "Unknown constant type to initialize memory with!"); 726996fe010SChris Lattner } 727996fe010SChris Lattner } 728996fe010SChris Lattner 729996fe010SChris Lattner /// EmitGlobals - Emit all of the global variables to memory, storing their 730996fe010SChris Lattner /// addresses into GlobalAddress. This must make sure to copy the contents of 731996fe010SChris Lattner /// their initializers into the memory. 732996fe010SChris Lattner /// 733996fe010SChris Lattner void ExecutionEngine::emitGlobals() { 73420a631fdSOwen Anderson const TargetData *TD = getTargetData(); 735996fe010SChris Lattner 736996fe010SChris Lattner // Loop over all of the global variables in the program, allocating the memory 7370621caefSChris Lattner // to hold them. If there is more than one module, do a prepass over globals 7380621caefSChris Lattner // to figure out how the different modules should link together. 7390621caefSChris Lattner // 7400621caefSChris Lattner std::map<std::pair<std::string, const Type*>, 7410621caefSChris Lattner const GlobalValue*> LinkedGlobalsMap; 7420621caefSChris Lattner 7430621caefSChris Lattner if (Modules.size() != 1) { 7440621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 7450621caefSChris Lattner Module &M = *Modules[m]->getModule(); 7460621caefSChris Lattner for (Module::const_global_iterator I = M.global_begin(), 7470621caefSChris Lattner E = M.global_end(); I != E; ++I) { 7480621caefSChris Lattner const GlobalValue *GV = I; 7490621caefSChris Lattner if (GV->hasInternalLinkage() || GV->isExternal() || 7500621caefSChris Lattner GV->hasAppendingLinkage() || !GV->hasName()) 7510621caefSChris Lattner continue;// Ignore external globals and globals with internal linkage. 7520621caefSChris Lattner 7530621caefSChris Lattner const GlobalValue *&GVEntry = 7540621caefSChris Lattner LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())]; 7550621caefSChris Lattner 7560621caefSChris Lattner // If this is the first time we've seen this global, it is the canonical 7570621caefSChris Lattner // version. 7580621caefSChris Lattner if (!GVEntry) { 7590621caefSChris Lattner GVEntry = GV; 7600621caefSChris Lattner continue; 7610621caefSChris Lattner } 7620621caefSChris Lattner 7630621caefSChris Lattner // If the existing global is strong, never replace it. 764d61d39ecSAnton Korobeynikov if (GVEntry->hasExternalLinkage() || 765d61d39ecSAnton Korobeynikov GVEntry->hasDLLImportLinkage() || 766d61d39ecSAnton Korobeynikov GVEntry->hasDLLExportLinkage()) 7670621caefSChris Lattner continue; 7680621caefSChris Lattner 7690621caefSChris Lattner // Otherwise, we know it's linkonce/weak, replace it if this is a strong 7700621caefSChris Lattner // symbol. 77112c94949SAnton Korobeynikov if (GV->hasExternalLinkage() || GVEntry->hasExternalWeakLinkage()) 7720621caefSChris Lattner GVEntry = GV; 7730621caefSChris Lattner } 7740621caefSChris Lattner } 7750621caefSChris Lattner } 7760621caefSChris Lattner 7770621caefSChris Lattner std::vector<const GlobalValue*> NonCanonicalGlobals; 7780621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 7790621caefSChris Lattner Module &M = *Modules[m]->getModule(); 7808ffb6611SChris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 7810621caefSChris Lattner I != E; ++I) { 7820621caefSChris Lattner // In the multi-module case, see what this global maps to. 7830621caefSChris Lattner if (!LinkedGlobalsMap.empty()) { 7840621caefSChris Lattner if (const GlobalValue *GVEntry = 7850621caefSChris Lattner LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())]) { 7860621caefSChris Lattner // If something else is the canonical global, ignore this one. 7870621caefSChris Lattner if (GVEntry != &*I) { 7880621caefSChris Lattner NonCanonicalGlobals.push_back(I); 7890621caefSChris Lattner continue; 7900621caefSChris Lattner } 7910621caefSChris Lattner } 7920621caefSChris Lattner } 7930621caefSChris Lattner 794996fe010SChris Lattner if (!I->isExternal()) { 7950621caefSChris Lattner // Get the type of the global. 796996fe010SChris Lattner const Type *Ty = I->getType()->getElementType(); 797996fe010SChris Lattner 798996fe010SChris Lattner // Allocate some memory for it! 79920a631fdSOwen Anderson unsigned Size = TD->getTypeSize(Ty); 8006bbe3eceSChris Lattner addGlobalMapping(I, new char[Size]); 801996fe010SChris Lattner } else { 802e8bbcfc2SBrian Gaeke // External variable reference. Try to use the dynamic loader to 803e8bbcfc2SBrian Gaeke // get a pointer to it. 8040621caefSChris Lattner if (void *SymAddr = 8050621caefSChris Lattner sys::DynamicLibrary::SearchForAddressOfSymbol(I->getName().c_str())) 806748e8579SChris Lattner addGlobalMapping(I, SymAddr); 8079de0d14dSChris Lattner else { 808f3baad3eSBill Wendling cerr << "Could not resolve external global address: " 8099de0d14dSChris Lattner << I->getName() << "\n"; 8109de0d14dSChris Lattner abort(); 8119de0d14dSChris Lattner } 812996fe010SChris Lattner } 8130621caefSChris Lattner } 8140621caefSChris Lattner 8150621caefSChris Lattner // If there are multiple modules, map the non-canonical globals to their 8160621caefSChris Lattner // canonical location. 8170621caefSChris Lattner if (!NonCanonicalGlobals.empty()) { 8180621caefSChris Lattner for (unsigned i = 0, e = NonCanonicalGlobals.size(); i != e; ++i) { 8190621caefSChris Lattner const GlobalValue *GV = NonCanonicalGlobals[i]; 8200621caefSChris Lattner const GlobalValue *CGV = 8210621caefSChris Lattner LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())]; 8220621caefSChris Lattner void *Ptr = getPointerToGlobalIfAvailable(CGV); 8230621caefSChris Lattner assert(Ptr && "Canonical global wasn't codegen'd!"); 8240621caefSChris Lattner addGlobalMapping(GV, getPointerToGlobalIfAvailable(CGV)); 8250621caefSChris Lattner } 8260621caefSChris Lattner } 827996fe010SChris Lattner 8287a9c62baSReid Spencer // Now that all of the globals are set up in memory, loop through them all 8297a9c62baSReid Spencer // and initialize their contents. 8308ffb6611SChris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 8310621caefSChris Lattner I != E; ++I) { 8320621caefSChris Lattner if (!I->isExternal()) { 8330621caefSChris Lattner if (!LinkedGlobalsMap.empty()) { 8340621caefSChris Lattner if (const GlobalValue *GVEntry = 8350621caefSChris Lattner LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())]) 8360621caefSChris Lattner if (GVEntry != &*I) // Not the canonical variable. 8370621caefSChris Lattner continue; 8380621caefSChris Lattner } 8396bbe3eceSChris Lattner EmitGlobalVariable(I); 8406bbe3eceSChris Lattner } 8410621caefSChris Lattner } 8420621caefSChris Lattner } 8430621caefSChris Lattner } 8446bbe3eceSChris Lattner 8456bbe3eceSChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the 8466bbe3eceSChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not 8476bbe3eceSChris Lattner // already in the map. 848fbcc0aa1SChris Lattner void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) { 849748e8579SChris Lattner void *GA = getPointerToGlobalIfAvailable(GV); 8505834fdb3SBill Wendling DOUT << "Global '" << GV->getName() << "' -> " << GA << "\n"; 851dc631735SChris Lattner 852fbcc0aa1SChris Lattner const Type *ElTy = GV->getType()->getElementType(); 85320a631fdSOwen Anderson size_t GVSize = (size_t)getTargetData()->getTypeSize(ElTy); 8546bbe3eceSChris Lattner if (GA == 0) { 8556bbe3eceSChris Lattner // If it's not already specified, allocate memory for the global. 856d215992bSChris Lattner GA = new char[GVSize]; 857748e8579SChris Lattner addGlobalMapping(GV, GA); 8586bbe3eceSChris Lattner } 859fbcc0aa1SChris Lattner 8606bbe3eceSChris Lattner InitializeMemory(GV->getInitializer(), GA); 861df1f1524SChris Lattner NumInitBytes += (unsigned)GVSize; 8626bbe3eceSChris Lattner ++NumGlobals; 863996fe010SChris Lattner } 864