ExecutionEngine.cpp revision f70c22b019494723d0e706f93d6542dfaa6e73a5
14afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman//===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===// 2bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 10bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// This file defines the common interface used by the various execution engine 11bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// subclasses. 12bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 13bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner//===----------------------------------------------------------------------===// 14bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 153785fad56eb90284d4e930d40e9306391630deb1Chris Lattner#define DEBUG_TYPE "jit" 16fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Interpreter/Interpreter.h" 1761612df9cb596448b8310e479d568d6b2a8e8a4cChris Lattner#include "JIT/JIT.h" 18bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Constants.h" 1919684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman#include "llvm/DerivedTypes.h" 207301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner#include "llvm/IntrinsicLowering.h" 21bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Module.h" 2219684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman#include "llvm/ModuleProvider.h" 2319684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman#include "llvm/ExecutionEngine/ExecutionEngine.h" 24fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "llvm/ExecutionEngine/GenericValue.h" 25bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#include "llvm/Target/TargetData.h" 26fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Support/Debug.h" 27fd13129bdf7324b2e8181a653897269aaaecc4e8Chris Lattner#include "Support/Statistic.h" 28322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke#include "Support/DynamicLinker.h" 29c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattnerusing namespace llvm; 30bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 31c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattnernamespace { 32c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattner Statistic<> NumInitBytes("lli", "Number of bytes of global vars initialized"); 3324b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner Statistic<> NumGlobals ("lli", "Number of global vars initialized"); 34c2ee9b9c7a6517f959aea31fa2c61631fe2f2903Chris Lattner} 35bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 3619684164a7b695b9dc22d879675e8d2b286ef7e5Misha BrukmanExecutionEngine::ExecutionEngine(ModuleProvider *P) : 3719684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman CurMod(*P->getModule()), MP(P) { 3819684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman assert(P && "ModuleProvider is null?"); 3919684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman} 4019684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman 4119684164a7b695b9dc22d879675e8d2b286ef7e5Misha BrukmanExecutionEngine::ExecutionEngine(Module *M) : CurMod(*M), MP(0) { 4205701573aac26e87a33e8aa58817e4dc5a40050aMisha Brukman assert(M && "Module is null?"); 4319684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman} 4419684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman 458e539488816c9e52bde0af475f72cd3e6407d558Brian GaekeExecutionEngine::~ExecutionEngine() { 467b2b40f9ac21e7349735dd7a5096f29a35d8cd02Misha Brukman delete MP; 478e539488816c9e52bde0af475f72cd3e6407d558Brian Gaeke} 488e539488816c9e52bde0af475f72cd3e6407d558Brian Gaeke 4955d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner/// getGlobalValueAtAddress - Return the LLVM global value object that starts 5055d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner/// at the specified address. 5155d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner/// 5255d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattnerconst GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) { 5355d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner // If we haven't computed the reverse mapping yet, do so first. 5455d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner if (GlobalAddressReverseMap.empty()) { 5555d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner for (std::map<const GlobalValue*, void *>::iterator I = 5655d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner GlobalAddressMap.begin(), E = GlobalAddressMap.end(); I != E; ++I) 5755d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner GlobalAddressReverseMap.insert(std::make_pair(I->second, I->first)); 5855d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner } 5955d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner 6055d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner std::map<void *, const GlobalValue*>::iterator I = 6155d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner GlobalAddressReverseMap.find(Addr); 6255d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner return I != GlobalAddressReverseMap.end() ? I->second : 0; 6355d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner} 6487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 6587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner// CreateArgv - Turn a vector of strings into a nice argv style array of 6687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner// pointers to null terminated strings. 6787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner// 6887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattnerstatic void *CreateArgv(ExecutionEngine *EE, 6987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner const std::vector<std::string> &InputArgv) { 7087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner unsigned PtrSize = EE->getTargetData().getPointerSize(); 7187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner char *Result = new char[(InputArgv.size()+1)*PtrSize]; 7287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 7387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner DEBUG(std::cerr << "ARGV = " << (void*)Result << "\n"); 7487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner const Type *SBytePtr = PointerType::get(Type::SByteTy); 7587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 7687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner for (unsigned i = 0; i != InputArgv.size(); ++i) { 7787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner unsigned Size = InputArgv[i].size()+1; 7887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner char *Dest = new char[Size]; 7987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner DEBUG(std::cerr << "ARGV[" << i << "] = " << (void*)Dest << "\n"); 8087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 8187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest); 8287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner Dest[Size-1] = 0; 8387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 8487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner // Endian safe: Result[i] = (PointerTy)Dest; 8587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner EE->StoreValueToMemory(PTOGV(Dest), (GenericValue*)(Result+i*PtrSize), 8687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner SBytePtr); 8787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner } 8887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 8987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner // Null terminate it 9087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner EE->StoreValueToMemory(PTOGV(0), 9187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner (GenericValue*)(Result+InputArgv.size()*PtrSize), 9287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner SBytePtr); 9387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner return Result; 9487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner} 9587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 9687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner/// runFunctionAsMain - This is a helper function which wraps runFunction to 9787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner/// handle the common task of starting up main with the specified argc, argv, 9887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner/// and envp parameters. 9987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattnerint ExecutionEngine::runFunctionAsMain(Function *Fn, 10087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner const std::vector<std::string> &argv, 10187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner const char * const * envp) { 10287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner std::vector<GenericValue> GVArgs; 10387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner GenericValue GVArgc; 10487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner GVArgc.IntVal = argv.size(); 10587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner GVArgs.push_back(GVArgc); // Arg #0 = argc. 10687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner GVArgs.push_back(PTOGV(CreateArgv(this, argv))); // Arg #1 = argv. 10787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner assert(((char **)GVTOP(GVArgs[1]))[0] && "argv[0] was null after CreateArgv"); 10887f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 10987f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner std::vector<std::string> EnvVars; 11087f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner for (unsigned i = 0; envp[i]; ++i) 11187f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner EnvVars.push_back(envp[i]); 11287f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner GVArgs.push_back(PTOGV(CreateArgv(this, EnvVars))); // Arg #2 = envp. 11387f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner return runFunction(Fn, GVArgs).IntVal; 11487f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner} 11587f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 11687f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 11787f03108f282a9b5f172f91679bd89ddbb5a65beChris Lattner 11819684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman/// If possible, create a JIT, unless the caller specifically requests an 11919684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman/// Interpreter or there's an error. If even an Interpreter cannot be created, 12019684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman/// NULL is returned. 1214afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// 1227b2b40f9ac21e7349735dd7a5096f29a35d8cd02Misha BrukmanExecutionEngine *ExecutionEngine::create(ModuleProvider *MP, 1237301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner bool ForceInterpreter, 1247301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner IntrinsicLowering *IL) { 12582d8277ad5862b54341808812bb4016e52347060Brian Gaeke ExecutionEngine *EE = 0; 12682d8277ad5862b54341808812bb4016e52347060Brian Gaeke 1277301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner // Unless the interpreter was explicitly selected, try making a JIT. 12820a277e162f971ec1b9c6f2c90a214c177d54f99Brian Gaeke if (!ForceInterpreter) 1297301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner EE = JIT::create(MP, IL); 13082d8277ad5862b54341808812bb4016e52347060Brian Gaeke 13182d8277ad5862b54341808812bb4016e52347060Brian Gaeke // If we can't make a JIT, make an interpreter instead. 132338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner if (EE == 0) { 133338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner try { 134338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner Module *M = MP->materializeModule(); 135338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner try { 136338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner EE = Interpreter::create(M, IL); 137338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner } catch (...) { 138338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner std::cerr << "Error creating the interpreter!\n"; 139338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner } 140338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner } catch (...) { 141338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner std::cerr << "Error reading the bytecode file!\n"; 142338733fdd2ba0d00ad2ace03836f3e0cbb3f8922Chris Lattner } 14319684164a7b695b9dc22d879675e8d2b286ef7e5Misha Brukman } 1447301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner 1457301178aac1baf1cc334e7c7a66bfe50a65fbf49Chris Lattner if (EE == 0) delete IL; 14682d8277ad5862b54341808812bb4016e52347060Brian Gaeke return EE; 14782d8277ad5862b54341808812bb4016e52347060Brian Gaeke} 14882d8277ad5862b54341808812bb4016e52347060Brian Gaeke 1494afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// getPointerToGlobal - This returns the address of the specified global 1504afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// value. This may involve code generation if it's a function. 1514afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// 152bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) { 15337df460874e8d9d28e6833e5fb66a9aa8e1ef50aBrian Gaeke if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV))) 154bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner return getPointerToFunction(F); 155bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 15655d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner assert(GlobalAddressMap[GV] && "Global hasn't had an address allocated yet?"); 15755d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner return GlobalAddressMap[GV]; 158bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 159bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 1604afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// FIXME: document 1614afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// 162bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris LattnerGenericValue ExecutionEngine::getConstantValue(const Constant *C) { 163bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GenericValue Result; 164d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner 1659a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner if (ConstantExpr *CE = const_cast<ConstantExpr*>(dyn_cast<ConstantExpr>(C))) { 166d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner switch (CE->getOpcode()) { 167d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner case Instruction::GetElementPtr: { 1689a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner Result = getConstantValue(CE->getOperand(0)); 169d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner std::vector<Value*> Indexes(CE->op_begin()+1, CE->op_end()); 170d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner uint64_t Offset = 171d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner TD->getIndexedOffset(CE->getOperand(0)->getType(), Indexes); 172d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner 173d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner Result.LongVal += Offset; 174d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner return Result; 175d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner } 1769a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner case Instruction::Cast: { 1779a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner // We only need to handle a few cases here. Almost all casts will 1789a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner // automatically fold, just the ones involving pointers won't. 1799a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner // 1809a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner Constant *Op = CE->getOperand(0); 1817d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner GenericValue GV = getConstantValue(Op); 182d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner 1839a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner // Handle cast of pointer to pointer... 184f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner if (Op->getType()->getTypeID() == C->getType()->getTypeID()) 1857d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner return GV; 1869a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner 18774cf81919d3a44457bec1cbf01b655c80f4673b1Chris Lattner // Handle a cast of pointer to any integral type... 188c88a4ea0d6ba705a81401eda50796b15c994f6f9Chris Lattner if (isa<PointerType>(Op->getType()) && C->getType()->isIntegral()) 1897d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner return GV; 19074cf81919d3a44457bec1cbf01b655c80f4673b1Chris Lattner 1917d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner // Handle cast of integer to a pointer... 1927d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner if (isa<PointerType>(C->getType()) && Op->getType()->isIntegral()) 193f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (Op->getType()->getTypeID()) { 1947d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::BoolTyID: return PTOGV((void*)(uintptr_t)GV.BoolVal); 1957d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::SByteTyID: return PTOGV((void*)( intptr_t)GV.SByteVal); 1967d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::UByteTyID: return PTOGV((void*)(uintptr_t)GV.UByteVal); 1977d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::ShortTyID: return PTOGV((void*)( intptr_t)GV.ShortVal); 1987d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::UShortTyID: return PTOGV((void*)(uintptr_t)GV.UShortVal); 1997d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::IntTyID: return PTOGV((void*)( intptr_t)GV.IntVal); 2007d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::UIntTyID: return PTOGV((void*)(uintptr_t)GV.UIntVal); 2017d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::LongTyID: return PTOGV((void*)( intptr_t)GV.LongVal); 2027d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner case Type::ULongTyID: return PTOGV((void*)(uintptr_t)GV.ULongVal); 2037d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner default: assert(0 && "Unknown integral type!"); 2047d1bd336abf32752d9dcb6993eca899fdfccff93Chris Lattner } 2059a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner break; 206d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner } 207bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 2089a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner case Instruction::Add: 2096b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner if (CE->getOperand(0)->getType() == Type::LongTy || 2106b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner CE->getOperand(0)->getType() == Type::ULongTy) 2116b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner Result.LongVal = getConstantValue(CE->getOperand(0)).LongVal + 2126b2125c62426190c4be63668e3116ecf3b25fc23Chris Lattner getConstantValue(CE->getOperand(1)).LongVal; 2139a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner else 2149a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner break; 2159a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner return Result; 2169a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner 2179a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner default: 2189a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner break; 2199a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner } 2209a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner std::cerr << "ConstantExpr not handled as global var init: " << *CE << "\n"; 2219a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner abort(); 2229a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner } 2239a23122b6a4decff3d3f10cb8d9b5ccebe5c7474Chris Lattner 224f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (C->getType()->getTypeID()) { 225d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner#define GET_CONST_VAL(TY, CLASS) \ 226d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner case Type::TY##TyID: Result.TY##Val = cast<CLASS>(C)->getValue(); break 227bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(Bool , ConstantBool); 228bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(UByte , ConstantUInt); 229bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(SByte , ConstantSInt); 230bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(UShort , ConstantUInt); 231bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(Short , ConstantSInt); 232bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(UInt , ConstantUInt); 233bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(Int , ConstantSInt); 234bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(ULong , ConstantUInt); 235bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(Long , ConstantSInt); 236bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(Float , ConstantFP); 237bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GET_CONST_VAL(Double , ConstantFP); 238bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner#undef GET_CONST_VAL 239bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::PointerTyID: 240bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner if (isa<ConstantPointerNull>(C)) { 241bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Result.PointerVal = 0; 242bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } else if (const ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(C)){ 24338f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner if (Function *F = 24438f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner const_cast<Function*>(dyn_cast<Function>(CPR->getValue()))) 24538f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner Result = PTOGV(getPointerToFunctionOrStub(F)); 24638f0ebad9aff85786c1273cfb8aa1b4bd838100aChris Lattner else 247c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner Result = PTOGV(getOrEmitGlobalVariable( 248c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner cast<GlobalVariable>(CPR->getValue()))); 249bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 250bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } else { 251bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner assert(0 && "Unknown constant pointer type!"); 252bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 253bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 254bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner default: 255d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner std::cout << "ERROR: Constant unimp for type: " << C->getType() << "\n"; 256d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner abort(); 257bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 258bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner return Result; 259bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 260bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 2614afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// FIXME: document 2624afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// 263bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid ExecutionEngine::StoreValueToMemory(GenericValue Val, GenericValue *Ptr, 2644afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman const Type *Ty) { 265bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner if (getTargetData().isLittleEndian()) { 266f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (Ty->getTypeID()) { 267bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::BoolTyID: 268bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::UByteTyID: 269bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::SByteTyID: Ptr->Untyped[0] = Val.UByteVal; break; 270bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::UShortTyID: 271bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::ShortTyID: Ptr->Untyped[0] = Val.UShortVal & 255; 272bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[1] = (Val.UShortVal >> 8) & 255; 273bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 2742be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner Store4BytesLittleEndian: 275bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::FloatTyID: 276bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::UIntTyID: 277bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::IntTyID: Ptr->Untyped[0] = Val.UIntVal & 255; 278bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[1] = (Val.UIntVal >> 8) & 255; 279bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[2] = (Val.UIntVal >> 16) & 255; 280bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[3] = (Val.UIntVal >> 24) & 255; 281bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 282c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner case Type::PointerTyID: if (getTargetData().getPointerSize() == 4) 2832be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner goto Store4BytesLittleEndian; 284bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::DoubleTyID: 285bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::ULongTyID: 2862be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner case Type::LongTyID: Ptr->Untyped[0] = Val.ULongVal & 255; 287bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[1] = (Val.ULongVal >> 8) & 255; 288bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[2] = (Val.ULongVal >> 16) & 255; 289bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[3] = (Val.ULongVal >> 24) & 255; 290bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[4] = (Val.ULongVal >> 32) & 255; 291bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[5] = (Val.ULongVal >> 40) & 255; 292bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[6] = (Val.ULongVal >> 48) & 255; 293bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[7] = (Val.ULongVal >> 56) & 255; 294bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 295bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner default: 296d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner std::cout << "Cannot store value of type " << Ty << "!\n"; 297bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 298bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } else { 299f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (Ty->getTypeID()) { 300bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::BoolTyID: 301bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::UByteTyID: 302bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::SByteTyID: Ptr->Untyped[0] = Val.UByteVal; break; 303bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::UShortTyID: 304bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::ShortTyID: Ptr->Untyped[1] = Val.UShortVal & 255; 305bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[0] = (Val.UShortVal >> 8) & 255; 306bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 3072be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner Store4BytesBigEndian: 308bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::FloatTyID: 309bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::UIntTyID: 310bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::IntTyID: Ptr->Untyped[3] = Val.UIntVal & 255; 311bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[2] = (Val.UIntVal >> 8) & 255; 312bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[1] = (Val.UIntVal >> 16) & 255; 313bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[0] = (Val.UIntVal >> 24) & 255; 314bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 315c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner case Type::PointerTyID: if (getTargetData().getPointerSize() == 4) 3162be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner goto Store4BytesBigEndian; 317bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::DoubleTyID: 318bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::ULongTyID: 3192be50797a1391278489fa698aa8e17d3f8b04a59Chris Lattner case Type::LongTyID: Ptr->Untyped[7] = Val.ULongVal & 255; 320bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[6] = (Val.ULongVal >> 8) & 255; 321bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[5] = (Val.ULongVal >> 16) & 255; 322bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[4] = (Val.ULongVal >> 24) & 255; 323bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[3] = (Val.ULongVal >> 32) & 255; 324bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[2] = (Val.ULongVal >> 40) & 255; 325bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[1] = (Val.ULongVal >> 48) & 255; 326bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner Ptr->Untyped[0] = (Val.ULongVal >> 56) & 255; 327bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner break; 328bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner default: 329d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner std::cout << "Cannot store value of type " << Ty << "!\n"; 330bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 331bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 332bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 333bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 3344afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// FIXME: document 3354afac18fd4cae1b93907d7db03c5fdb7f2f66d64Misha Brukman/// 336f88b9a639770327196b2a00f365155b954dd1d30Chris LattnerGenericValue ExecutionEngine::LoadValueFromMemory(GenericValue *Ptr, 337f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner const Type *Ty) { 338f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner GenericValue Result; 339f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner if (getTargetData().isLittleEndian()) { 340f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (Ty->getTypeID()) { 341f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::BoolTyID: 342f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::UByteTyID: 343f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break; 344f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::UShortTyID: 345f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[0] | 346f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[1] << 8); 347f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner break; 348f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner Load4BytesLittleEndian: 349f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::FloatTyID: 350f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::UIntTyID: 351f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[0] | 352f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[1] << 8) | 353f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[2] << 16) | 354f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[3] << 24); 355f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner break; 356c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner case Type::PointerTyID: if (getTargetData().getPointerSize() == 4) 357f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner goto Load4BytesLittleEndian; 358f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::DoubleTyID: 359f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::ULongTyID: 360f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::LongTyID: Result.ULongVal = (uint64_t)Ptr->Untyped[0] | 361f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[1] << 8) | 362f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[2] << 16) | 363f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[3] << 24) | 364f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[4] << 32) | 365f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[5] << 40) | 366f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[6] << 48) | 367f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[7] << 56); 368f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner break; 369f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner default: 370f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner std::cout << "Cannot load value of type " << *Ty << "!\n"; 371f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner abort(); 372f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner } 373f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner } else { 374f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (Ty->getTypeID()) { 375f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::BoolTyID: 376f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::UByteTyID: 377f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::SByteTyID: Result.UByteVal = Ptr->Untyped[0]; break; 378f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::UShortTyID: 379f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::ShortTyID: Result.UShortVal = (unsigned)Ptr->Untyped[1] | 380f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[0] << 8); 381f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner break; 382f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner Load4BytesBigEndian: 383f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::FloatTyID: 384f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::UIntTyID: 385f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::IntTyID: Result.UIntVal = (unsigned)Ptr->Untyped[3] | 386f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[2] << 8) | 387f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[1] << 16) | 388f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((unsigned)Ptr->Untyped[0] << 24); 389f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner break; 390c879e8ffc477b466fba4c01dd8c5c5af5d8cabbbChris Lattner case Type::PointerTyID: if (getTargetData().getPointerSize() == 4) 391f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner goto Load4BytesBigEndian; 392f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::DoubleTyID: 393f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::ULongTyID: 394f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner case Type::LongTyID: Result.ULongVal = (uint64_t)Ptr->Untyped[7] | 395f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[6] << 8) | 396f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[5] << 16) | 397f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[4] << 24) | 398f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[3] << 32) | 399f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[2] << 40) | 400f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[1] << 48) | 401f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner ((uint64_t)Ptr->Untyped[0] << 56); 402f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner break; 403f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner default: 404f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner std::cout << "Cannot load value of type " << *Ty << "!\n"; 405f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner abort(); 406f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner } 407f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner } 408f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner return Result; 409f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner} 410f88b9a639770327196b2a00f365155b954dd1d30Chris Lattner 411bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// InitializeMemory - Recursive function to apply a Constant value into the 412bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// specified memory location... 413bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner// 414bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { 415bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner if (Init->getType()->isFirstClassType()) { 416bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner GenericValue Val = getConstantValue(Init); 417bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); 418bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner return; 419dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner } else if (isa<ConstantAggregateZero>(Init)) { 420dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner unsigned Size = getTargetData().getTypeSize(Init->getType()); 421dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner memset(Addr, 0, Size); 422dd2c82a427a089e7c704af44eeeb2a10a38e2519Chris Lattner return; 423bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 424bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 425f70c22b019494723d0e706f93d6542dfaa6e73a5Chris Lattner switch (Init->getType()->getTypeID()) { 426bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::ArrayTyID: { 427bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const ConstantArray *CPA = cast<ConstantArray>(Init); 428d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner const std::vector<Use> &Val = CPA->getValues(); 429bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner unsigned ElementSize = 430bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner getTargetData().getTypeSize(cast<ArrayType>(CPA->getType())->getElementType()); 431bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner for (unsigned i = 0; i < Val.size(); ++i) 432bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner InitializeMemory(cast<Constant>(Val[i].get()), (char*)Addr+i*ElementSize); 433bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner return; 434bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 435bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 436bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner case Type::StructTyID: { 437bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const ConstantStruct *CPS = cast<ConstantStruct>(Init); 438bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const StructLayout *SL = 439bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner getTargetData().getStructLayout(cast<StructType>(CPS->getType())); 440d6840ac046715061d42e4dd5375cd9ed6dd3dca4Chris Lattner const std::vector<Use> &Val = CPS->getValues(); 441bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner for (unsigned i = 0; i < Val.size(); ++i) 442bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner InitializeMemory(cast<Constant>(Val[i].get()), 443bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner (char*)Addr+SL->MemberOffsets[i]); 444bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner return; 445bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 446bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 447bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner default: 448bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner std::cerr << "Bad Type: " << Init->getType() << "\n"; 449bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner assert(0 && "Unknown constant type to initialize memory with!"); 450bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 451bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 452bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 453bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// EmitGlobals - Emit all of the global variables to memory, storing their 454bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// addresses into GlobalAddress. This must make sure to copy the contents of 455bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// their initializers into the memory. 456bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner/// 457bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattnervoid ExecutionEngine::emitGlobals() { 458bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const TargetData &TD = getTargetData(); 459bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 460bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // Loop over all of the global variables in the program, allocating the memory 461bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // to hold them. 462bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner for (Module::giterator I = getModule().gbegin(), E = getModule().gend(); 463bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner I != E; ++I) 464bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner if (!I->isExternal()) { 465bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // Get the type of the global... 466bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner const Type *Ty = I->getType()->getElementType(); 467bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 468bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // Allocate some memory for it! 469bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner unsigned Size = TD.getTypeSize(Ty); 47024b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner addGlobalMapping(I, new char[Size]); 471bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } else { 472322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke // External variable reference. Try to use the dynamic loader to 473322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke // get a pointer to it. 474322cdb2e63ef29d2c00c9aa3118482eda5fdf637Brian Gaeke if (void *SymAddr = GetAddressOfSymbol(I->getName().c_str())) 47555d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner addGlobalMapping(I, SymAddr); 476d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner else { 477d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner std::cerr << "Could not resolve external global address: " 478d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner << I->getName() << "\n"; 479d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner abort(); 480d8c03bfa0a8cbcbf3ee31b0e9b52126c9dbafe2aChris Lattner } 481bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner } 482bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner 483bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // Now that all of the globals are set up in memory, loop through them all and 484bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner // initialize their contents. 485bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner for (Module::giterator I = getModule().gbegin(), E = getModule().gend(); 486bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner I != E; ++I) 487bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner if (!I->isExternal()) 48824b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner EmitGlobalVariable(I); 48924b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner} 49024b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner 49124b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner// EmitGlobalVariable - This method emits the specified global variable to the 49224b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner// address specified in GlobalAddresses, or allocates new memory if it's not 49324b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner// already in the map. 494c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattnervoid ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) { 49555d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner void *GA = getPointerToGlobalIfAvailable(GV); 49623c472436940aa7fc82ff99e8cca6788d08a8105Chris Lattner DEBUG(std::cerr << "Global '" << GV->getName() << "' -> " << GA << "\n"); 49723c472436940aa7fc82ff99e8cca6788d08a8105Chris Lattner 498c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner const Type *ElTy = GV->getType()->getElementType(); 49924b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner if (GA == 0) { 50024b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner // If it's not already specified, allocate memory for the global. 501c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner GA = new char[getTargetData().getTypeSize(ElTy)]; 50255d86482bd9fac6f90a7f6fb35c2f4dec9569fdbChris Lattner addGlobalMapping(GV, GA); 50324b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner } 504c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner 50524b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner InitializeMemory(GV->getInitializer(), GA); 506c07ed1387503d25c0b93fcf617f69329d73fc589Chris Lattner NumInitBytes += getTargetData().getTypeSize(ElTy); 50724b0a18c4357de0515c542e97edb2c2eacc543f2Chris Lattner ++NumGlobals; 508bd199fb1148b9e16c4e6f3d0ee386c2505a55b71Chris Lattner} 509