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) { 571241d6d5SReid Spencer if (Function *F = Modules[i]->getModule()->getFunction(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. 1975301e7c6SReid Spencer if (!GV || GV->isDeclaration() || 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 295*4da5e17cSChris Lattner assert(0 && "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)); 337c44bd78aSChris Lattner SmallVector<Value*, 8> Indices(CE->op_begin()+1, CE->op_end()); 3389de0d14dSChris Lattner uint64_t Offset = 339c44bd78aSChris Lattner TD->getIndexedOffset(CE->getOperand(0)->getType(), 340c44bd78aSChris Lattner &Indices[0], Indices.size()); 3419de0d14dSChris Lattner 34220a631fdSOwen Anderson if (getTargetData()->getPointerSize() == 4) 3430d54e78aSReid Spencer Result.Int32Val += Offset; 344a551033eSChris Lattner else 3450d54e78aSReid Spencer Result.Int64Val += Offset; 3469de0d14dSChris Lattner return Result; 3479de0d14dSChris Lattner } 3486c38f0bbSReid Spencer case Instruction::Trunc: 3496c38f0bbSReid Spencer case Instruction::ZExt: 3506c38f0bbSReid Spencer case Instruction::SExt: 3516c38f0bbSReid Spencer case Instruction::FPTrunc: 3526c38f0bbSReid Spencer case Instruction::FPExt: 3536c38f0bbSReid Spencer case Instruction::UIToFP: 3546c38f0bbSReid Spencer case Instruction::SIToFP: 3556c38f0bbSReid Spencer case Instruction::FPToUI: 3566c38f0bbSReid Spencer case Instruction::FPToSI: 3576c38f0bbSReid Spencer break; 3586c38f0bbSReid Spencer case Instruction::PtrToInt: { 35968cbcc3eSChris Lattner Constant *Op = CE->getOperand(0); 3605def7a57SChris Lattner GenericValue GV = getConstantValue(Op); 3616c38f0bbSReid Spencer return GV; 3626c38f0bbSReid Spencer } 3636c38f0bbSReid Spencer case Instruction::BitCast: { 3646c38f0bbSReid Spencer // Bit casts are no-ops but we can only return the GV of the operand if 3656c38f0bbSReid Spencer // they are the same basic type (pointer->pointer, packed->packed, etc.) 3666c38f0bbSReid Spencer Constant *Op = CE->getOperand(0); 3676c38f0bbSReid Spencer GenericValue GV = getConstantValue(Op); 3686b727599SChris Lattner if (Op->getType()->getTypeID() == C->getType()->getTypeID()) 3695def7a57SChris Lattner return GV; 3706c38f0bbSReid Spencer break; 3716c38f0bbSReid Spencer } 3726c38f0bbSReid Spencer case Instruction::IntToPtr: { 3736c38f0bbSReid Spencer // IntToPtr casts are just so special. Cast to intptr_t first. 3746c38f0bbSReid Spencer Constant *Op = CE->getOperand(0); 3756c38f0bbSReid Spencer GenericValue GV = getConstantValue(Op); 3767a9c62baSReid Spencer #define INT_TO_PTR_ACTION(FIELD) \ 3777a9c62baSReid Spencer return PTOGV((void*)(uintptr_t)GV.FIELD) 3787a9c62baSReid Spencer DO_FOR_INTEGER(Op->getType(), INT_TO_PTR_ACTION) 3797a9c62baSReid Spencer #undef INT_TO_PTR_ACTION 38068cbcc3eSChris Lattner break; 38168cbcc3eSChris Lattner } 38268cbcc3eSChris Lattner case Instruction::Add: 383c4e6bb5fSChris Lattner switch (CE->getOperand(0)->getType()->getTypeID()) { 384c4e6bb5fSChris Lattner default: assert(0 && "Bad add type!"); abort(); 3857a9c62baSReid Spencer case Type::IntegerTyID: 3867a9c62baSReid Spencer #define ADD_ACTION(FIELD) \ 3877a9c62baSReid Spencer Result.FIELD = getConstantValue(CE->getOperand(0)).FIELD + \ 3887a9c62baSReid Spencer getConstantValue(CE->getOperand(1)).FIELD; 3897a9c62baSReid Spencer DO_FOR_INTEGER(CE->getOperand(0)->getType(),ADD_ACTION); 3907a9c62baSReid Spencer #undef ADD_ACTION 391c4e6bb5fSChris Lattner break; 392c4e6bb5fSChris Lattner case Type::FloatTyID: 393c4e6bb5fSChris Lattner Result.FloatVal = getConstantValue(CE->getOperand(0)).FloatVal + 394c4e6bb5fSChris Lattner getConstantValue(CE->getOperand(1)).FloatVal; 395c4e6bb5fSChris Lattner break; 396c4e6bb5fSChris Lattner case Type::DoubleTyID: 397c4e6bb5fSChris Lattner Result.DoubleVal = getConstantValue(CE->getOperand(0)).DoubleVal + 398c4e6bb5fSChris Lattner getConstantValue(CE->getOperand(1)).DoubleVal; 399c4e6bb5fSChris Lattner break; 400c4e6bb5fSChris Lattner } 40168cbcc3eSChris Lattner return Result; 4029de0d14dSChris Lattner default: 40368cbcc3eSChris Lattner break; 40468cbcc3eSChris Lattner } 405f3baad3eSBill Wendling cerr << "ConstantExpr not handled as global var init: " << *CE << "\n"; 4069de0d14dSChris Lattner abort(); 4079de0d14dSChris Lattner } 408996fe010SChris Lattner 4096b727599SChris Lattner switch (C->getType()->getTypeID()) { 410e0fc4dfcSReid Spencer #define GET_CONST_VAL(TY, CTY, CLASS, GETMETH) \ 411e0fc4dfcSReid Spencer case Type::TY##TyID: Result.TY##Val = (CTY)cast<CLASS>(C)->GETMETH(); break 412e0fc4dfcSReid Spencer GET_CONST_VAL(Float , float , ConstantFP, getValue); 413e0fc4dfcSReid Spencer GET_CONST_VAL(Double, double , ConstantFP, getValue); 414996fe010SChris Lattner #undef GET_CONST_VAL 4157a9c62baSReid Spencer case Type::IntegerTyID: { 4167a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(C->getType())->getBitWidth(); 4177a9c62baSReid Spencer if (BitWidth == 1) 4187a9c62baSReid Spencer Result.Int1Val = (bool)cast<ConstantInt>(C)->getZExtValue(); 4197a9c62baSReid Spencer else if (BitWidth <= 8) 4207a9c62baSReid Spencer Result.Int8Val = (uint8_t )cast<ConstantInt>(C)->getZExtValue(); 4217a9c62baSReid Spencer else if (BitWidth <= 16) 4227a9c62baSReid Spencer Result.Int16Val = (uint16_t )cast<ConstantInt>(C)->getZExtValue(); 4237a9c62baSReid Spencer else if (BitWidth <= 32) 4247a9c62baSReid Spencer Result.Int32Val = (uint32_t )cast<ConstantInt>(C)->getZExtValue(); 4257a9c62baSReid Spencer else if (BitWidth <= 64) 4267a9c62baSReid Spencer Result.Int64Val = (uint64_t )cast<ConstantInt>(C)->getZExtValue(); 4277a9c62baSReid Spencer else 428*4da5e17cSChris Lattner assert(0 && "Integers with > 64-bits not implemented"); 4297a9c62baSReid Spencer break; 4307a9c62baSReid Spencer } 4317a9c62baSReid Spencer 432996fe010SChris Lattner case Type::PointerTyID: 4336a0fd73bSReid Spencer if (isa<ConstantPointerNull>(C)) 434996fe010SChris Lattner Result.PointerVal = 0; 4356a0fd73bSReid Spencer else if (const Function *F = dyn_cast<Function>(C)) 4366a0fd73bSReid Spencer Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F))); 4376a0fd73bSReid Spencer else if (const GlobalVariable* GV = dyn_cast<GlobalVariable>(C)) 4386a0fd73bSReid Spencer Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV))); 439e6492f10SChris Lattner else 440996fe010SChris Lattner assert(0 && "Unknown constant pointer type!"); 441996fe010SChris Lattner break; 442996fe010SChris Lattner default: 443f3baad3eSBill Wendling cerr << "ERROR: Constant unimp for type: " << *C->getType() << "\n"; 4449de0d14dSChris Lattner abort(); 445996fe010SChris Lattner } 446996fe010SChris Lattner return Result; 447996fe010SChris Lattner } 448996fe010SChris Lattner 4494ca2ea5bSNate Begeman /// StoreValueToMemory - Stores the data in Val of type Ty at address Ptr. Ptr 4504ca2ea5bSNate Begeman /// is the address of the memory at which to store Val, cast to GenericValue *. 4514ca2ea5bSNate Begeman /// It is not a pointer to a GenericValue containing the address at which to 4524ca2ea5bSNate Begeman /// store Val. 453857c21b4SMisha Brukman /// 454996fe010SChris Lattner void ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr, 455996fe010SChris Lattner const Type *Ty) { 45620a631fdSOwen Anderson if (getTargetData()->isLittleEndian()) { 4576b727599SChris Lattner switch (Ty->getTypeID()) { 4587a9c62baSReid Spencer case Type::IntegerTyID: { 4597a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 460a94d394aSReid Spencer uint64_t BitMask = cast<IntegerType>(Ty)->getBitMask(); 46101f7e06dSReid Spencer GenericValue TmpVal = Val; 4627a9c62baSReid Spencer if (BitWidth <= 8) 46301f7e06dSReid Spencer Ptr->Untyped[0] = Val.Int8Val & BitMask; 4647a9c62baSReid Spencer else if (BitWidth <= 16) { 46501f7e06dSReid Spencer TmpVal.Int16Val &= BitMask; 46601f7e06dSReid Spencer Ptr->Untyped[0] = TmpVal.Int16Val & 255; 46701f7e06dSReid Spencer Ptr->Untyped[1] = (TmpVal.Int16Val >> 8) & 255; 4687a9c62baSReid Spencer } else if (BitWidth <= 32) { 46901f7e06dSReid Spencer TmpVal.Int32Val &= BitMask; 47001f7e06dSReid Spencer Ptr->Untyped[0] = TmpVal.Int32Val & 255; 47101f7e06dSReid Spencer Ptr->Untyped[1] = (TmpVal.Int32Val >> 8) & 255; 47201f7e06dSReid Spencer Ptr->Untyped[2] = (TmpVal.Int32Val >> 16) & 255; 47301f7e06dSReid Spencer Ptr->Untyped[3] = (TmpVal.Int32Val >> 24) & 255; 4747a9c62baSReid Spencer } else if (BitWidth <= 64) { 47501f7e06dSReid Spencer TmpVal.Int64Val &= BitMask; 47601f7e06dSReid Spencer Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val ); 47701f7e06dSReid Spencer Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 8); 47801f7e06dSReid Spencer Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 16); 47901f7e06dSReid Spencer Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 24); 48001f7e06dSReid Spencer Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 32); 48101f7e06dSReid Spencer Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 40); 48201f7e06dSReid Spencer Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 48); 48301f7e06dSReid Spencer Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val >> 56); 4847a9c62baSReid Spencer } else 4857a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 486996fe010SChris Lattner break; 4877a9c62baSReid Spencer } 488b348952dSChris Lattner Store4BytesLittleEndian: 489996fe010SChris Lattner case Type::FloatTyID: 4907a9c62baSReid Spencer Ptr->Untyped[0] = Val.Int32Val & 255; 4910d54e78aSReid Spencer Ptr->Untyped[1] = (Val.Int32Val >> 8) & 255; 4920d54e78aSReid Spencer Ptr->Untyped[2] = (Val.Int32Val >> 16) & 255; 4930d54e78aSReid Spencer Ptr->Untyped[3] = (Val.Int32Val >> 24) & 255; 494996fe010SChris Lattner break; 4957a9c62baSReid Spencer case Type::PointerTyID: 4967a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 497b348952dSChris Lattner goto Store4BytesLittleEndian; 4987a9c62baSReid Spencer /* FALL THROUGH */ 499996fe010SChris Lattner case Type::DoubleTyID: 5000d54e78aSReid Spencer Ptr->Untyped[0] = (unsigned char)(Val.Int64Val ); 5010d54e78aSReid Spencer Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >> 8); 5020d54e78aSReid Spencer Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 16); 5030d54e78aSReid Spencer Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 24); 5040d54e78aSReid Spencer Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 32); 5050d54e78aSReid Spencer Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 40); 5060d54e78aSReid Spencer Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >> 48); 5070d54e78aSReid Spencer Ptr->Untyped[7] = (unsigned char)(Val.Int64Val >> 56); 508996fe010SChris Lattner break; 509996fe010SChris Lattner default: 510f3baad3eSBill Wendling cerr << "Cannot store value of type " << *Ty << "!\n"; 511996fe010SChris Lattner } 512996fe010SChris Lattner } else { 5136b727599SChris Lattner switch (Ty->getTypeID()) { 5147a9c62baSReid Spencer case Type::IntegerTyID: { 5157a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 516a94d394aSReid Spencer uint64_t BitMask = cast<IntegerType>(Ty)->getBitMask(); 51701f7e06dSReid Spencer GenericValue TmpVal = Val; 5187a9c62baSReid Spencer if (BitWidth <= 8) 51901f7e06dSReid Spencer Ptr->Untyped[0] = Val.Int8Val & BitMask; 5207a9c62baSReid Spencer else if (BitWidth <= 16) { 52101f7e06dSReid Spencer TmpVal.Int16Val &= BitMask; 52201f7e06dSReid Spencer Ptr->Untyped[1] = TmpVal.Int16Val & 255; 52301f7e06dSReid Spencer Ptr->Untyped[0] = (TmpVal.Int16Val >> 8) & 255; 5247a9c62baSReid Spencer } else if (BitWidth <= 32) { 52501f7e06dSReid Spencer TmpVal.Int32Val &= BitMask; 52601f7e06dSReid Spencer Ptr->Untyped[3] = TmpVal.Int32Val & 255; 52701f7e06dSReid Spencer Ptr->Untyped[2] = (TmpVal.Int32Val >> 8) & 255; 52801f7e06dSReid Spencer Ptr->Untyped[1] = (TmpVal.Int32Val >> 16) & 255; 52901f7e06dSReid Spencer Ptr->Untyped[0] = (TmpVal.Int32Val >> 24) & 255; 5307a9c62baSReid Spencer } else if (BitWidth <= 64) { 53101f7e06dSReid Spencer TmpVal.Int64Val &= BitMask; 53201f7e06dSReid Spencer Ptr->Untyped[7] = (unsigned char)(TmpVal.Int64Val ); 53301f7e06dSReid Spencer Ptr->Untyped[6] = (unsigned char)(TmpVal.Int64Val >> 8); 53401f7e06dSReid Spencer Ptr->Untyped[5] = (unsigned char)(TmpVal.Int64Val >> 16); 53501f7e06dSReid Spencer Ptr->Untyped[4] = (unsigned char)(TmpVal.Int64Val >> 24); 53601f7e06dSReid Spencer Ptr->Untyped[3] = (unsigned char)(TmpVal.Int64Val >> 32); 53701f7e06dSReid Spencer Ptr->Untyped[2] = (unsigned char)(TmpVal.Int64Val >> 40); 53801f7e06dSReid Spencer Ptr->Untyped[1] = (unsigned char)(TmpVal.Int64Val >> 48); 53901f7e06dSReid Spencer Ptr->Untyped[0] = (unsigned char)(TmpVal.Int64Val >> 56); 5407a9c62baSReid Spencer } else 5417a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 542996fe010SChris Lattner break; 5437a9c62baSReid Spencer } 544b348952dSChris Lattner Store4BytesBigEndian: 545996fe010SChris Lattner case Type::FloatTyID: 5467a9c62baSReid Spencer Ptr->Untyped[3] = Val.Int32Val & 255; 5470d54e78aSReid Spencer Ptr->Untyped[2] = (Val.Int32Val >> 8) & 255; 5480d54e78aSReid Spencer Ptr->Untyped[1] = (Val.Int32Val >> 16) & 255; 5490d54e78aSReid Spencer Ptr->Untyped[0] = (Val.Int32Val >> 24) & 255; 550996fe010SChris Lattner break; 5517a9c62baSReid Spencer case Type::PointerTyID: 5527a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 553b348952dSChris Lattner goto Store4BytesBigEndian; 5547a9c62baSReid Spencer /* FALL THROUGH */ 555996fe010SChris Lattner case Type::DoubleTyID: 5560d54e78aSReid Spencer Ptr->Untyped[7] = (unsigned char)(Val.Int64Val ); 5570d54e78aSReid Spencer Ptr->Untyped[6] = (unsigned char)(Val.Int64Val >> 8); 5580d54e78aSReid Spencer Ptr->Untyped[5] = (unsigned char)(Val.Int64Val >> 16); 5590d54e78aSReid Spencer Ptr->Untyped[4] = (unsigned char)(Val.Int64Val >> 24); 5600d54e78aSReid Spencer Ptr->Untyped[3] = (unsigned char)(Val.Int64Val >> 32); 5610d54e78aSReid Spencer Ptr->Untyped[2] = (unsigned char)(Val.Int64Val >> 40); 5620d54e78aSReid Spencer Ptr->Untyped[1] = (unsigned char)(Val.Int64Val >> 48); 5630d54e78aSReid Spencer Ptr->Untyped[0] = (unsigned char)(Val.Int64Val >> 56); 564996fe010SChris Lattner break; 565996fe010SChris Lattner default: 566f3baad3eSBill Wendling cerr << "Cannot store value of type " << *Ty << "!\n"; 567996fe010SChris Lattner } 568996fe010SChris Lattner } 569996fe010SChris Lattner } 570996fe010SChris Lattner 571857c21b4SMisha Brukman /// FIXME: document 572857c21b4SMisha Brukman /// 5737f389e8cSChris Lattner GenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr, 5747f389e8cSChris Lattner const Type *Ty) { 5757f389e8cSChris Lattner GenericValue Result; 57620a631fdSOwen Anderson if (getTargetData()->isLittleEndian()) { 5776b727599SChris Lattner switch (Ty->getTypeID()) { 5787a9c62baSReid Spencer case Type::IntegerTyID: { 5797a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 5807a9c62baSReid Spencer if (BitWidth <= 8) 5817a9c62baSReid Spencer Result.Int8Val = Ptr->Untyped[0]; 5827a9c62baSReid Spencer else if (BitWidth <= 16) { 5837a9c62baSReid Spencer Result.Int16Val = (unsigned)Ptr->Untyped[0] | 5847f389e8cSChris Lattner ((unsigned)Ptr->Untyped[1] << 8); 5857a9c62baSReid Spencer } else if (BitWidth <= 32) { 5867a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[0] | 5877a9c62baSReid Spencer ((unsigned)Ptr->Untyped[1] << 8) | 5887a9c62baSReid Spencer ((unsigned)Ptr->Untyped[2] << 16) | 5897a9c62baSReid Spencer ((unsigned)Ptr->Untyped[3] << 24); 5907a9c62baSReid Spencer } else if (BitWidth <= 64) { 5917a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[0] | 5927a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[1] << 8) | 5937a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[2] << 16) | 5947a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[3] << 24) | 5957a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[4] << 32) | 5967a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[5] << 40) | 5977a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[6] << 48) | 5987a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[7] << 56); 5997a9c62baSReid Spencer } else 6007a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 6017f389e8cSChris Lattner break; 6027a9c62baSReid Spencer } 6037f389e8cSChris Lattner Load4BytesLittleEndian: 6047f389e8cSChris Lattner case Type::FloatTyID: 6057a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[0] | 6067f389e8cSChris Lattner ((unsigned)Ptr->Untyped[1] << 8) | 6077f389e8cSChris Lattner ((unsigned)Ptr->Untyped[2] << 16) | 6087f389e8cSChris Lattner ((unsigned)Ptr->Untyped[3] << 24); 6097f389e8cSChris Lattner break; 6107a9c62baSReid Spencer case Type::PointerTyID: 6117a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 6127f389e8cSChris Lattner goto Load4BytesLittleEndian; 6137a9c62baSReid Spencer /* FALL THROUGH */ 6147f389e8cSChris Lattner case Type::DoubleTyID: 6157a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[0] | 6167f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[1] << 8) | 6177f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[2] << 16) | 6187f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[3] << 24) | 6197f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[4] << 32) | 6207f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[5] << 40) | 6217f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[6] << 48) | 6227f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[7] << 56); 6237f389e8cSChris Lattner break; 6247f389e8cSChris Lattner default: 625f3baad3eSBill Wendling cerr << "Cannot load value of type " << *Ty << "!\n"; 6267f389e8cSChris Lattner abort(); 6277f389e8cSChris Lattner } 6287f389e8cSChris Lattner } else { 6296b727599SChris Lattner switch (Ty->getTypeID()) { 6307a9c62baSReid Spencer case Type::IntegerTyID: { 6317a9c62baSReid Spencer unsigned BitWidth = cast<IntegerType>(Ty)->getBitWidth(); 6327a9c62baSReid Spencer if (BitWidth <= 8) 6337a9c62baSReid Spencer Result.Int8Val = Ptr->Untyped[0]; 6347a9c62baSReid Spencer else if (BitWidth <= 16) { 6357a9c62baSReid Spencer Result.Int16Val = (unsigned)Ptr->Untyped[1] | 6367f389e8cSChris Lattner ((unsigned)Ptr->Untyped[0] << 8); 6377a9c62baSReid Spencer } else if (BitWidth <= 32) { 6387a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[3] | 6397a9c62baSReid Spencer ((unsigned)Ptr->Untyped[2] << 8) | 6407a9c62baSReid Spencer ((unsigned)Ptr->Untyped[1] << 16) | 6417a9c62baSReid Spencer ((unsigned)Ptr->Untyped[0] << 24); 6427a9c62baSReid Spencer } else if (BitWidth <= 64) { 6437a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[7] | 6447a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[6] << 8) | 6457a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[5] << 16) | 6467a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[4] << 24) | 6477a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[3] << 32) | 6487a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[2] << 40) | 6497a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[1] << 48) | 6507a9c62baSReid Spencer ((uint64_t)Ptr->Untyped[0] << 56); 6517a9c62baSReid Spencer } else 6527a9c62baSReid Spencer assert(0 && "Integer types > 64 bits not supported"); 6537f389e8cSChris Lattner break; 6547a9c62baSReid Spencer } 6557f389e8cSChris Lattner Load4BytesBigEndian: 6567f389e8cSChris Lattner case Type::FloatTyID: 6577a9c62baSReid Spencer Result.Int32Val = (unsigned)Ptr->Untyped[3] | 6587f389e8cSChris Lattner ((unsigned)Ptr->Untyped[2] << 8) | 6597f389e8cSChris Lattner ((unsigned)Ptr->Untyped[1] << 16) | 6607f389e8cSChris Lattner ((unsigned)Ptr->Untyped[0] << 24); 6617f389e8cSChris Lattner break; 6627a9c62baSReid Spencer case Type::PointerTyID: 6637a9c62baSReid Spencer if (getTargetData()->getPointerSize() == 4) 6647f389e8cSChris Lattner goto Load4BytesBigEndian; 6657a9c62baSReid Spencer /* FALL THROUGH */ 6667f389e8cSChris Lattner case Type::DoubleTyID: 6677a9c62baSReid Spencer Result.Int64Val = (uint64_t)Ptr->Untyped[7] | 6687f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[6] << 8) | 6697f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[5] << 16) | 6707f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[4] << 24) | 6717f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[3] << 32) | 6727f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[2] << 40) | 6737f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[1] << 48) | 6747f389e8cSChris Lattner ((uint64_t)Ptr->Untyped[0] << 56); 6757f389e8cSChris Lattner break; 6767f389e8cSChris Lattner default: 677f3baad3eSBill Wendling cerr << "Cannot load value of type " << *Ty << "!\n"; 6787f389e8cSChris Lattner abort(); 6797f389e8cSChris Lattner } 6807f389e8cSChris Lattner } 6817f389e8cSChris Lattner return Result; 6827f389e8cSChris Lattner } 6837f389e8cSChris Lattner 684996fe010SChris Lattner // InitializeMemory - Recursive function to apply a Constant value into the 685996fe010SChris Lattner // specified memory location... 686996fe010SChris Lattner // 687996fe010SChris Lattner void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { 68861753bf8SChris Lattner if (isa<UndefValue>(Init)) { 68961753bf8SChris Lattner return; 69069d62138SRobert Bocchino } else if (const ConstantPacked *CP = dyn_cast<ConstantPacked>(Init)) { 69169d62138SRobert Bocchino unsigned ElementSize = 69220a631fdSOwen Anderson getTargetData()->getTypeSize(CP->getType()->getElementType()); 69369d62138SRobert Bocchino for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) 69469d62138SRobert Bocchino InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize); 69569d62138SRobert Bocchino return; 69661753bf8SChris Lattner } else if (Init->getType()->isFirstClassType()) { 697996fe010SChris Lattner GenericValue Val = getConstantValue(Init); 698996fe010SChris Lattner StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); 699996fe010SChris Lattner return; 700834b1272SChris Lattner } else if (isa<ConstantAggregateZero>(Init)) { 70120a631fdSOwen Anderson memset(Addr, 0, (size_t)getTargetData()->getTypeSize(Init->getType())); 702834b1272SChris Lattner return; 703996fe010SChris Lattner } 704996fe010SChris Lattner 7056b727599SChris Lattner switch (Init->getType()->getTypeID()) { 706996fe010SChris Lattner case Type::ArrayTyID: { 707996fe010SChris Lattner const ConstantArray *CPA = cast<ConstantArray>(Init); 708996fe010SChris Lattner unsigned ElementSize = 70920a631fdSOwen Anderson getTargetData()->getTypeSize(CPA->getType()->getElementType()); 71083243725SAlkis Evlogimenos for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i) 71183243725SAlkis Evlogimenos InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize); 712996fe010SChris Lattner return; 713996fe010SChris Lattner } 714996fe010SChris Lattner 715996fe010SChris Lattner case Type::StructTyID: { 716996fe010SChris Lattner const ConstantStruct *CPS = cast<ConstantStruct>(Init); 717996fe010SChris Lattner const StructLayout *SL = 71820a631fdSOwen Anderson getTargetData()->getStructLayout(cast<StructType>(CPS->getType())); 71983243725SAlkis Evlogimenos for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i) 720c473d8e4SChris Lattner InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i)); 721996fe010SChris Lattner return; 722996fe010SChris Lattner } 723996fe010SChris Lattner 724996fe010SChris Lattner default: 725f3baad3eSBill Wendling cerr << "Bad Type: " << *Init->getType() << "\n"; 726996fe010SChris Lattner assert(0 && "Unknown constant type to initialize memory with!"); 727996fe010SChris Lattner } 728996fe010SChris Lattner } 729996fe010SChris Lattner 730996fe010SChris Lattner /// EmitGlobals - Emit all of the global variables to memory, storing their 731996fe010SChris Lattner /// addresses into GlobalAddress. This must make sure to copy the contents of 732996fe010SChris Lattner /// their initializers into the memory. 733996fe010SChris Lattner /// 734996fe010SChris Lattner void ExecutionEngine::emitGlobals() { 73520a631fdSOwen Anderson const TargetData *TD = getTargetData(); 736996fe010SChris Lattner 737996fe010SChris Lattner // Loop over all of the global variables in the program, allocating the memory 7380621caefSChris Lattner // to hold them. If there is more than one module, do a prepass over globals 7390621caefSChris Lattner // to figure out how the different modules should link together. 7400621caefSChris Lattner // 7410621caefSChris Lattner std::map<std::pair<std::string, const Type*>, 7420621caefSChris Lattner const GlobalValue*> LinkedGlobalsMap; 7430621caefSChris Lattner 7440621caefSChris Lattner if (Modules.size() != 1) { 7450621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 7460621caefSChris Lattner Module &M = *Modules[m]->getModule(); 7470621caefSChris Lattner for (Module::const_global_iterator I = M.global_begin(), 7480621caefSChris Lattner E = M.global_end(); I != E; ++I) { 7490621caefSChris Lattner const GlobalValue *GV = I; 7505301e7c6SReid Spencer if (GV->hasInternalLinkage() || GV->isDeclaration() || 7510621caefSChris Lattner GV->hasAppendingLinkage() || !GV->hasName()) 7520621caefSChris Lattner continue;// Ignore external globals and globals with internal linkage. 7530621caefSChris Lattner 7540621caefSChris Lattner const GlobalValue *&GVEntry = 7550621caefSChris Lattner LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())]; 7560621caefSChris Lattner 7570621caefSChris Lattner // If this is the first time we've seen this global, it is the canonical 7580621caefSChris Lattner // version. 7590621caefSChris Lattner if (!GVEntry) { 7600621caefSChris Lattner GVEntry = GV; 7610621caefSChris Lattner continue; 7620621caefSChris Lattner } 7630621caefSChris Lattner 7640621caefSChris Lattner // If the existing global is strong, never replace it. 765d61d39ecSAnton Korobeynikov if (GVEntry->hasExternalLinkage() || 766d61d39ecSAnton Korobeynikov GVEntry->hasDLLImportLinkage() || 767d61d39ecSAnton Korobeynikov GVEntry->hasDLLExportLinkage()) 7680621caefSChris Lattner continue; 7690621caefSChris Lattner 7700621caefSChris Lattner // Otherwise, we know it's linkonce/weak, replace it if this is a strong 7710621caefSChris Lattner // symbol. 77212c94949SAnton Korobeynikov if (GV->hasExternalLinkage() || GVEntry->hasExternalWeakLinkage()) 7730621caefSChris Lattner GVEntry = GV; 7740621caefSChris Lattner } 7750621caefSChris Lattner } 7760621caefSChris Lattner } 7770621caefSChris Lattner 7780621caefSChris Lattner std::vector<const GlobalValue*> NonCanonicalGlobals; 7790621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 7800621caefSChris Lattner Module &M = *Modules[m]->getModule(); 7818ffb6611SChris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 7820621caefSChris Lattner I != E; ++I) { 7830621caefSChris Lattner // In the multi-module case, see what this global maps to. 7840621caefSChris Lattner if (!LinkedGlobalsMap.empty()) { 7850621caefSChris Lattner if (const GlobalValue *GVEntry = 7860621caefSChris Lattner LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())]) { 7870621caefSChris Lattner // If something else is the canonical global, ignore this one. 7880621caefSChris Lattner if (GVEntry != &*I) { 7890621caefSChris Lattner NonCanonicalGlobals.push_back(I); 7900621caefSChris Lattner continue; 7910621caefSChris Lattner } 7920621caefSChris Lattner } 7930621caefSChris Lattner } 7940621caefSChris Lattner 7955301e7c6SReid Spencer if (!I->isDeclaration()) { 7960621caefSChris Lattner // Get the type of the global. 797996fe010SChris Lattner const Type *Ty = I->getType()->getElementType(); 798996fe010SChris Lattner 799996fe010SChris Lattner // Allocate some memory for it! 80020a631fdSOwen Anderson unsigned Size = TD->getTypeSize(Ty); 8016bbe3eceSChris Lattner addGlobalMapping(I, new char[Size]); 802996fe010SChris Lattner } else { 803e8bbcfc2SBrian Gaeke // External variable reference. Try to use the dynamic loader to 804e8bbcfc2SBrian Gaeke // get a pointer to it. 8050621caefSChris Lattner if (void *SymAddr = 8060621caefSChris Lattner sys::DynamicLibrary::SearchForAddressOfSymbol(I->getName().c_str())) 807748e8579SChris Lattner addGlobalMapping(I, SymAddr); 8089de0d14dSChris Lattner else { 809f3baad3eSBill Wendling cerr << "Could not resolve external global address: " 8109de0d14dSChris Lattner << I->getName() << "\n"; 8119de0d14dSChris Lattner abort(); 8129de0d14dSChris Lattner } 813996fe010SChris Lattner } 8140621caefSChris Lattner } 8150621caefSChris Lattner 8160621caefSChris Lattner // If there are multiple modules, map the non-canonical globals to their 8170621caefSChris Lattner // canonical location. 8180621caefSChris Lattner if (!NonCanonicalGlobals.empty()) { 8190621caefSChris Lattner for (unsigned i = 0, e = NonCanonicalGlobals.size(); i != e; ++i) { 8200621caefSChris Lattner const GlobalValue *GV = NonCanonicalGlobals[i]; 8210621caefSChris Lattner const GlobalValue *CGV = 8220621caefSChris Lattner LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())]; 8230621caefSChris Lattner void *Ptr = getPointerToGlobalIfAvailable(CGV); 8240621caefSChris Lattner assert(Ptr && "Canonical global wasn't codegen'd!"); 8250621caefSChris Lattner addGlobalMapping(GV, getPointerToGlobalIfAvailable(CGV)); 8260621caefSChris Lattner } 8270621caefSChris Lattner } 828996fe010SChris Lattner 8297a9c62baSReid Spencer // Now that all of the globals are set up in memory, loop through them all 8307a9c62baSReid Spencer // and initialize their contents. 8318ffb6611SChris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 8320621caefSChris Lattner I != E; ++I) { 8335301e7c6SReid Spencer if (!I->isDeclaration()) { 8340621caefSChris Lattner if (!LinkedGlobalsMap.empty()) { 8350621caefSChris Lattner if (const GlobalValue *GVEntry = 8360621caefSChris Lattner LinkedGlobalsMap[std::make_pair(I->getName(), I->getType())]) 8370621caefSChris Lattner if (GVEntry != &*I) // Not the canonical variable. 8380621caefSChris Lattner continue; 8390621caefSChris Lattner } 8406bbe3eceSChris Lattner EmitGlobalVariable(I); 8416bbe3eceSChris Lattner } 8420621caefSChris Lattner } 8430621caefSChris Lattner } 8440621caefSChris Lattner } 8456bbe3eceSChris Lattner 8466bbe3eceSChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the 8476bbe3eceSChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not 8486bbe3eceSChris Lattner // already in the map. 849fbcc0aa1SChris Lattner void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) { 850748e8579SChris Lattner void *GA = getPointerToGlobalIfAvailable(GV); 8515834fdb3SBill Wendling DOUT << "Global '" << GV->getName() << "' -> " << GA << "\n"; 852dc631735SChris Lattner 853fbcc0aa1SChris Lattner const Type *ElTy = GV->getType()->getElementType(); 85420a631fdSOwen Anderson size_t GVSize = (size_t)getTargetData()->getTypeSize(ElTy); 8556bbe3eceSChris Lattner if (GA == 0) { 8566bbe3eceSChris Lattner // If it's not already specified, allocate memory for the global. 857d215992bSChris Lattner GA = new char[GVSize]; 858748e8579SChris Lattner addGlobalMapping(GV, GA); 8596bbe3eceSChris Lattner } 860fbcc0aa1SChris Lattner 8616bbe3eceSChris Lattner InitializeMemory(GV->getInitializer(), GA); 862df1f1524SChris Lattner NumInitBytes += (unsigned)GVSize; 8636bbe3eceSChris Lattner ++NumGlobals; 864996fe010SChris Lattner } 865