1857c21b4SMisha Brukman //===-- ExecutionEngine.cpp - Common Implementation shared by EEs ---------===// 2996fe010SChris Lattner // 3482202a6SJohn Criswell // The LLVM Compiler Infrastructure 4482202a6SJohn Criswell // 5f3ebc3f3SChris Lattner // This file is distributed under the University of Illinois Open Source 6f3ebc3f3SChris Lattner // 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 156bf87df5SJeffrey Yasskin #include "llvm/ExecutionEngine/ExecutionEngine.h" 16868e3f09SDaniel Dunbar #include "llvm/ADT/SmallString.h" 17390d78b3SChris Lattner #include "llvm/ADT/Statistic.h" 18ed0881b2SChandler Carruth #include "llvm/ExecutionEngine/GenericValue.h" 19b5c7b1ffSLang Hames #include "llvm/ExecutionEngine/JITEventListener.h" 209fb823bbSChandler Carruth #include "llvm/IR/Constants.h" 219fb823bbSChandler Carruth #include "llvm/IR/DataLayout.h" 229fb823bbSChandler Carruth #include "llvm/IR/DerivedTypes.h" 239fb823bbSChandler Carruth #include "llvm/IR/Module.h" 249fb823bbSChandler Carruth #include "llvm/IR/Operator.h" 254220e9c1SChandler Carruth #include "llvm/IR/ValueHandle.h" 26dd39657aSRafael Espindola #include "llvm/Object/Archive.h" 2735907d8eSDavid Blaikie #include "llvm/Object/ObjectFile.h" 287c16caa3SReid Spencer #include "llvm/Support/Debug.h" 29ed0881b2SChandler Carruth #include "llvm/Support/DynamicLibrary.h" 306c2d233eSTorok Edwin #include "llvm/Support/ErrorHandling.h" 31ed0881b2SChandler Carruth #include "llvm/Support/Host.h" 326d8dd189SChris Lattner #include "llvm/Support/MutexGuard.h" 33ed0881b2SChandler Carruth #include "llvm/Support/TargetRegistry.h" 34ccb29cd2STorok Edwin #include "llvm/Support/raw_ostream.h" 358418fdcdSDylan Noblesmith #include "llvm/Target/TargetMachine.h" 36579f0713SAnton Korobeynikov #include <cmath> 37579f0713SAnton Korobeynikov #include <cstring> 3829681deeSChris Lattner using namespace llvm; 39996fe010SChris Lattner 40f58e376dSChandler Carruth #define DEBUG_TYPE "jit" 41f58e376dSChandler Carruth 42c346ecd7SChris Lattner STATISTIC(NumInitBytes, "Number of bytes of global vars initialized"); 43c346ecd7SChris Lattner STATISTIC(NumGlobals , "Number of global vars initialized"); 44996fe010SChris Lattner 4570ff8b05SDaniel Dunbar ExecutionEngine *(*ExecutionEngine::MCJITCtor)( 46196e323cSDavid Blaikie std::unique_ptr<Module> M, std::string *ErrorStr, 47196e323cSDavid Blaikie RTDyldMemoryManager *MCJMM, std::unique_ptr<TargetMachine> TM) = nullptr; 482a8a2795SRafael Espindola ExecutionEngine *(*ExecutionEngine::InterpCtor)(std::unique_ptr<Module> M, 492617dcceSCraig Topper std::string *ErrorStr) =nullptr; 502d52c1b8SChris Lattner 51*7ea98e14SLang Hames void JITEventListener::anchor() {} 52*7ea98e14SLang Hames 532a8a2795SRafael Espindola ExecutionEngine::ExecutionEngine(std::unique_ptr<Module> M) 54f98e981cSJeffrey Yasskin : EEState(*this), 552617dcceSCraig Topper LazyFunctionCreator(nullptr) { 564567db45SJeffrey Yasskin CompilingLazily = false; 57cdc0060eSEvan Cheng GVCompilationDisabled = false; 5884a9055eSEvan Cheng SymbolSearchingDisabled = false; 59bc876017SLang Hames 60bc876017SLang Hames // IR module verification is enabled by default in debug builds, and disabled 61bc876017SLang Hames // by default in release builds. 62bc876017SLang Hames #ifndef NDEBUG 63bc876017SLang Hames VerifyModules = true; 64bc876017SLang Hames #else 65bc876017SLang Hames VerifyModules = false; 66bc876017SLang Hames #endif 67bc876017SLang Hames 68091217beSJeffrey Yasskin assert(M && "Module is null?"); 692a8a2795SRafael Espindola Modules.push_back(std::move(M)); 70260b0c88SMisha Brukman } 71260b0c88SMisha Brukman 7292f8b30dSBrian Gaeke ExecutionEngine::~ExecutionEngine() { 73603682adSReid Spencer clearAllGlobalMappings(); 7492f8b30dSBrian Gaeke } 7592f8b30dSBrian Gaeke 76a4044332SJeffrey Yasskin namespace { 77868e3f09SDaniel Dunbar /// \brief Helper class which uses a value handler to automatically deletes the 78868e3f09SDaniel Dunbar /// memory block when the GlobalVariable is destroyed. 79a4044332SJeffrey Yasskin class GVMemoryBlock : public CallbackVH { 80a4044332SJeffrey Yasskin GVMemoryBlock(const GlobalVariable *GV) 81a4044332SJeffrey Yasskin : CallbackVH(const_cast<GlobalVariable*>(GV)) {} 82a4044332SJeffrey Yasskin 83a4044332SJeffrey Yasskin public: 84868e3f09SDaniel Dunbar /// \brief Returns the address the GlobalVariable should be written into. The 85868e3f09SDaniel Dunbar /// GVMemoryBlock object prefixes that. 86cdfe20b9SMicah Villmow static char *Create(const GlobalVariable *GV, const DataLayout& TD) { 87229907cdSChris Lattner Type *ElTy = GV->getType()->getElementType(); 88a4044332SJeffrey Yasskin size_t GVSize = (size_t)TD.getTypeAllocSize(ElTy); 89a4044332SJeffrey Yasskin void *RawMemory = ::operator new( 90f3cadce8SDavid Majnemer RoundUpToAlignment(sizeof(GVMemoryBlock), 91a4044332SJeffrey Yasskin TD.getPreferredAlignment(GV)) 92a4044332SJeffrey Yasskin + GVSize); 93a4044332SJeffrey Yasskin new(RawMemory) GVMemoryBlock(GV); 94a4044332SJeffrey Yasskin return static_cast<char*>(RawMemory) + sizeof(GVMemoryBlock); 95a4044332SJeffrey Yasskin } 96a4044332SJeffrey Yasskin 97b51ff603SCraig Topper void deleted() override { 98a4044332SJeffrey Yasskin // We allocated with operator new and with some extra memory hanging off the 99a4044332SJeffrey Yasskin // end, so don't just delete this. I'm not sure if this is actually 100a4044332SJeffrey Yasskin // required. 101a4044332SJeffrey Yasskin this->~GVMemoryBlock(); 102a4044332SJeffrey Yasskin ::operator delete(this); 103a4044332SJeffrey Yasskin } 104a4044332SJeffrey Yasskin }; 105a4044332SJeffrey Yasskin } // anonymous namespace 106a4044332SJeffrey Yasskin 107a4044332SJeffrey Yasskin char *ExecutionEngine::getMemoryForGV(const GlobalVariable *GV) { 108cdfe20b9SMicah Villmow return GVMemoryBlock::Create(GV, *getDataLayout()); 1095457ce9aSNicolas Geoffray } 1105457ce9aSNicolas Geoffray 11135907d8eSDavid Blaikie void ExecutionEngine::addObjectFile(std::unique_ptr<object::ObjectFile> O) { 11235907d8eSDavid Blaikie llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile."); 11335907d8eSDavid Blaikie } 11435907d8eSDavid Blaikie 1157271c194SRafael Espindola void 1167271c194SRafael Espindola ExecutionEngine::addObjectFile(object::OwningBinary<object::ObjectFile> O) { 1177271c194SRafael Espindola llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile."); 1187271c194SRafael Espindola } 1197271c194SRafael Espindola 12048af1c2aSRafael Espindola void ExecutionEngine::addArchive(object::OwningBinary<object::Archive> A) { 121acfd6289SRafael Espindola llvm_unreachable("ExecutionEngine subclass doesn't implement addArchive."); 122acfd6289SRafael Espindola } 123acfd6289SRafael Espindola 124091217beSJeffrey Yasskin bool ExecutionEngine::removeModule(Module *M) { 1252a8a2795SRafael Espindola for (auto I = Modules.begin(), E = Modules.end(); I != E; ++I) { 1262a8a2795SRafael Espindola Module *Found = I->get(); 127091217beSJeffrey Yasskin if (Found == M) { 1282a8a2795SRafael Espindola I->release(); 129324fe890SDevang Patel Modules.erase(I); 130091217beSJeffrey Yasskin clearGlobalMappingsFromModule(M); 131091217beSJeffrey Yasskin return true; 132324fe890SDevang Patel } 133324fe890SDevang Patel } 134091217beSJeffrey Yasskin return false; 135617001d8SNate Begeman } 136617001d8SNate Begeman 1370621caefSChris Lattner Function *ExecutionEngine::FindFunctionNamed(const char *FnName) { 1380621caefSChris Lattner for (unsigned i = 0, e = Modules.size(); i != e; ++i) { 139091217beSJeffrey Yasskin if (Function *F = Modules[i]->getFunction(FnName)) 1400621caefSChris Lattner return F; 1410621caefSChris Lattner } 1422617dcceSCraig Topper return nullptr; 1430621caefSChris Lattner } 1440621caefSChris Lattner 1450621caefSChris Lattner 1462f825df6SZachary Turner void *ExecutionEngineState::RemoveMapping(const GlobalValue *ToUnmap) { 147d0fc8f80SJeffrey Yasskin GlobalAddressMapTy::iterator I = GlobalAddressMap.find(ToUnmap); 148307c053fSJeffrey Yasskin void *OldVal; 149868e3f09SDaniel Dunbar 150868e3f09SDaniel Dunbar // FIXME: This is silly, we shouldn't end up with a mapping -> 0 in the 151868e3f09SDaniel Dunbar // GlobalAddressMap. 152307c053fSJeffrey Yasskin if (I == GlobalAddressMap.end()) 1532617dcceSCraig Topper OldVal = nullptr; 154307c053fSJeffrey Yasskin else { 155307c053fSJeffrey Yasskin OldVal = I->second; 156307c053fSJeffrey Yasskin GlobalAddressMap.erase(I); 157307c053fSJeffrey Yasskin } 158307c053fSJeffrey Yasskin 159307c053fSJeffrey Yasskin GlobalAddressReverseMap.erase(OldVal); 160307c053fSJeffrey Yasskin return OldVal; 161307c053fSJeffrey Yasskin } 162307c053fSJeffrey Yasskin 1636d8dd189SChris Lattner void ExecutionEngine::addGlobalMapping(const GlobalValue *GV, void *Addr) { 164c04b892fSZachary Turner MutexGuard locked(lock); 1656d8dd189SChris Lattner 1660967d2dfSDavid Greene DEBUG(dbgs() << "JIT: Map \'" << GV->getName() 1679813b0b0SDaniel Dunbar << "\' to [" << Addr << "]\n";); 1682f825df6SZachary Turner void *&CurVal = EEState.getGlobalAddressMap()[GV]; 1692617dcceSCraig Topper assert((!CurVal || !Addr) && "GlobalMapping already established!"); 1706d8dd189SChris Lattner CurVal = Addr; 1716d8dd189SChris Lattner 172868e3f09SDaniel Dunbar // If we are using the reverse mapping, add it too. 1732f825df6SZachary Turner if (!EEState.getGlobalAddressReverseMap().empty()) { 1746bf87df5SJeffrey Yasskin AssertingVH<const GlobalValue> &V = 1752f825df6SZachary Turner EEState.getGlobalAddressReverseMap()[Addr]; 1762617dcceSCraig Topper assert((!V || !GV) && "GlobalMapping already established!"); 1776d8dd189SChris Lattner V = GV; 1786d8dd189SChris Lattner } 1796d8dd189SChris Lattner } 1806d8dd189SChris Lattner 1816d8dd189SChris Lattner void ExecutionEngine::clearAllGlobalMappings() { 182c04b892fSZachary Turner MutexGuard locked(lock); 1836d8dd189SChris Lattner 1842f825df6SZachary Turner EEState.getGlobalAddressMap().clear(); 1852f825df6SZachary Turner EEState.getGlobalAddressReverseMap().clear(); 1866d8dd189SChris Lattner } 1876d8dd189SChris Lattner 1888f83fc4dSNate Begeman void ExecutionEngine::clearGlobalMappingsFromModule(Module *M) { 189c04b892fSZachary Turner MutexGuard locked(lock); 1908f83fc4dSNate Begeman 191868e3f09SDaniel Dunbar for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) 1922f825df6SZachary Turner EEState.RemoveMapping(FI); 1938f83fc4dSNate Begeman for (Module::global_iterator GI = M->global_begin(), GE = M->global_end(); 194868e3f09SDaniel Dunbar GI != GE; ++GI) 1952f825df6SZachary Turner EEState.RemoveMapping(GI); 1968f83fc4dSNate Begeman } 1978f83fc4dSNate Begeman 198ee181730SChris Lattner void *ExecutionEngine::updateGlobalMapping(const GlobalValue *GV, void *Addr) { 199c04b892fSZachary Turner MutexGuard locked(lock); 2006d8dd189SChris Lattner 201d0fc8f80SJeffrey Yasskin ExecutionEngineState::GlobalAddressMapTy &Map = 2022f825df6SZachary Turner EEState.getGlobalAddressMap(); 203ee181730SChris Lattner 2046d8dd189SChris Lattner // Deleting from the mapping? 2052617dcceSCraig Topper if (!Addr) 2062f825df6SZachary Turner return EEState.RemoveMapping(GV); 207ee181730SChris Lattner 208d0fc8f80SJeffrey Yasskin void *&CurVal = Map[GV]; 209ee181730SChris Lattner void *OldVal = CurVal; 210ee181730SChris Lattner 2112f825df6SZachary Turner if (CurVal && !EEState.getGlobalAddressReverseMap().empty()) 2122f825df6SZachary Turner EEState.getGlobalAddressReverseMap().erase(CurVal); 2136d8dd189SChris Lattner CurVal = Addr; 2146d8dd189SChris Lattner 215868e3f09SDaniel Dunbar // If we are using the reverse mapping, add it too. 2162f825df6SZachary Turner if (!EEState.getGlobalAddressReverseMap().empty()) { 2176bf87df5SJeffrey Yasskin AssertingVH<const GlobalValue> &V = 2182f825df6SZachary Turner EEState.getGlobalAddressReverseMap()[Addr]; 2192617dcceSCraig Topper assert((!V || !GV) && "GlobalMapping already established!"); 2206d8dd189SChris Lattner V = GV; 2216d8dd189SChris Lattner } 222ee181730SChris Lattner return OldVal; 2236d8dd189SChris Lattner } 2246d8dd189SChris Lattner 2256d8dd189SChris Lattner void *ExecutionEngine::getPointerToGlobalIfAvailable(const GlobalValue *GV) { 226c04b892fSZachary Turner MutexGuard locked(lock); 2276d8dd189SChris Lattner 228d0fc8f80SJeffrey Yasskin ExecutionEngineState::GlobalAddressMapTy::iterator I = 2292f825df6SZachary Turner EEState.getGlobalAddressMap().find(GV); 2302f825df6SZachary Turner return I != EEState.getGlobalAddressMap().end() ? I->second : nullptr; 2316d8dd189SChris Lattner } 2326d8dd189SChris Lattner 233748e8579SChris Lattner const GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) { 234c04b892fSZachary Turner MutexGuard locked(lock); 23579876f52SReid Spencer 236748e8579SChris Lattner // If we haven't computed the reverse mapping yet, do so first. 2372f825df6SZachary Turner if (EEState.getGlobalAddressReverseMap().empty()) { 238d0fc8f80SJeffrey Yasskin for (ExecutionEngineState::GlobalAddressMapTy::iterator 2392f825df6SZachary Turner I = EEState.getGlobalAddressMap().begin(), 2402f825df6SZachary Turner E = EEState.getGlobalAddressMap().end(); I != E; ++I) 2412f825df6SZachary Turner EEState.getGlobalAddressReverseMap().insert(std::make_pair( 242e4f47434SDaniel Dunbar I->second, I->first)); 243748e8579SChris Lattner } 244748e8579SChris Lattner 2456bf87df5SJeffrey Yasskin std::map<void *, AssertingVH<const GlobalValue> >::iterator I = 2462f825df6SZachary Turner EEState.getGlobalAddressReverseMap().find(Addr); 2472f825df6SZachary Turner return I != EEState.getGlobalAddressReverseMap().end() ? I->second : nullptr; 248748e8579SChris Lattner } 2495a0d4829SChris Lattner 250bfd38abbSJeffrey Yasskin namespace { 251bfd38abbSJeffrey Yasskin class ArgvArray { 252c4a9942aSDylan Noblesmith std::unique_ptr<char[]> Array; 253c4a9942aSDylan Noblesmith std::vector<std::unique_ptr<char[]>> Values; 254bfd38abbSJeffrey Yasskin public: 255bfd38abbSJeffrey Yasskin /// Turn a vector of strings into a nice argv style array of pointers to null 256bfd38abbSJeffrey Yasskin /// terminated strings. 257bfd38abbSJeffrey Yasskin void *reset(LLVMContext &C, ExecutionEngine *EE, 258bfd38abbSJeffrey Yasskin const std::vector<std::string> &InputArgv); 259bfd38abbSJeffrey Yasskin }; 260bfd38abbSJeffrey Yasskin } // anonymous namespace 261bfd38abbSJeffrey Yasskin void *ArgvArray::reset(LLVMContext &C, ExecutionEngine *EE, 2625a0d4829SChris Lattner const std::vector<std::string> &InputArgv) { 263c4a9942aSDylan Noblesmith Values.clear(); // Free the old contents. 264c4a9942aSDylan Noblesmith Values.reserve(InputArgv.size()); 2655da3f051SChandler Carruth unsigned PtrSize = EE->getDataLayout()->getPointerSize(); 266c4a9942aSDylan Noblesmith Array = make_unique<char[]>((InputArgv.size()+1)*PtrSize); 2675a0d4829SChris Lattner 268c4a9942aSDylan Noblesmith DEBUG(dbgs() << "JIT: ARGV = " << (void*)Array.get() << "\n"); 269229907cdSChris Lattner Type *SBytePtr = Type::getInt8PtrTy(C); 2705a0d4829SChris Lattner 2715a0d4829SChris Lattner for (unsigned i = 0; i != InputArgv.size(); ++i) { 2725a0d4829SChris Lattner unsigned Size = InputArgv[i].size()+1; 2734b535d19SDylan Noblesmith auto Dest = make_unique<char[]>(Size); 2744b535d19SDylan Noblesmith DEBUG(dbgs() << "JIT: ARGV[" << i << "] = " << (void*)Dest.get() << "\n"); 2755a0d4829SChris Lattner 2764b535d19SDylan Noblesmith std::copy(InputArgv[i].begin(), InputArgv[i].end(), Dest.get()); 2775a0d4829SChris Lattner Dest[Size-1] = 0; 2785a0d4829SChris Lattner 279bfd38abbSJeffrey Yasskin // Endian safe: Array[i] = (PointerTy)Dest; 2804b535d19SDylan Noblesmith EE->StoreValueToMemory(PTOGV(Dest.get()), 2814b535d19SDylan Noblesmith (GenericValue*)(&Array[i*PtrSize]), SBytePtr); 2824b535d19SDylan Noblesmith Values.push_back(std::move(Dest)); 2835a0d4829SChris Lattner } 2845a0d4829SChris Lattner 2855a0d4829SChris Lattner // Null terminate it 2862617dcceSCraig Topper EE->StoreValueToMemory(PTOGV(nullptr), 287c4a9942aSDylan Noblesmith (GenericValue*)(&Array[InputArgv.size()*PtrSize]), 2885a0d4829SChris Lattner SBytePtr); 289c4a9942aSDylan Noblesmith return Array.get(); 2905a0d4829SChris Lattner } 2915a0d4829SChris Lattner 2922a8a2795SRafael Espindola void ExecutionEngine::runStaticConstructorsDestructors(Module &module, 29341fa2bd1SChris Lattner bool isDtors) { 294faae50b6SChris Lattner const char *Name = isDtors ? "llvm.global_dtors" : "llvm.global_ctors"; 2952a8a2795SRafael Espindola GlobalVariable *GV = module.getNamedGlobal(Name); 296fe36eaebSChris Lattner 297fe36eaebSChris Lattner // If this global has internal linkage, or if it has a use, then it must be 298fe36eaebSChris Lattner // an old-style (llvmgcc3) static ctor with __main linked in and in use. If 2990621caefSChris Lattner // this is the case, don't execute any of the global ctors, __main will do 3000621caefSChris Lattner // it. 3016de96a1bSRafael Espindola if (!GV || GV->isDeclaration() || GV->hasLocalLinkage()) return; 302faae50b6SChris Lattner 3030cbfcb2bSNick Lewycky // Should be an array of '{ i32, void ()* }' structs. The first value is 3040621caefSChris Lattner // the init priority, which we ignore. 30500245f42SChris Lattner ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 3062617dcceSCraig Topper if (!InitList) 3070f857898SNick Lewycky return; 308868e3f09SDaniel Dunbar for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 30900245f42SChris Lattner ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i)); 3102617dcceSCraig Topper if (!CS) continue; 311faae50b6SChris Lattner 312faae50b6SChris Lattner Constant *FP = CS->getOperand(1); 313faae50b6SChris Lattner if (FP->isNullValue()) 3140f857898SNick Lewycky continue; // Found a sentinal value, ignore. 315faae50b6SChris Lattner 316868e3f09SDaniel Dunbar // Strip off constant expression casts. 317faae50b6SChris Lattner if (ConstantExpr *CE = dyn_cast<ConstantExpr>(FP)) 3186c38f0bbSReid Spencer if (CE->isCast()) 319faae50b6SChris Lattner FP = CE->getOperand(0); 320868e3f09SDaniel Dunbar 321faae50b6SChris Lattner // Execute the ctor/dtor function! 322868e3f09SDaniel Dunbar if (Function *F = dyn_cast<Function>(FP)) 323faae50b6SChris Lattner runFunction(F, std::vector<GenericValue>()); 324868e3f09SDaniel Dunbar 325868e3f09SDaniel Dunbar // FIXME: It is marginally lame that we just do nothing here if we see an 326868e3f09SDaniel Dunbar // entry we don't recognize. It might not be unreasonable for the verifier 327868e3f09SDaniel Dunbar // to not even allow this and just assert here. 328faae50b6SChris Lattner } 329faae50b6SChris Lattner } 3301a9a0b7bSEvan Cheng 3311a9a0b7bSEvan Cheng void ExecutionEngine::runStaticConstructorsDestructors(bool isDtors) { 3321a9a0b7bSEvan Cheng // Execute global ctors/dtors for each module in the program. 3332a8a2795SRafael Espindola for (std::unique_ptr<Module> &M : Modules) 3342a8a2795SRafael Espindola runStaticConstructorsDestructors(*M, isDtors); 3350621caefSChris Lattner } 336faae50b6SChris Lattner 337cf3e3017SDan Gohman #ifndef NDEBUG 3381202d1b1SDuncan Sands /// isTargetNullPtr - Return whether the target pointer stored at Loc is null. 3391202d1b1SDuncan Sands static bool isTargetNullPtr(ExecutionEngine *EE, void *Loc) { 3405da3f051SChandler Carruth unsigned PtrSize = EE->getDataLayout()->getPointerSize(); 3411202d1b1SDuncan Sands for (unsigned i = 0; i < PtrSize; ++i) 3421202d1b1SDuncan Sands if (*(i + (uint8_t*)Loc)) 3431202d1b1SDuncan Sands return false; 3441202d1b1SDuncan Sands return true; 3451202d1b1SDuncan Sands } 346cf3e3017SDan Gohman #endif 3471202d1b1SDuncan Sands 3485a0d4829SChris Lattner int ExecutionEngine::runFunctionAsMain(Function *Fn, 3495a0d4829SChris Lattner const std::vector<std::string> &argv, 3505a0d4829SChris Lattner const char * const * envp) { 3515a0d4829SChris Lattner std::vector<GenericValue> GVArgs; 3525a0d4829SChris Lattner GenericValue GVArgc; 35387aa65f4SReid Spencer GVArgc.IntVal = APInt(32, argv.size()); 3548c32c111SAnton Korobeynikov 3558c32c111SAnton Korobeynikov // Check main() type 356b1cad0b3SChris Lattner unsigned NumArgs = Fn->getFunctionType()->getNumParams(); 357229907cdSChris Lattner FunctionType *FTy = Fn->getFunctionType(); 358229907cdSChris Lattner Type* PPInt8Ty = Type::getInt8PtrTy(Fn->getContext())->getPointerTo(); 359868e3f09SDaniel Dunbar 360868e3f09SDaniel Dunbar // Check the argument types. 361868e3f09SDaniel Dunbar if (NumArgs > 3) 3622104b8d3SChris Lattner report_fatal_error("Invalid number of arguments of main() supplied"); 363868e3f09SDaniel Dunbar if (NumArgs >= 3 && FTy->getParamType(2) != PPInt8Ty) 364868e3f09SDaniel Dunbar report_fatal_error("Invalid type for third argument of main() supplied"); 365868e3f09SDaniel Dunbar if (NumArgs >= 2 && FTy->getParamType(1) != PPInt8Ty) 366868e3f09SDaniel Dunbar report_fatal_error("Invalid type for second argument of main() supplied"); 367868e3f09SDaniel Dunbar if (NumArgs >= 1 && !FTy->getParamType(0)->isIntegerTy(32)) 368868e3f09SDaniel Dunbar report_fatal_error("Invalid type for first argument of main() supplied"); 369868e3f09SDaniel Dunbar if (!FTy->getReturnType()->isIntegerTy() && 370868e3f09SDaniel Dunbar !FTy->getReturnType()->isVoidTy()) 371868e3f09SDaniel Dunbar report_fatal_error("Invalid return type of main() supplied"); 3728c32c111SAnton Korobeynikov 373bfd38abbSJeffrey Yasskin ArgvArray CArgv; 374bfd38abbSJeffrey Yasskin ArgvArray CEnv; 375b1cad0b3SChris Lattner if (NumArgs) { 3765a0d4829SChris Lattner GVArgs.push_back(GVArgc); // Arg #0 = argc. 377b1cad0b3SChris Lattner if (NumArgs > 1) { 37855f1c09eSOwen Anderson // Arg #1 = argv. 379bfd38abbSJeffrey Yasskin GVArgs.push_back(PTOGV(CArgv.reset(Fn->getContext(), this, argv))); 3801202d1b1SDuncan Sands assert(!isTargetNullPtr(this, GVTOP(GVArgs[1])) && 381b1cad0b3SChris Lattner "argv[0] was null after CreateArgv"); 382b1cad0b3SChris Lattner if (NumArgs > 2) { 3835a0d4829SChris Lattner std::vector<std::string> EnvVars; 3845a0d4829SChris Lattner for (unsigned i = 0; envp[i]; ++i) 3855a0d4829SChris Lattner EnvVars.push_back(envp[i]); 38655f1c09eSOwen Anderson // Arg #2 = envp. 387bfd38abbSJeffrey Yasskin GVArgs.push_back(PTOGV(CEnv.reset(Fn->getContext(), this, EnvVars))); 388b1cad0b3SChris Lattner } 389b1cad0b3SChris Lattner } 390b1cad0b3SChris Lattner } 391868e3f09SDaniel Dunbar 39287aa65f4SReid Spencer return runFunction(Fn, GVArgs).IntVal.getZExtValue(); 3935a0d4829SChris Lattner } 3945a0d4829SChris Lattner 395322db9eaSAlp Toker void EngineBuilder::InitEngine() { 396322db9eaSAlp Toker WhichEngine = EngineKind::Either; 397322db9eaSAlp Toker ErrorStr = nullptr; 398322db9eaSAlp Toker OptLevel = CodeGenOpt::Default; 399322db9eaSAlp Toker MCJMM = nullptr; 400322db9eaSAlp Toker Options = TargetOptions(); 401322db9eaSAlp Toker RelocModel = Reloc::Default; 402322db9eaSAlp Toker CMModel = CodeModel::JITDefault; 403322db9eaSAlp Toker 404322db9eaSAlp Toker // IR module verification is enabled by default in debug builds, and disabled 405322db9eaSAlp Toker // by default in release builds. 406322db9eaSAlp Toker #ifndef NDEBUG 407322db9eaSAlp Toker VerifyModules = true; 408322db9eaSAlp Toker #else 409322db9eaSAlp Toker VerifyModules = false; 410322db9eaSAlp Toker #endif 411322db9eaSAlp Toker } 412322db9eaSAlp Toker 413add6f1d2SOwen Anderson ExecutionEngine *EngineBuilder::create(TargetMachine *TM) { 41456440fd8SAhmed Charles std::unique_ptr<TargetMachine> TheTM(TM); // Take ownership. 41525a3d816SBenjamin Kramer 416a53414fdSNick Lewycky // Make sure we can resolve symbols in the program as well. The zero arg 417a53414fdSNick Lewycky // to the function tells DynamicLibrary to load the program, not a library. 4182617dcceSCraig Topper if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr, ErrorStr)) 4192617dcceSCraig Topper return nullptr; 420a53414fdSNick Lewycky 421fc8a2d5aSReid Kleckner // If the user specified a memory manager but didn't specify which engine to 422fc8a2d5aSReid Kleckner // create, we assume they only want the JIT, and we fail if they only want 423fc8a2d5aSReid Kleckner // the interpreter. 4240f15490bSLang Hames if (MCJMM) { 42541fa2bd1SChris Lattner if (WhichEngine & EngineKind::JIT) 426fc8a2d5aSReid Kleckner WhichEngine = EngineKind::JIT; 42741fa2bd1SChris Lattner else { 4288bcc6445SChris Lattner if (ErrorStr) 429fc8a2d5aSReid Kleckner *ErrorStr = "Cannot create an interpreter with a memory manager."; 4302617dcceSCraig Topper return nullptr; 431fc8a2d5aSReid Kleckner } 4324bd3bd5bSBrian Gaeke } 4334bd3bd5bSBrian Gaeke 434fc8a2d5aSReid Kleckner // Unless the interpreter was explicitly selected or the JIT is not linked, 435fc8a2d5aSReid Kleckner // try making a JIT. 43625a3d816SBenjamin Kramer if ((WhichEngine & EngineKind::JIT) && TheTM) { 4377f26246aSDylan Noblesmith Triple TT(M->getTargetTriple()); 4387f26246aSDylan Noblesmith if (!TM->getTarget().hasJIT()) { 4397f26246aSDylan Noblesmith errs() << "WARNING: This target JIT is not designed for the host" 4407f26246aSDylan Noblesmith << " you are running. If bad things happen, please choose" 4417f26246aSDylan Noblesmith << " a different -march switch.\n"; 4427f26246aSDylan Noblesmith } 4437f26246aSDylan Noblesmith 444bc876017SLang Hames ExecutionEngine *EE = nullptr; 44579cc1e3aSEric Christopher if (ExecutionEngine::MCJITCtor) 4460f15490bSLang Hames EE = ExecutionEngine::MCJITCtor(std::move(M), ErrorStr, MCJMM, 4470f15490bSLang Hames std::move(TheTM)); 448bc876017SLang Hames if (EE) { 449bc876017SLang Hames EE->setVerifyModules(VerifyModules); 450bc876017SLang Hames return EE; 45141fa2bd1SChris Lattner } 452fc8a2d5aSReid Kleckner } 453fc8a2d5aSReid Kleckner 454fc8a2d5aSReid Kleckner // If we can't make a JIT and we didn't request one specifically, try making 455fc8a2d5aSReid Kleckner // an interpreter instead. 45641fa2bd1SChris Lattner if (WhichEngine & EngineKind::Interpreter) { 45741fa2bd1SChris Lattner if (ExecutionEngine::InterpCtor) 4582a8a2795SRafael Espindola return ExecutionEngine::InterpCtor(std::move(M), ErrorStr); 4598bcc6445SChris Lattner if (ErrorStr) 46041fa2bd1SChris Lattner *ErrorStr = "Interpreter has not been linked in."; 4612617dcceSCraig Topper return nullptr; 462fc8a2d5aSReid Kleckner } 463fc8a2d5aSReid Kleckner 46479cc1e3aSEric Christopher if ((WhichEngine & EngineKind::JIT) && !ExecutionEngine::MCJITCtor) { 4658bcc6445SChris Lattner if (ErrorStr) 4668bcc6445SChris Lattner *ErrorStr = "JIT has not been linked in."; 4678bcc6445SChris Lattner } 468868e3f09SDaniel Dunbar 4692617dcceSCraig Topper return nullptr; 470b5163bb9SChris Lattner } 471b5163bb9SChris Lattner 472996fe010SChris Lattner void *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) { 4731678e859SBrian Gaeke if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV))) 474996fe010SChris Lattner return getPointerToFunction(F); 475996fe010SChris Lattner 476c04b892fSZachary Turner MutexGuard locked(lock); 4772f825df6SZachary Turner if (void *P = EEState.getGlobalAddressMap()[GV]) 478868e3f09SDaniel Dunbar return P; 47969e84901SJeff Cohen 48069e84901SJeff Cohen // Global variable might have been added since interpreter started. 48169e84901SJeff Cohen if (GlobalVariable *GVar = 48269e84901SJeff Cohen const_cast<GlobalVariable *>(dyn_cast<GlobalVariable>(GV))) 48369e84901SJeff Cohen EmitGlobalVariable(GVar); 48469e84901SJeff Cohen else 485fbcc663cSTorok Edwin llvm_unreachable("Global hasn't had an address allocated yet!"); 486868e3f09SDaniel Dunbar 4872f825df6SZachary Turner return EEState.getGlobalAddressMap()[GV]; 488996fe010SChris Lattner } 489996fe010SChris Lattner 490868e3f09SDaniel Dunbar /// \brief Converts a Constant* into a GenericValue, including handling of 491868e3f09SDaniel Dunbar /// ConstantExpr values. 492996fe010SChris Lattner GenericValue ExecutionEngine::getConstantValue(const Constant *C) { 4936c38f0bbSReid Spencer // If its undefined, return the garbage. 494bcbdbfb3SJay Foad if (isa<UndefValue>(C)) { 495bcbdbfb3SJay Foad GenericValue Result; 496bcbdbfb3SJay Foad switch (C->getType()->getTypeID()) { 497be79a7acSNadav Rotem default: 498be79a7acSNadav Rotem break; 499bcbdbfb3SJay Foad case Type::IntegerTyID: 500bcbdbfb3SJay Foad case Type::X86_FP80TyID: 501bcbdbfb3SJay Foad case Type::FP128TyID: 502bcbdbfb3SJay Foad case Type::PPC_FP128TyID: 503bcbdbfb3SJay Foad // Although the value is undefined, we still have to construct an APInt 504bcbdbfb3SJay Foad // with the correct bit width. 505bcbdbfb3SJay Foad Result.IntVal = APInt(C->getType()->getPrimitiveSizeInBits(), 0); 506bcbdbfb3SJay Foad break; 5078e97f016SElena Demikhovsky case Type::StructTyID: { 5088e97f016SElena Demikhovsky // if the whole struct is 'undef' just reserve memory for the value. 5098e97f016SElena Demikhovsky if(StructType *STy = dyn_cast<StructType>(C->getType())) { 5108e97f016SElena Demikhovsky unsigned int elemNum = STy->getNumElements(); 5118e97f016SElena Demikhovsky Result.AggregateVal.resize(elemNum); 5128e97f016SElena Demikhovsky for (unsigned int i = 0; i < elemNum; ++i) { 5138e97f016SElena Demikhovsky Type *ElemTy = STy->getElementType(i); 5148e97f016SElena Demikhovsky if (ElemTy->isIntegerTy()) 5158e97f016SElena Demikhovsky Result.AggregateVal[i].IntVal = 5168e97f016SElena Demikhovsky APInt(ElemTy->getPrimitiveSizeInBits(), 0); 5178e97f016SElena Demikhovsky else if (ElemTy->isAggregateType()) { 5188e97f016SElena Demikhovsky const Constant *ElemUndef = UndefValue::get(ElemTy); 5198e97f016SElena Demikhovsky Result.AggregateVal[i] = getConstantValue(ElemUndef); 5208e97f016SElena Demikhovsky } 5218e97f016SElena Demikhovsky } 5228e97f016SElena Demikhovsky } 5238e97f016SElena Demikhovsky } 5248e97f016SElena Demikhovsky break; 525be79a7acSNadav Rotem case Type::VectorTyID: 526be79a7acSNadav Rotem // if the whole vector is 'undef' just reserve memory for the value. 527be79a7acSNadav Rotem const VectorType* VTy = dyn_cast<VectorType>(C->getType()); 528be79a7acSNadav Rotem const Type *ElemTy = VTy->getElementType(); 529be79a7acSNadav Rotem unsigned int elemNum = VTy->getNumElements(); 530be79a7acSNadav Rotem Result.AggregateVal.resize(elemNum); 531be79a7acSNadav Rotem if (ElemTy->isIntegerTy()) 532be79a7acSNadav Rotem for (unsigned int i = 0; i < elemNum; ++i) 533be79a7acSNadav Rotem Result.AggregateVal[i].IntVal = 534be79a7acSNadav Rotem APInt(ElemTy->getPrimitiveSizeInBits(), 0); 535bcbdbfb3SJay Foad break; 536bcbdbfb3SJay Foad } 537bcbdbfb3SJay Foad return Result; 538bcbdbfb3SJay Foad } 5399de0d14dSChris Lattner 540868e3f09SDaniel Dunbar // Otherwise, if the value is a ConstantExpr... 5416c38f0bbSReid Spencer if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 5424fd528f2SReid Spencer Constant *Op0 = CE->getOperand(0); 5439de0d14dSChris Lattner switch (CE->getOpcode()) { 5449de0d14dSChris Lattner case Instruction::GetElementPtr: { 5456c38f0bbSReid Spencer // Compute the index 5464fd528f2SReid Spencer GenericValue Result = getConstantValue(Op0); 5477c68bebbSRafael Espindola APInt Offset(DL->getPointerSizeInBits(), 0); 5487c68bebbSRafael Espindola cast<GEPOperator>(CE)->accumulateConstantOffset(*DL, Offset); 5499de0d14dSChris Lattner 55087aa65f4SReid Spencer char* tmp = (char*) Result.PointerVal; 551b6ad9822SNuno Lopes Result = PTOGV(tmp + Offset.getSExtValue()); 5529de0d14dSChris Lattner return Result; 5539de0d14dSChris Lattner } 5544fd528f2SReid Spencer case Instruction::Trunc: { 5554fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 5564fd528f2SReid Spencer uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth(); 5574fd528f2SReid Spencer GV.IntVal = GV.IntVal.trunc(BitWidth); 5584fd528f2SReid Spencer return GV; 5594fd528f2SReid Spencer } 5604fd528f2SReid Spencer case Instruction::ZExt: { 5614fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 5624fd528f2SReid Spencer uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth(); 5634fd528f2SReid Spencer GV.IntVal = GV.IntVal.zext(BitWidth); 5644fd528f2SReid Spencer return GV; 5654fd528f2SReid Spencer } 5664fd528f2SReid Spencer case Instruction::SExt: { 5674fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 5684fd528f2SReid Spencer uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth(); 5694fd528f2SReid Spencer GV.IntVal = GV.IntVal.sext(BitWidth); 5704fd528f2SReid Spencer return GV; 5714fd528f2SReid Spencer } 5724fd528f2SReid Spencer case Instruction::FPTrunc: { 573a1336cf5SDale Johannesen // FIXME long double 5744fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 5754fd528f2SReid Spencer GV.FloatVal = float(GV.DoubleVal); 5764fd528f2SReid Spencer return GV; 5774fd528f2SReid Spencer } 5784fd528f2SReid Spencer case Instruction::FPExt:{ 579a1336cf5SDale Johannesen // FIXME long double 5804fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 5814fd528f2SReid Spencer GV.DoubleVal = double(GV.FloatVal); 5824fd528f2SReid Spencer return GV; 5834fd528f2SReid Spencer } 5844fd528f2SReid Spencer case Instruction::UIToFP: { 5854fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 586fdd87907SChris Lattner if (CE->getType()->isFloatTy()) 5874fd528f2SReid Spencer GV.FloatVal = float(GV.IntVal.roundToDouble()); 588fdd87907SChris Lattner else if (CE->getType()->isDoubleTy()) 5894fd528f2SReid Spencer GV.DoubleVal = GV.IntVal.roundToDouble(); 590fdd87907SChris Lattner else if (CE->getType()->isX86_FP80Ty()) { 59131920b0aSBenjamin Kramer APFloat apf = APFloat::getZero(APFloat::x87DoubleExtended); 592ca24fd90SDan Gohman (void)apf.convertFromAPInt(GV.IntVal, 593ca24fd90SDan Gohman false, 5949150652bSDale Johannesen APFloat::rmNearestTiesToEven); 59554306fe4SDale Johannesen GV.IntVal = apf.bitcastToAPInt(); 596a1336cf5SDale Johannesen } 5974fd528f2SReid Spencer return GV; 5984fd528f2SReid Spencer } 5994fd528f2SReid Spencer case Instruction::SIToFP: { 6004fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 601fdd87907SChris Lattner if (CE->getType()->isFloatTy()) 6024fd528f2SReid Spencer GV.FloatVal = float(GV.IntVal.signedRoundToDouble()); 603fdd87907SChris Lattner else if (CE->getType()->isDoubleTy()) 6044fd528f2SReid Spencer GV.DoubleVal = GV.IntVal.signedRoundToDouble(); 605fdd87907SChris Lattner else if (CE->getType()->isX86_FP80Ty()) { 60631920b0aSBenjamin Kramer APFloat apf = APFloat::getZero(APFloat::x87DoubleExtended); 607ca24fd90SDan Gohman (void)apf.convertFromAPInt(GV.IntVal, 608ca24fd90SDan Gohman true, 6099150652bSDale Johannesen APFloat::rmNearestTiesToEven); 61054306fe4SDale Johannesen GV.IntVal = apf.bitcastToAPInt(); 611a1336cf5SDale Johannesen } 6124fd528f2SReid Spencer return GV; 6134fd528f2SReid Spencer } 6144fd528f2SReid Spencer case Instruction::FPToUI: // double->APInt conversion handles sign 6154fd528f2SReid Spencer case Instruction::FPToSI: { 6164fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 6174fd528f2SReid Spencer uint32_t BitWidth = cast<IntegerType>(CE->getType())->getBitWidth(); 618fdd87907SChris Lattner if (Op0->getType()->isFloatTy()) 6194fd528f2SReid Spencer GV.IntVal = APIntOps::RoundFloatToAPInt(GV.FloatVal, BitWidth); 620fdd87907SChris Lattner else if (Op0->getType()->isDoubleTy()) 6214fd528f2SReid Spencer GV.IntVal = APIntOps::RoundDoubleToAPInt(GV.DoubleVal, BitWidth); 622fdd87907SChris Lattner else if (Op0->getType()->isX86_FP80Ty()) { 62329178a34STim Northover APFloat apf = APFloat(APFloat::x87DoubleExtended, GV.IntVal); 624a1336cf5SDale Johannesen uint64_t v; 6254f0bd68cSDale Johannesen bool ignored; 626a1336cf5SDale Johannesen (void)apf.convertToInteger(&v, BitWidth, 627a1336cf5SDale Johannesen CE->getOpcode()==Instruction::FPToSI, 6284f0bd68cSDale Johannesen APFloat::rmTowardZero, &ignored); 629a1336cf5SDale Johannesen GV.IntVal = v; // endian? 630a1336cf5SDale Johannesen } 6314fd528f2SReid Spencer return GV; 6324fd528f2SReid Spencer } 6336c38f0bbSReid Spencer case Instruction::PtrToInt: { 6344fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 6357c68bebbSRafael Espindola uint32_t PtrWidth = DL->getTypeSizeInBits(Op0->getType()); 636fc1f2cd3SEli Friedman assert(PtrWidth <= 64 && "Bad pointer width"); 6374fd528f2SReid Spencer GV.IntVal = APInt(PtrWidth, uintptr_t(GV.PointerVal)); 6387c68bebbSRafael Espindola uint32_t IntWidth = DL->getTypeSizeInBits(CE->getType()); 639fc1f2cd3SEli Friedman GV.IntVal = GV.IntVal.zextOrTrunc(IntWidth); 6404fd528f2SReid Spencer return GV; 6414fd528f2SReid Spencer } 6424fd528f2SReid Spencer case Instruction::IntToPtr: { 6434fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 6447c68bebbSRafael Espindola uint32_t PtrWidth = DL->getTypeSizeInBits(CE->getType()); 6454fd528f2SReid Spencer GV.IntVal = GV.IntVal.zextOrTrunc(PtrWidth); 6464fd528f2SReid Spencer assert(GV.IntVal.getBitWidth() <= 64 && "Bad pointer width"); 6474fd528f2SReid Spencer GV.PointerVal = PointerTy(uintptr_t(GV.IntVal.getZExtValue())); 6486c38f0bbSReid Spencer return GV; 6496c38f0bbSReid Spencer } 6506c38f0bbSReid Spencer case Instruction::BitCast: { 6514fd528f2SReid Spencer GenericValue GV = getConstantValue(Op0); 652229907cdSChris Lattner Type* DestTy = CE->getType(); 6534fd528f2SReid Spencer switch (Op0->getType()->getTypeID()) { 654fbcc663cSTorok Edwin default: llvm_unreachable("Invalid bitcast operand"); 6554fd528f2SReid Spencer case Type::IntegerTyID: 6569dff9becSDuncan Sands assert(DestTy->isFloatingPointTy() && "invalid bitcast"); 657fdd87907SChris Lattner if (DestTy->isFloatTy()) 6584fd528f2SReid Spencer GV.FloatVal = GV.IntVal.bitsToFloat(); 659fdd87907SChris Lattner else if (DestTy->isDoubleTy()) 6604fd528f2SReid Spencer GV.DoubleVal = GV.IntVal.bitsToDouble(); 6616c38f0bbSReid Spencer break; 6624fd528f2SReid Spencer case Type::FloatTyID: 6639dff9becSDuncan Sands assert(DestTy->isIntegerTy(32) && "Invalid bitcast"); 6643447fb01SJay Foad GV.IntVal = APInt::floatToBits(GV.FloatVal); 6654fd528f2SReid Spencer break; 6664fd528f2SReid Spencer case Type::DoubleTyID: 6679dff9becSDuncan Sands assert(DestTy->isIntegerTy(64) && "Invalid bitcast"); 6683447fb01SJay Foad GV.IntVal = APInt::doubleToBits(GV.DoubleVal); 6694fd528f2SReid Spencer break; 6704fd528f2SReid Spencer case Type::PointerTyID: 67119d0b47bSDuncan Sands assert(DestTy->isPointerTy() && "Invalid bitcast"); 6724fd528f2SReid Spencer break; // getConstantValue(Op0) above already converted it 6736c38f0bbSReid Spencer } 6744fd528f2SReid Spencer return GV; 67568cbcc3eSChris Lattner } 67668cbcc3eSChris Lattner case Instruction::Add: 677a5b9645cSDan Gohman case Instruction::FAdd: 6784fd528f2SReid Spencer case Instruction::Sub: 679a5b9645cSDan Gohman case Instruction::FSub: 6804fd528f2SReid Spencer case Instruction::Mul: 681a5b9645cSDan Gohman case Instruction::FMul: 6824fd528f2SReid Spencer case Instruction::UDiv: 6834fd528f2SReid Spencer case Instruction::SDiv: 6844fd528f2SReid Spencer case Instruction::URem: 6854fd528f2SReid Spencer case Instruction::SRem: 6864fd528f2SReid Spencer case Instruction::And: 6874fd528f2SReid Spencer case Instruction::Or: 6884fd528f2SReid Spencer case Instruction::Xor: { 6894fd528f2SReid Spencer GenericValue LHS = getConstantValue(Op0); 6904fd528f2SReid Spencer GenericValue RHS = getConstantValue(CE->getOperand(1)); 6914fd528f2SReid Spencer GenericValue GV; 692c4e6bb5fSChris Lattner switch (CE->getOperand(0)->getType()->getTypeID()) { 693fbcc663cSTorok Edwin default: llvm_unreachable("Bad add type!"); 6947a9c62baSReid Spencer case Type::IntegerTyID: 6954fd528f2SReid Spencer switch (CE->getOpcode()) { 696fbcc663cSTorok Edwin default: llvm_unreachable("Invalid integer opcode"); 6974fd528f2SReid Spencer case Instruction::Add: GV.IntVal = LHS.IntVal + RHS.IntVal; break; 6984fd528f2SReid Spencer case Instruction::Sub: GV.IntVal = LHS.IntVal - RHS.IntVal; break; 6994fd528f2SReid Spencer case Instruction::Mul: GV.IntVal = LHS.IntVal * RHS.IntVal; break; 7004fd528f2SReid Spencer case Instruction::UDiv:GV.IntVal = LHS.IntVal.udiv(RHS.IntVal); break; 7014fd528f2SReid Spencer case Instruction::SDiv:GV.IntVal = LHS.IntVal.sdiv(RHS.IntVal); break; 7024fd528f2SReid Spencer case Instruction::URem:GV.IntVal = LHS.IntVal.urem(RHS.IntVal); break; 7034fd528f2SReid Spencer case Instruction::SRem:GV.IntVal = LHS.IntVal.srem(RHS.IntVal); break; 7044fd528f2SReid Spencer case Instruction::And: GV.IntVal = LHS.IntVal & RHS.IntVal; break; 7054fd528f2SReid Spencer case Instruction::Or: GV.IntVal = LHS.IntVal | RHS.IntVal; break; 7064fd528f2SReid Spencer case Instruction::Xor: GV.IntVal = LHS.IntVal ^ RHS.IntVal; break; 7074fd528f2SReid Spencer } 708c4e6bb5fSChris Lattner break; 709c4e6bb5fSChris Lattner case Type::FloatTyID: 7104fd528f2SReid Spencer switch (CE->getOpcode()) { 711fbcc663cSTorok Edwin default: llvm_unreachable("Invalid float opcode"); 712a5b9645cSDan Gohman case Instruction::FAdd: 7134fd528f2SReid Spencer GV.FloatVal = LHS.FloatVal + RHS.FloatVal; break; 714a5b9645cSDan Gohman case Instruction::FSub: 7154fd528f2SReid Spencer GV.FloatVal = LHS.FloatVal - RHS.FloatVal; break; 716a5b9645cSDan Gohman case Instruction::FMul: 7174fd528f2SReid Spencer GV.FloatVal = LHS.FloatVal * RHS.FloatVal; break; 7184fd528f2SReid Spencer case Instruction::FDiv: 7194fd528f2SReid Spencer GV.FloatVal = LHS.FloatVal / RHS.FloatVal; break; 7204fd528f2SReid Spencer case Instruction::FRem: 72193cd0f1cSChris Lattner GV.FloatVal = std::fmod(LHS.FloatVal,RHS.FloatVal); break; 7224fd528f2SReid Spencer } 723c4e6bb5fSChris Lattner break; 724c4e6bb5fSChris Lattner case Type::DoubleTyID: 7254fd528f2SReid Spencer switch (CE->getOpcode()) { 726fbcc663cSTorok Edwin default: llvm_unreachable("Invalid double opcode"); 727a5b9645cSDan Gohman case Instruction::FAdd: 7284fd528f2SReid Spencer GV.DoubleVal = LHS.DoubleVal + RHS.DoubleVal; break; 729a5b9645cSDan Gohman case Instruction::FSub: 7304fd528f2SReid Spencer GV.DoubleVal = LHS.DoubleVal - RHS.DoubleVal; break; 731a5b9645cSDan Gohman case Instruction::FMul: 7324fd528f2SReid Spencer GV.DoubleVal = LHS.DoubleVal * RHS.DoubleVal; break; 7334fd528f2SReid Spencer case Instruction::FDiv: 7344fd528f2SReid Spencer GV.DoubleVal = LHS.DoubleVal / RHS.DoubleVal; break; 7354fd528f2SReid Spencer case Instruction::FRem: 73693cd0f1cSChris Lattner GV.DoubleVal = std::fmod(LHS.DoubleVal,RHS.DoubleVal); break; 7374fd528f2SReid Spencer } 738c4e6bb5fSChris Lattner break; 739a1336cf5SDale Johannesen case Type::X86_FP80TyID: 740a1336cf5SDale Johannesen case Type::PPC_FP128TyID: 741a1336cf5SDale Johannesen case Type::FP128TyID: { 74229178a34STim Northover const fltSemantics &Sem = CE->getOperand(0)->getType()->getFltSemantics(); 74329178a34STim Northover APFloat apfLHS = APFloat(Sem, LHS.IntVal); 744a1336cf5SDale Johannesen switch (CE->getOpcode()) { 745e4f47434SDaniel Dunbar default: llvm_unreachable("Invalid long double opcode"); 746a5b9645cSDan Gohman case Instruction::FAdd: 74729178a34STim Northover apfLHS.add(APFloat(Sem, RHS.IntVal), APFloat::rmNearestTiesToEven); 74854306fe4SDale Johannesen GV.IntVal = apfLHS.bitcastToAPInt(); 749a1336cf5SDale Johannesen break; 750a5b9645cSDan Gohman case Instruction::FSub: 75129178a34STim Northover apfLHS.subtract(APFloat(Sem, RHS.IntVal), 75229178a34STim Northover APFloat::rmNearestTiesToEven); 75354306fe4SDale Johannesen GV.IntVal = apfLHS.bitcastToAPInt(); 754a1336cf5SDale Johannesen break; 755a5b9645cSDan Gohman case Instruction::FMul: 75629178a34STim Northover apfLHS.multiply(APFloat(Sem, RHS.IntVal), 75729178a34STim Northover APFloat::rmNearestTiesToEven); 75854306fe4SDale Johannesen GV.IntVal = apfLHS.bitcastToAPInt(); 759a1336cf5SDale Johannesen break; 760a1336cf5SDale Johannesen case Instruction::FDiv: 76129178a34STim Northover apfLHS.divide(APFloat(Sem, RHS.IntVal), 76229178a34STim Northover APFloat::rmNearestTiesToEven); 76354306fe4SDale Johannesen GV.IntVal = apfLHS.bitcastToAPInt(); 764a1336cf5SDale Johannesen break; 765a1336cf5SDale Johannesen case Instruction::FRem: 76629178a34STim Northover apfLHS.mod(APFloat(Sem, RHS.IntVal), 76729178a34STim Northover APFloat::rmNearestTiesToEven); 76854306fe4SDale Johannesen GV.IntVal = apfLHS.bitcastToAPInt(); 769a1336cf5SDale Johannesen break; 770a1336cf5SDale Johannesen } 771a1336cf5SDale Johannesen } 772a1336cf5SDale Johannesen break; 773c4e6bb5fSChris Lattner } 7744fd528f2SReid Spencer return GV; 7754fd528f2SReid Spencer } 7769de0d14dSChris Lattner default: 77768cbcc3eSChris Lattner break; 77868cbcc3eSChris Lattner } 779868e3f09SDaniel Dunbar 780868e3f09SDaniel Dunbar SmallString<256> Msg; 781868e3f09SDaniel Dunbar raw_svector_ostream OS(Msg); 782868e3f09SDaniel Dunbar OS << "ConstantExpr not handled: " << *CE; 783868e3f09SDaniel Dunbar report_fatal_error(OS.str()); 7849de0d14dSChris Lattner } 785996fe010SChris Lattner 786868e3f09SDaniel Dunbar // Otherwise, we have a simple constant. 7874fd528f2SReid Spencer GenericValue Result; 7886b727599SChris Lattner switch (C->getType()->getTypeID()) { 78987aa65f4SReid Spencer case Type::FloatTyID: 790bed9dc42SDale Johannesen Result.FloatVal = cast<ConstantFP>(C)->getValueAPF().convertToFloat(); 7917a9c62baSReid Spencer break; 79287aa65f4SReid Spencer case Type::DoubleTyID: 793bed9dc42SDale Johannesen Result.DoubleVal = cast<ConstantFP>(C)->getValueAPF().convertToDouble(); 79487aa65f4SReid Spencer break; 795a1336cf5SDale Johannesen case Type::X86_FP80TyID: 796a1336cf5SDale Johannesen case Type::FP128TyID: 797a1336cf5SDale Johannesen case Type::PPC_FP128TyID: 79854306fe4SDale Johannesen Result.IntVal = cast <ConstantFP>(C)->getValueAPF().bitcastToAPInt(); 799a1336cf5SDale Johannesen break; 80087aa65f4SReid Spencer case Type::IntegerTyID: 80187aa65f4SReid Spencer Result.IntVal = cast<ConstantInt>(C)->getValue(); 80287aa65f4SReid Spencer break; 803996fe010SChris Lattner case Type::PointerTyID: 8046a0fd73bSReid Spencer if (isa<ConstantPointerNull>(C)) 8052617dcceSCraig Topper Result.PointerVal = nullptr; 8066a0fd73bSReid Spencer else if (const Function *F = dyn_cast<Function>(C)) 8076a0fd73bSReid Spencer Result = PTOGV(getPointerToFunctionOrStub(const_cast<Function*>(F))); 8086a0fd73bSReid Spencer else if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(C)) 8096a0fd73bSReid Spencer Result = PTOGV(getOrEmitGlobalVariable(const_cast<GlobalVariable*>(GV))); 810e6492f10SChris Lattner else 811fbcc663cSTorok Edwin llvm_unreachable("Unknown constant pointer type!"); 812996fe010SChris Lattner break; 813be79a7acSNadav Rotem case Type::VectorTyID: { 814be79a7acSNadav Rotem unsigned elemNum; 815be79a7acSNadav Rotem Type* ElemTy; 816be79a7acSNadav Rotem const ConstantDataVector *CDV = dyn_cast<ConstantDataVector>(C); 817be79a7acSNadav Rotem const ConstantVector *CV = dyn_cast<ConstantVector>(C); 818be79a7acSNadav Rotem const ConstantAggregateZero *CAZ = dyn_cast<ConstantAggregateZero>(C); 819be79a7acSNadav Rotem 820be79a7acSNadav Rotem if (CDV) { 821be79a7acSNadav Rotem elemNum = CDV->getNumElements(); 822be79a7acSNadav Rotem ElemTy = CDV->getElementType(); 823be79a7acSNadav Rotem } else if (CV || CAZ) { 824be79a7acSNadav Rotem VectorType* VTy = dyn_cast<VectorType>(C->getType()); 825be79a7acSNadav Rotem elemNum = VTy->getNumElements(); 826be79a7acSNadav Rotem ElemTy = VTy->getElementType(); 827be79a7acSNadav Rotem } else { 828be79a7acSNadav Rotem llvm_unreachable("Unknown constant vector type!"); 829be79a7acSNadav Rotem } 830be79a7acSNadav Rotem 831be79a7acSNadav Rotem Result.AggregateVal.resize(elemNum); 832be79a7acSNadav Rotem // Check if vector holds floats. 833be79a7acSNadav Rotem if(ElemTy->isFloatTy()) { 834be79a7acSNadav Rotem if (CAZ) { 835be79a7acSNadav Rotem GenericValue floatZero; 836be79a7acSNadav Rotem floatZero.FloatVal = 0.f; 837be79a7acSNadav Rotem std::fill(Result.AggregateVal.begin(), Result.AggregateVal.end(), 838be79a7acSNadav Rotem floatZero); 839be79a7acSNadav Rotem break; 840be79a7acSNadav Rotem } 841be79a7acSNadav Rotem if(CV) { 842be79a7acSNadav Rotem for (unsigned i = 0; i < elemNum; ++i) 843be79a7acSNadav Rotem if (!isa<UndefValue>(CV->getOperand(i))) 844be79a7acSNadav Rotem Result.AggregateVal[i].FloatVal = cast<ConstantFP>( 845be79a7acSNadav Rotem CV->getOperand(i))->getValueAPF().convertToFloat(); 846be79a7acSNadav Rotem break; 847be79a7acSNadav Rotem } 848be79a7acSNadav Rotem if(CDV) 849be79a7acSNadav Rotem for (unsigned i = 0; i < elemNum; ++i) 850be79a7acSNadav Rotem Result.AggregateVal[i].FloatVal = CDV->getElementAsFloat(i); 851be79a7acSNadav Rotem 852be79a7acSNadav Rotem break; 853be79a7acSNadav Rotem } 854be79a7acSNadav Rotem // Check if vector holds doubles. 855be79a7acSNadav Rotem if (ElemTy->isDoubleTy()) { 856be79a7acSNadav Rotem if (CAZ) { 857be79a7acSNadav Rotem GenericValue doubleZero; 858be79a7acSNadav Rotem doubleZero.DoubleVal = 0.0; 859be79a7acSNadav Rotem std::fill(Result.AggregateVal.begin(), Result.AggregateVal.end(), 860be79a7acSNadav Rotem doubleZero); 861be79a7acSNadav Rotem break; 862be79a7acSNadav Rotem } 863be79a7acSNadav Rotem if(CV) { 864be79a7acSNadav Rotem for (unsigned i = 0; i < elemNum; ++i) 865be79a7acSNadav Rotem if (!isa<UndefValue>(CV->getOperand(i))) 866be79a7acSNadav Rotem Result.AggregateVal[i].DoubleVal = cast<ConstantFP>( 867be79a7acSNadav Rotem CV->getOperand(i))->getValueAPF().convertToDouble(); 868be79a7acSNadav Rotem break; 869be79a7acSNadav Rotem } 870be79a7acSNadav Rotem if(CDV) 871be79a7acSNadav Rotem for (unsigned i = 0; i < elemNum; ++i) 872be79a7acSNadav Rotem Result.AggregateVal[i].DoubleVal = CDV->getElementAsDouble(i); 873be79a7acSNadav Rotem 874be79a7acSNadav Rotem break; 875be79a7acSNadav Rotem } 876be79a7acSNadav Rotem // Check if vector holds integers. 877be79a7acSNadav Rotem if (ElemTy->isIntegerTy()) { 878be79a7acSNadav Rotem if (CAZ) { 879be79a7acSNadav Rotem GenericValue intZero; 880be79a7acSNadav Rotem intZero.IntVal = APInt(ElemTy->getScalarSizeInBits(), 0ull); 881be79a7acSNadav Rotem std::fill(Result.AggregateVal.begin(), Result.AggregateVal.end(), 882be79a7acSNadav Rotem intZero); 883be79a7acSNadav Rotem break; 884be79a7acSNadav Rotem } 885be79a7acSNadav Rotem if(CV) { 886be79a7acSNadav Rotem for (unsigned i = 0; i < elemNum; ++i) 887be79a7acSNadav Rotem if (!isa<UndefValue>(CV->getOperand(i))) 888be79a7acSNadav Rotem Result.AggregateVal[i].IntVal = cast<ConstantInt>( 889be79a7acSNadav Rotem CV->getOperand(i))->getValue(); 890be79a7acSNadav Rotem else { 891be79a7acSNadav Rotem Result.AggregateVal[i].IntVal = 892be79a7acSNadav Rotem APInt(CV->getOperand(i)->getType()->getPrimitiveSizeInBits(), 0); 893be79a7acSNadav Rotem } 894be79a7acSNadav Rotem break; 895be79a7acSNadav Rotem } 896be79a7acSNadav Rotem if(CDV) 897be79a7acSNadav Rotem for (unsigned i = 0; i < elemNum; ++i) 898be79a7acSNadav Rotem Result.AggregateVal[i].IntVal = APInt( 899be79a7acSNadav Rotem CDV->getElementType()->getPrimitiveSizeInBits(), 900be79a7acSNadav Rotem CDV->getElementAsInteger(i)); 901be79a7acSNadav Rotem 902be79a7acSNadav Rotem break; 903be79a7acSNadav Rotem } 904be79a7acSNadav Rotem llvm_unreachable("Unknown constant pointer type!"); 905be79a7acSNadav Rotem } 906be79a7acSNadav Rotem break; 907be79a7acSNadav Rotem 908996fe010SChris Lattner default: 909868e3f09SDaniel Dunbar SmallString<256> Msg; 910868e3f09SDaniel Dunbar raw_svector_ostream OS(Msg); 911868e3f09SDaniel Dunbar OS << "ERROR: Constant unimplemented for type: " << *C->getType(); 912868e3f09SDaniel Dunbar report_fatal_error(OS.str()); 913996fe010SChris Lattner } 914868e3f09SDaniel Dunbar 915996fe010SChris Lattner return Result; 916996fe010SChris Lattner } 917996fe010SChris Lattner 9181202d1b1SDuncan Sands /// StoreIntToMemory - Fills the StoreBytes bytes of memory starting from Dst 9191202d1b1SDuncan Sands /// with the integer held in IntVal. 9201202d1b1SDuncan Sands static void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, 9211202d1b1SDuncan Sands unsigned StoreBytes) { 9221202d1b1SDuncan Sands assert((IntVal.getBitWidth()+7)/8 >= StoreBytes && "Integer too small!"); 923ad06cee2SRoman Divacky const uint8_t *Src = (const uint8_t *)IntVal.getRawData(); 9245c65cb46SDuncan Sands 92541cb64f4SRafael Espindola if (sys::IsLittleEndianHost) { 9261202d1b1SDuncan Sands // Little-endian host - the source is ordered from LSB to MSB. Order the 9271202d1b1SDuncan Sands // destination from LSB to MSB: Do a straight copy. 9285c65cb46SDuncan Sands memcpy(Dst, Src, StoreBytes); 929868e3f09SDaniel Dunbar } else { 9305c65cb46SDuncan Sands // Big-endian host - the source is an array of 64 bit words ordered from 9311202d1b1SDuncan Sands // LSW to MSW. Each word is ordered from MSB to LSB. Order the destination 9321202d1b1SDuncan Sands // from MSB to LSB: Reverse the word order, but not the bytes in a word. 9335c65cb46SDuncan Sands while (StoreBytes > sizeof(uint64_t)) { 9345c65cb46SDuncan Sands StoreBytes -= sizeof(uint64_t); 9355c65cb46SDuncan Sands // May not be aligned so use memcpy. 9365c65cb46SDuncan Sands memcpy(Dst + StoreBytes, Src, sizeof(uint64_t)); 9375c65cb46SDuncan Sands Src += sizeof(uint64_t); 9385c65cb46SDuncan Sands } 9395c65cb46SDuncan Sands 9405c65cb46SDuncan Sands memcpy(Dst, Src + sizeof(uint64_t) - StoreBytes, StoreBytes); 941815f8dd2SReid Spencer } 9427a9c62baSReid Spencer } 9431202d1b1SDuncan Sands 94409053e62SEvan Cheng void ExecutionEngine::StoreValueToMemory(const GenericValue &Val, 945229907cdSChris Lattner GenericValue *Ptr, Type *Ty) { 946cdfe20b9SMicah Villmow const unsigned StoreBytes = getDataLayout()->getTypeStoreSize(Ty); 9471202d1b1SDuncan Sands 9481202d1b1SDuncan Sands switch (Ty->getTypeID()) { 949be79a7acSNadav Rotem default: 950be79a7acSNadav Rotem dbgs() << "Cannot store value of type " << *Ty << "!\n"; 951be79a7acSNadav Rotem break; 9521202d1b1SDuncan Sands case Type::IntegerTyID: 9531202d1b1SDuncan Sands StoreIntToMemory(Val.IntVal, (uint8_t*)Ptr, StoreBytes); 9541202d1b1SDuncan Sands break; 955996fe010SChris Lattner case Type::FloatTyID: 95687aa65f4SReid Spencer *((float*)Ptr) = Val.FloatVal; 95787aa65f4SReid Spencer break; 95887aa65f4SReid Spencer case Type::DoubleTyID: 95987aa65f4SReid Spencer *((double*)Ptr) = Val.DoubleVal; 960996fe010SChris Lattner break; 9614d7e4ee7SDale Johannesen case Type::X86_FP80TyID: 9624d7e4ee7SDale Johannesen memcpy(Ptr, Val.IntVal.getRawData(), 10); 963a1336cf5SDale Johannesen break; 9647a9c62baSReid Spencer case Type::PointerTyID: 9651202d1b1SDuncan Sands // Ensure 64 bit target pointers are fully initialized on 32 bit hosts. 9661202d1b1SDuncan Sands if (StoreBytes != sizeof(PointerTy)) 96793da3c82SChandler Carruth memset(&(Ptr->PointerVal), 0, StoreBytes); 9681202d1b1SDuncan Sands 96987aa65f4SReid Spencer *((PointerTy*)Ptr) = Val.PointerVal; 970996fe010SChris Lattner break; 971be79a7acSNadav Rotem case Type::VectorTyID: 972be79a7acSNadav Rotem for (unsigned i = 0; i < Val.AggregateVal.size(); ++i) { 973be79a7acSNadav Rotem if (cast<VectorType>(Ty)->getElementType()->isDoubleTy()) 974be79a7acSNadav Rotem *(((double*)Ptr)+i) = Val.AggregateVal[i].DoubleVal; 975be79a7acSNadav Rotem if (cast<VectorType>(Ty)->getElementType()->isFloatTy()) 976be79a7acSNadav Rotem *(((float*)Ptr)+i) = Val.AggregateVal[i].FloatVal; 977be79a7acSNadav Rotem if (cast<VectorType>(Ty)->getElementType()->isIntegerTy()) { 978be79a7acSNadav Rotem unsigned numOfBytes =(Val.AggregateVal[i].IntVal.getBitWidth()+7)/8; 979be79a7acSNadav Rotem StoreIntToMemory(Val.AggregateVal[i].IntVal, 980be79a7acSNadav Rotem (uint8_t*)Ptr + numOfBytes*i, numOfBytes); 981be79a7acSNadav Rotem } 982be79a7acSNadav Rotem } 983be79a7acSNadav Rotem break; 984996fe010SChris Lattner } 9851202d1b1SDuncan Sands 98641cb64f4SRafael Espindola if (sys::IsLittleEndianHost != getDataLayout()->isLittleEndian()) 9871202d1b1SDuncan Sands // Host and target are different endian - reverse the stored bytes. 9881202d1b1SDuncan Sands std::reverse((uint8_t*)Ptr, StoreBytes + (uint8_t*)Ptr); 989996fe010SChris Lattner } 990996fe010SChris Lattner 9911202d1b1SDuncan Sands /// LoadIntFromMemory - Loads the integer stored in the LoadBytes bytes starting 9921202d1b1SDuncan Sands /// from Src into IntVal, which is assumed to be wide enough and to hold zero. 9931202d1b1SDuncan Sands static void LoadIntFromMemory(APInt &IntVal, uint8_t *Src, unsigned LoadBytes) { 9941202d1b1SDuncan Sands assert((IntVal.getBitWidth()+7)/8 >= LoadBytes && "Integer too small!"); 99582b63578SDavid Greene uint8_t *Dst = reinterpret_cast<uint8_t *>( 99682b63578SDavid Greene const_cast<uint64_t *>(IntVal.getRawData())); 9975c65cb46SDuncan Sands 99841cb64f4SRafael Espindola if (sys::IsLittleEndianHost) 9995c65cb46SDuncan Sands // Little-endian host - the destination must be ordered from LSB to MSB. 10005c65cb46SDuncan Sands // The source is ordered from LSB to MSB: Do a straight copy. 10015c65cb46SDuncan Sands memcpy(Dst, Src, LoadBytes); 10025c65cb46SDuncan Sands else { 10035c65cb46SDuncan Sands // Big-endian - the destination is an array of 64 bit words ordered from 10045c65cb46SDuncan Sands // LSW to MSW. Each word must be ordered from MSB to LSB. The source is 10055c65cb46SDuncan Sands // ordered from MSB to LSB: Reverse the word order, but not the bytes in 10065c65cb46SDuncan Sands // a word. 10075c65cb46SDuncan Sands while (LoadBytes > sizeof(uint64_t)) { 10085c65cb46SDuncan Sands LoadBytes -= sizeof(uint64_t); 10095c65cb46SDuncan Sands // May not be aligned so use memcpy. 10105c65cb46SDuncan Sands memcpy(Dst, Src + LoadBytes, sizeof(uint64_t)); 10115c65cb46SDuncan Sands Dst += sizeof(uint64_t); 10125c65cb46SDuncan Sands } 10135c65cb46SDuncan Sands 10145c65cb46SDuncan Sands memcpy(Dst + sizeof(uint64_t) - LoadBytes, Src, LoadBytes); 10155c65cb46SDuncan Sands } 10167a9c62baSReid Spencer } 10171202d1b1SDuncan Sands 10181202d1b1SDuncan Sands /// FIXME: document 10191202d1b1SDuncan Sands /// 10201202d1b1SDuncan Sands void ExecutionEngine::LoadValueFromMemory(GenericValue &Result, 10211202d1b1SDuncan Sands GenericValue *Ptr, 1022229907cdSChris Lattner Type *Ty) { 1023cdfe20b9SMicah Villmow const unsigned LoadBytes = getDataLayout()->getTypeStoreSize(Ty); 10241202d1b1SDuncan Sands 10251202d1b1SDuncan Sands switch (Ty->getTypeID()) { 10261202d1b1SDuncan Sands case Type::IntegerTyID: 10271202d1b1SDuncan Sands // An APInt with all words initially zero. 10281202d1b1SDuncan Sands Result.IntVal = APInt(cast<IntegerType>(Ty)->getBitWidth(), 0); 10291202d1b1SDuncan Sands LoadIntFromMemory(Result.IntVal, (uint8_t*)Ptr, LoadBytes); 10301202d1b1SDuncan Sands break; 10317f389e8cSChris Lattner case Type::FloatTyID: 103287aa65f4SReid Spencer Result.FloatVal = *((float*)Ptr); 103387aa65f4SReid Spencer break; 103487aa65f4SReid Spencer case Type::DoubleTyID: 103587aa65f4SReid Spencer Result.DoubleVal = *((double*)Ptr); 10367f389e8cSChris Lattner break; 10377a9c62baSReid Spencer case Type::PointerTyID: 103887aa65f4SReid Spencer Result.PointerVal = *((PointerTy*)Ptr); 10397f389e8cSChris Lattner break; 1040a1336cf5SDale Johannesen case Type::X86_FP80TyID: { 1041a1336cf5SDale Johannesen // This is endian dependent, but it will only work on x86 anyway. 104226d6539eSDuncan Sands // FIXME: Will not trap if loading a signaling NaN. 1043ff306287SDuncan Sands uint64_t y[2]; 10444d7e4ee7SDale Johannesen memcpy(y, Ptr, 10); 10457a162881SJeffrey Yasskin Result.IntVal = APInt(80, y); 1046a1336cf5SDale Johannesen break; 1047a1336cf5SDale Johannesen } 1048be79a7acSNadav Rotem case Type::VectorTyID: { 1049be79a7acSNadav Rotem const VectorType *VT = cast<VectorType>(Ty); 1050be79a7acSNadav Rotem const Type *ElemT = VT->getElementType(); 1051be79a7acSNadav Rotem const unsigned numElems = VT->getNumElements(); 1052be79a7acSNadav Rotem if (ElemT->isFloatTy()) { 1053be79a7acSNadav Rotem Result.AggregateVal.resize(numElems); 1054be79a7acSNadav Rotem for (unsigned i = 0; i < numElems; ++i) 1055be79a7acSNadav Rotem Result.AggregateVal[i].FloatVal = *((float*)Ptr+i); 1056be79a7acSNadav Rotem } 1057be79a7acSNadav Rotem if (ElemT->isDoubleTy()) { 1058be79a7acSNadav Rotem Result.AggregateVal.resize(numElems); 1059be79a7acSNadav Rotem for (unsigned i = 0; i < numElems; ++i) 1060be79a7acSNadav Rotem Result.AggregateVal[i].DoubleVal = *((double*)Ptr+i); 1061be79a7acSNadav Rotem } 1062be79a7acSNadav Rotem if (ElemT->isIntegerTy()) { 1063be79a7acSNadav Rotem GenericValue intZero; 1064be79a7acSNadav Rotem const unsigned elemBitWidth = cast<IntegerType>(ElemT)->getBitWidth(); 1065be79a7acSNadav Rotem intZero.IntVal = APInt(elemBitWidth, 0); 1066be79a7acSNadav Rotem Result.AggregateVal.resize(numElems, intZero); 1067be79a7acSNadav Rotem for (unsigned i = 0; i < numElems; ++i) 1068be79a7acSNadav Rotem LoadIntFromMemory(Result.AggregateVal[i].IntVal, 1069be79a7acSNadav Rotem (uint8_t*)Ptr+((elemBitWidth+7)/8)*i, (elemBitWidth+7)/8); 1070be79a7acSNadav Rotem } 1071be79a7acSNadav Rotem break; 1072be79a7acSNadav Rotem } 10737f389e8cSChris Lattner default: 1074868e3f09SDaniel Dunbar SmallString<256> Msg; 1075868e3f09SDaniel Dunbar raw_svector_ostream OS(Msg); 1076868e3f09SDaniel Dunbar OS << "Cannot load value of type " << *Ty << "!"; 1077868e3f09SDaniel Dunbar report_fatal_error(OS.str()); 10787f389e8cSChris Lattner } 10797f389e8cSChris Lattner } 10807f389e8cSChris Lattner 1081996fe010SChris Lattner void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { 10820967d2dfSDavid Greene DEBUG(dbgs() << "JIT: Initializing " << Addr << " "); 1083b086d382SDale Johannesen DEBUG(Init->dump()); 108400245f42SChris Lattner if (isa<UndefValue>(Init)) 108561753bf8SChris Lattner return; 108600245f42SChris Lattner 108700245f42SChris Lattner if (const ConstantVector *CP = dyn_cast<ConstantVector>(Init)) { 108869d62138SRobert Bocchino unsigned ElementSize = 1089cdfe20b9SMicah Villmow getDataLayout()->getTypeAllocSize(CP->getType()->getElementType()); 109069d62138SRobert Bocchino for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) 109169d62138SRobert Bocchino InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize); 109269d62138SRobert Bocchino return; 109300245f42SChris Lattner } 109400245f42SChris Lattner 109500245f42SChris Lattner if (isa<ConstantAggregateZero>(Init)) { 1096cdfe20b9SMicah Villmow memset(Addr, 0, (size_t)getDataLayout()->getTypeAllocSize(Init->getType())); 10971dd86b11SChris Lattner return; 109800245f42SChris Lattner } 109900245f42SChris Lattner 110000245f42SChris Lattner if (const ConstantArray *CPA = dyn_cast<ConstantArray>(Init)) { 110169ddfbfeSDan Gohman unsigned ElementSize = 1102cdfe20b9SMicah Villmow getDataLayout()->getTypeAllocSize(CPA->getType()->getElementType()); 110369ddfbfeSDan Gohman for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i) 110469ddfbfeSDan Gohman InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize); 110569ddfbfeSDan Gohman return; 110600245f42SChris Lattner } 110700245f42SChris Lattner 110800245f42SChris Lattner if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(Init)) { 110969ddfbfeSDan Gohman const StructLayout *SL = 1110cdfe20b9SMicah Villmow getDataLayout()->getStructLayout(cast<StructType>(CPS->getType())); 111169ddfbfeSDan Gohman for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i) 111269ddfbfeSDan Gohman InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i)); 111369ddfbfeSDan Gohman return; 111400245f42SChris Lattner } 111500245f42SChris Lattner 111600245f42SChris Lattner if (const ConstantDataSequential *CDS = 111700245f42SChris Lattner dyn_cast<ConstantDataSequential>(Init)) { 111800245f42SChris Lattner // CDS is already laid out in host memory order. 111900245f42SChris Lattner StringRef Data = CDS->getRawDataValues(); 112000245f42SChris Lattner memcpy(Addr, Data.data(), Data.size()); 112100245f42SChris Lattner return; 112200245f42SChris Lattner } 112300245f42SChris Lattner 112400245f42SChris Lattner if (Init->getType()->isFirstClassType()) { 1125996fe010SChris Lattner GenericValue Val = getConstantValue(Init); 1126996fe010SChris Lattner StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); 1127996fe010SChris Lattner return; 1128996fe010SChris Lattner } 1129996fe010SChris Lattner 1130868e3f09SDaniel Dunbar DEBUG(dbgs() << "Bad Type: " << *Init->getType() << "\n"); 1131fbcc663cSTorok Edwin llvm_unreachable("Unknown constant type to initialize memory with!"); 1132996fe010SChris Lattner } 1133996fe010SChris Lattner 1134996fe010SChris Lattner /// EmitGlobals - Emit all of the global variables to memory, storing their 1135996fe010SChris Lattner /// addresses into GlobalAddress. This must make sure to copy the contents of 1136996fe010SChris Lattner /// their initializers into the memory. 1137996fe010SChris Lattner void ExecutionEngine::emitGlobals() { 1138996fe010SChris Lattner // Loop over all of the global variables in the program, allocating the memory 11390621caefSChris Lattner // to hold them. If there is more than one module, do a prepass over globals 11400621caefSChris Lattner // to figure out how the different modules should link together. 1141229907cdSChris Lattner std::map<std::pair<std::string, Type*>, 11420621caefSChris Lattner const GlobalValue*> LinkedGlobalsMap; 11430621caefSChris Lattner 11440621caefSChris Lattner if (Modules.size() != 1) { 11450621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 1146091217beSJeffrey Yasskin Module &M = *Modules[m]; 114749bb65a4SRafael Espindola for (const auto &GV : M.globals()) { 114849bb65a4SRafael Espindola if (GV.hasLocalLinkage() || GV.isDeclaration() || 114949bb65a4SRafael Espindola GV.hasAppendingLinkage() || !GV.hasName()) 11500621caefSChris Lattner continue;// Ignore external globals and globals with internal linkage. 11510621caefSChris Lattner 11520621caefSChris Lattner const GlobalValue *&GVEntry = 115349bb65a4SRafael Espindola LinkedGlobalsMap[std::make_pair(GV.getName(), GV.getType())]; 11540621caefSChris Lattner 11550621caefSChris Lattner // If this is the first time we've seen this global, it is the canonical 11560621caefSChris Lattner // version. 11570621caefSChris Lattner if (!GVEntry) { 115849bb65a4SRafael Espindola GVEntry = &GV; 11590621caefSChris Lattner continue; 11600621caefSChris Lattner } 11610621caefSChris Lattner 11620621caefSChris Lattner // If the existing global is strong, never replace it. 11637157bb76SNico Rieck if (GVEntry->hasExternalLinkage()) 11640621caefSChris Lattner continue; 11650621caefSChris Lattner 11660621caefSChris Lattner // Otherwise, we know it's linkonce/weak, replace it if this is a strong 1167ce4396bcSDale Johannesen // symbol. FIXME is this right for common? 116849bb65a4SRafael Espindola if (GV.hasExternalLinkage() || GVEntry->hasExternalWeakLinkage()) 116949bb65a4SRafael Espindola GVEntry = &GV; 11700621caefSChris Lattner } 11710621caefSChris Lattner } 11720621caefSChris Lattner } 11730621caefSChris Lattner 11740621caefSChris Lattner std::vector<const GlobalValue*> NonCanonicalGlobals; 11750621caefSChris Lattner for (unsigned m = 0, e = Modules.size(); m != e; ++m) { 1176091217beSJeffrey Yasskin Module &M = *Modules[m]; 117749bb65a4SRafael Espindola for (const auto &GV : M.globals()) { 11780621caefSChris Lattner // In the multi-module case, see what this global maps to. 11790621caefSChris Lattner if (!LinkedGlobalsMap.empty()) { 11800621caefSChris Lattner if (const GlobalValue *GVEntry = 118149bb65a4SRafael Espindola LinkedGlobalsMap[std::make_pair(GV.getName(), GV.getType())]) { 11820621caefSChris Lattner // If something else is the canonical global, ignore this one. 118349bb65a4SRafael Espindola if (GVEntry != &GV) { 118449bb65a4SRafael Espindola NonCanonicalGlobals.push_back(&GV); 11850621caefSChris Lattner continue; 11860621caefSChris Lattner } 11870621caefSChris Lattner } 11880621caefSChris Lattner } 11890621caefSChris Lattner 119049bb65a4SRafael Espindola if (!GV.isDeclaration()) { 119149bb65a4SRafael Espindola addGlobalMapping(&GV, getMemoryForGV(&GV)); 1192996fe010SChris Lattner } else { 1193e8bbcfc2SBrian Gaeke // External variable reference. Try to use the dynamic loader to 1194e8bbcfc2SBrian Gaeke // get a pointer to it. 11950621caefSChris Lattner if (void *SymAddr = 119649bb65a4SRafael Espindola sys::DynamicLibrary::SearchForAddressOfSymbol(GV.getName())) 119749bb65a4SRafael Espindola addGlobalMapping(&GV, SymAddr); 11989de0d14dSChris Lattner else { 11992104b8d3SChris Lattner report_fatal_error("Could not resolve external global address: " 120049bb65a4SRafael Espindola +GV.getName()); 12019de0d14dSChris Lattner } 1202996fe010SChris Lattner } 12030621caefSChris Lattner } 12040621caefSChris Lattner 12050621caefSChris Lattner // If there are multiple modules, map the non-canonical globals to their 12060621caefSChris Lattner // canonical location. 12070621caefSChris Lattner if (!NonCanonicalGlobals.empty()) { 12080621caefSChris Lattner for (unsigned i = 0, e = NonCanonicalGlobals.size(); i != e; ++i) { 12090621caefSChris Lattner const GlobalValue *GV = NonCanonicalGlobals[i]; 12100621caefSChris Lattner const GlobalValue *CGV = 12110621caefSChris Lattner LinkedGlobalsMap[std::make_pair(GV->getName(), GV->getType())]; 12120621caefSChris Lattner void *Ptr = getPointerToGlobalIfAvailable(CGV); 12130621caefSChris Lattner assert(Ptr && "Canonical global wasn't codegen'd!"); 1214a67f06b9SNuno Lopes addGlobalMapping(GV, Ptr); 12150621caefSChris Lattner } 12160621caefSChris Lattner } 1217996fe010SChris Lattner 12187a9c62baSReid Spencer // Now that all of the globals are set up in memory, loop through them all 12197a9c62baSReid Spencer // and initialize their contents. 122049bb65a4SRafael Espindola for (const auto &GV : M.globals()) { 122149bb65a4SRafael Espindola if (!GV.isDeclaration()) { 12220621caefSChris Lattner if (!LinkedGlobalsMap.empty()) { 12230621caefSChris Lattner if (const GlobalValue *GVEntry = 122449bb65a4SRafael Espindola LinkedGlobalsMap[std::make_pair(GV.getName(), GV.getType())]) 122549bb65a4SRafael Espindola if (GVEntry != &GV) // Not the canonical variable. 12260621caefSChris Lattner continue; 12270621caefSChris Lattner } 122849bb65a4SRafael Espindola EmitGlobalVariable(&GV); 12296bbe3eceSChris Lattner } 12300621caefSChris Lattner } 12310621caefSChris Lattner } 12320621caefSChris Lattner } 12336bbe3eceSChris Lattner 12346bbe3eceSChris Lattner // EmitGlobalVariable - This method emits the specified global variable to the 12356bbe3eceSChris Lattner // address specified in GlobalAddresses, or allocates new memory if it's not 12366bbe3eceSChris Lattner // already in the map. 1237fbcc0aa1SChris Lattner void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) { 1238748e8579SChris Lattner void *GA = getPointerToGlobalIfAvailable(GV); 1239dc631735SChris Lattner 12402617dcceSCraig Topper if (!GA) { 12416bbe3eceSChris Lattner // If it's not already specified, allocate memory for the global. 12425457ce9aSNicolas Geoffray GA = getMemoryForGV(GV); 12433b442379SAndrew Kaylor 12443b442379SAndrew Kaylor // If we failed to allocate memory for this global, return. 12452617dcceSCraig Topper if (!GA) return; 12463b442379SAndrew Kaylor 1247748e8579SChris Lattner addGlobalMapping(GV, GA); 12486bbe3eceSChris Lattner } 1249fbcc0aa1SChris Lattner 12505457ce9aSNicolas Geoffray // Don't initialize if it's thread local, let the client do it. 12515457ce9aSNicolas Geoffray if (!GV->isThreadLocal()) 12526bbe3eceSChris Lattner InitializeMemory(GV->getInitializer(), GA); 12535457ce9aSNicolas Geoffray 1254229907cdSChris Lattner Type *ElTy = GV->getType()->getElementType(); 1255cdfe20b9SMicah Villmow size_t GVSize = (size_t)getDataLayout()->getTypeAllocSize(ElTy); 1256df1f1524SChris Lattner NumInitBytes += (unsigned)GVSize; 12576bbe3eceSChris Lattner ++NumGlobals; 1258996fe010SChris Lattner } 1259f98e981cSJeffrey Yasskin 1260d0fc8f80SJeffrey Yasskin ExecutionEngineState::ExecutionEngineState(ExecutionEngine &EE) 1261d0fc8f80SJeffrey Yasskin : EE(EE), GlobalAddressMap(this) { 1262f98e981cSJeffrey Yasskin } 1263f98e981cSJeffrey Yasskin 1264c04b892fSZachary Turner sys::Mutex * 1265868e3f09SDaniel Dunbar ExecutionEngineState::AddressMapConfig::getMutex(ExecutionEngineState *EES) { 1266d0fc8f80SJeffrey Yasskin return &EES->EE.lock; 1267d0fc8f80SJeffrey Yasskin } 1268868e3f09SDaniel Dunbar 1269868e3f09SDaniel Dunbar void ExecutionEngineState::AddressMapConfig::onDelete(ExecutionEngineState *EES, 1270868e3f09SDaniel Dunbar const GlobalValue *Old) { 1271d0fc8f80SJeffrey Yasskin void *OldVal = EES->GlobalAddressMap.lookup(Old); 1272d0fc8f80SJeffrey Yasskin EES->GlobalAddressReverseMap.erase(OldVal); 1273d0fc8f80SJeffrey Yasskin } 1274d0fc8f80SJeffrey Yasskin 1275868e3f09SDaniel Dunbar void ExecutionEngineState::AddressMapConfig::onRAUW(ExecutionEngineState *, 1276868e3f09SDaniel Dunbar const GlobalValue *, 1277868e3f09SDaniel Dunbar const GlobalValue *) { 1278a2886c21SCraig Topper llvm_unreachable("The ExecutionEngine doesn't know how to handle a" 1279f98e981cSJeffrey Yasskin " RAUW on a value it has a global mapping for."); 1280f98e981cSJeffrey Yasskin } 1281