MCJIT.cpp revision 52c9016db0560644a03ca661302e45143372f2fc
1bb498ca5c2acb7567d8d4d84b00229bed6f501b1Eric Christopher//===-- MCJIT.cpp - MC-based Just-in-Time Compiler ------------------------===// 26aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// 36aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// The LLVM Compiler Infrastructure 46aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// 56aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// This file is distributed under the University of Illinois Open Source 66aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// License. See LICENSE.TXT for details. 76aec29848676494867e26307698155bc2c5a4033Daniel Dunbar// 86aec29848676494867e26307698155bc2c5a4033Daniel Dunbar//===----------------------------------------------------------------------===// 96aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 106aec29848676494867e26307698155bc2c5a4033Daniel Dunbar#include "MCJIT.h" 116aec29848676494867e26307698155bc2c5a4033Daniel Dunbar#include "llvm/ExecutionEngine/GenericValue.h" 12776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor#include "llvm/ExecutionEngine/JITEventListener.h" 13f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/ExecutionEngine/JITMemoryManager.h" 143f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/MCJIT.h" 153f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectBuffer.h" 163f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectImage.h" 17d2755af8bda2e0fd80efb46556485c4cdbe8704aAndrew Kaylor#include "llvm/ExecutionEngine/SectionMemoryManager.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor#include "llvm/IR/Module.h" 22f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/MC/MCAsmInfo.h" 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DynamicLibrary.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h" 25f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/Support/MemoryBuffer.h" 26ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor#include "llvm/Support/MutexGuard.h" 276aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 286aec29848676494867e26307698155bc2c5a4033Daniel Dunbarusing namespace llvm; 296aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 306aec29848676494867e26307698155bc2c5a4033Daniel Dunbarnamespace { 316aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 326aec29848676494867e26307698155bc2c5a4033Daniel Dunbarstatic struct RegisterJIT { 336aec29848676494867e26307698155bc2c5a4033Daniel Dunbar RegisterJIT() { MCJIT::Register(); } 346aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} JITRegistrator; 356aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 366aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 376aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 386aec29848676494867e26307698155bc2c5a4033Daniel Dunbarextern "C" void LLVMLinkInMCJIT() { 396aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 406aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 416aec29848676494867e26307698155bc2c5a4033Daniel DunbarExecutionEngine *MCJIT::createJIT(Module *M, 426aec29848676494867e26307698155bc2c5a4033Daniel Dunbar std::string *ErrorStr, 4313a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo RTDyldMemoryManager *MemMgr, 446aec29848676494867e26307698155bc2c5a4033Daniel Dunbar bool GVsWithCode, 45c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith TargetMachine *TM) { 466aec29848676494867e26307698155bc2c5a4033Daniel Dunbar // Try to register the program as a source of symbols to resolve against. 476aec29848676494867e26307698155bc2c5a4033Daniel Dunbar // 486aec29848676494867e26307698155bc2c5a4033Daniel Dunbar // FIXME: Don't do this here. 496aec29848676494867e26307698155bc2c5a4033Daniel Dunbar sys::DynamicLibrary::LoadLibraryPermanently(0, NULL); 506aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 5113a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo return new MCJIT(M, TM, MemMgr ? MemMgr : new SectionMemoryManager(), 5213a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo GVsWithCode); 536aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 546aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 558005bcd5e0c923881d82afcb813a7e537cd1b241Jim GrosbachMCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM, 568005bcd5e0c923881d82afcb813a7e537cd1b241Jim Grosbach bool AllocateGVsWithCode) 578e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor : ExecutionEngine(m), TM(tm), Ctx(0), MemMgr(this, MM), Dyld(&MemMgr), 588e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjCache(0) { 5931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 608e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[m] = ModuleAdded; 613574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow setDataLayout(TM->getDataLayout()); 62ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor} 63ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 64ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew KaylorMCJIT::~MCJIT() { 658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjectMap::iterator it, end = LoadedObjects.end(); 668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = LoadedObjects.begin(); it != end; ++it) { 678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjectImage *Obj = it->second; 688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Obj) { 698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor NotifyFreeingObject(*Obj); 708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor delete Obj; 718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjects.clear(); 74ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor delete TM; 75ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor} 76ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::addModule(Module *M) { 788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Modules.push_back(M); 798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = MCJITModuleState(); 808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 821c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylorvoid MCJIT::setObjectCache(ObjectCache* NewCache) { 831c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjCache = NewCache; 841c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor} 851c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 868e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorObjectBufferStream* MCJIT::emitObject(Module *M) { 878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end()); 898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 90ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 91ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // Get a thread lock to make sure we aren't trying to compile multiple times 92ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor MutexGuard locked(lock); 93ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 94ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // Re-compilation is not supported 958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(!ModuleStates[M].hasBeenEmitted()); 96ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 97ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor PassManager PM; 98ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 993574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow PM.add(new DataLayout(*TM->getDataLayout())); 10031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 1013f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // The RuntimeDyld will take ownership of this shortly 1021c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor OwningPtr<ObjectBufferStream> CompiledObject(new ObjectBufferStream()); 1033f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor 10431649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Turn the machine code intermediate representation into bytes in memory 10531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // that may be executed. 1061c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), false)) { 10731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach report_fatal_error("Target does not support MC emission!"); 10831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach } 10931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 11031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Initialize passes. 1118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor PM.run(*M); 1123f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // Flush the output buffer to get the generated code into memory 1131c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor CompiledObject->flush(); 1141c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1151c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // If we have an object cache, tell it about the new object. 1161c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Note that we're using the compiled image, not the loaded image (as below). 1171c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (ObjCache) { 1181c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // MemoryBuffer is a thin wrapper around the actual memory, so it's OK 1191c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // to create a temporary object here and delete it after the call. 1201c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor OwningPtr<MemoryBuffer> MB(CompiledObject->getMemBuffer()); 1218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjCache->notifyObjectCompiled(M, MB.get()); 1221c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 1231c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1241c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor return CompiledObject.take(); 1251c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor} 1261c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::generateCodeForModule(Module *M) { 1288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 1298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end()); 1308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 1311c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1321c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Get a thread lock to make sure we aren't trying to load multiple times 1331c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor MutexGuard locked(lock); 1341c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1351c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Re-compilation is not supported 1368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded()) 1371c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor return; 1381c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1391c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor OwningPtr<ObjectBuffer> ObjectToLoad; 1401c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Try to load the pre-compiled object from cache if possible 1411c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (0 != ObjCache) { 14240d8171e3e74f4786d89a8f1fb370653f81c7941Andrew Kaylor OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M)); 1431c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (0 != PreCompiledObject.get()) 1441c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take())); 1451c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 1461c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1471c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // If the cache did not contain a suitable object, compile the object 1481c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (!ObjectToLoad) { 1491c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjectToLoad.reset(emitObject(M)); 1501c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor assert(ObjectToLoad.get() && "Compilation did not produce an object."); 1511c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 152f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach 153f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach // Load the object into the dynamic linker. 1548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // MCJIT now owns the ObjectImage pointer (via its LoadedObjects map). 1558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.take()); 1568e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjects[M] = LoadedObject; 1573f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor if (!LoadedObject) 1588086f3b49429e02603270c8e09e2aabac9215a21Jim Grosbach report_fatal_error(Dyld.getErrorString()); 159ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 1603f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // FIXME: Make this optional, maybe even move it to a JIT event listener 1613f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor LoadedObject->registerWithDebugger(); 1623f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor 163776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor NotifyObjectEmitted(*LoadedObject); 164776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor 1658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleLoaded; 1668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 1678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeLoadedModules() { 1698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Resolve any outstanding relocations. 1708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Dyld.resolveRelocations(); 1718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Register EH frame data for any module we own which has been loaded 1738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator end = Modules.end(); 1748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator it; 1758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = Modules.begin(); it != end; ++it) { 1768e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = *it; 1778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 1788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded() && 1808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor !ModuleStates[M].hasBeenFinalized()) { 1818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: This should be module specific! 1828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor StringRef EHData = Dyld.getEHFrameSection(); 1838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!EHData.empty()) 1848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.registerEHFrames(EHData); 1858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleFinalized; 1868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 1878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 1888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Set page permissions. 1908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.finalizeMemory(); 1916aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 1926aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 1938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// FIXME: Rename this. 19428989889bf3aa3314562d438aece245b71176ec4Andrew Kaylorvoid MCJIT::finalizeObject() { 1958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: This is a temporary hack to get around problems with calling 1968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // finalize multiple times. 1978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool finalizeNeeded = false; 1988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator end = Modules.end(); 1998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator it; 2008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = Modules.begin(); it != end; ++it) { 2018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = *it; 2028e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 2038e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!ModuleStates[M].hasBeenFinalized()) 2048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeNeeded = true; 2058e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2068e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // I don't really like this, but the C API depends on this behavior. 2078e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // I suppose it's OK for a deprecated function. 2088e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!ModuleStates[M].hasBeenLoaded()) 2098e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 2108e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!finalizeNeeded) 2128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return; 2138e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Resolve any outstanding relocations. 2158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Dyld.resolveRelocations(); 2168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2178e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Register EH frame data for any module we own which has been loaded 2188e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = Modules.begin(); it != end; ++it) { 2198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = *it; 2208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 2218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded() && 2238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor !ModuleStates[M].hasBeenFinalized()) { 2248e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: This should be module specific! 2258e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor StringRef EHData = Dyld.getEHFrameSection(); 2268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!EHData.empty()) 2278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.registerEHFrames(EHData); 2288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleFinalized; 2298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 23028989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor } 23128989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor 2328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Set page permissions. 2338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.finalizeMemory(); 2348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeModule(Module *M) { 2378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 2388e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end()); 2398e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 2408e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2418e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenFinalized()) 2428e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return; 2438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If the module hasn't been compiled, just do that. 2458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!ModuleStates[M].hasBeenLoaded()) 2468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 2478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Resolve any outstanding relocations. 2498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Dyld.resolveRelocations(); 2508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: Should this be module specific? 252a2e40fbd624916c187a95ed76939ca7f02ed3e53Rafael Espindola StringRef EHData = Dyld.getEHFrameSection(); 253a2e40fbd624916c187a95ed76939ca7f02ed3e53Rafael Espindola if (!EHData.empty()) 2548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.registerEHFrames(EHData); 25553608a34ce3f0969e9fb01eaa983422761011e03Andrew Kaylor 25653608a34ce3f0969e9fb01eaa983422761011e03Andrew Kaylor // Set page permissions. 2578e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.finalizeMemory(); 2588e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2598e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleFinalized; 26028989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor} 26128989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor 2626aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::getPointerToBasicBlock(BasicBlock *BB) { 2636aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 2646aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 2656aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 2668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getExistingSymbolAddress(const std::string &Name) { 2678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Check with the RuntimeDyld to see if we already have this symbol. 2688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Name[0] == '\1') 2698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Dyld.getSymbolLoadAddress(Name.substr(1)); 2708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix() 2718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor + Name)); 2728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2748e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorModule *MCJIT::findModuleForSymbol(const std::string &Name, 2758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool CheckFunctionsOnly) { 2768e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If it hasn't already been generated, see if it's in one of our modules. 2778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator end = Modules.end(); 2788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator it; 2798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = Modules.begin(); it != end; ++it) { 2808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = *it; 2818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Function *F = M->getFunction(Name); 2828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (F && !F->empty()) 2838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return M; 2848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!CheckFunctionsOnly) { 2858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor GlobalVariable *G = M->getGlobalVariable(Name); 2868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (G) 2878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return M; 2888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: Do we need to worry about global aliases? 2898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // We didn't find the symbol in any of our modules. 2928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return NULL; 2938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2948e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getSymbolAddress(const std::string &Name, 2968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool CheckFunctionsOnly) 2978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor{ 2988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // First, check to see if we already have this symbol. 2998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Addr = getExistingSymbolAddress(Name); 3008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Addr) 3018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Addr; 3028e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3038e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If it hasn't already been generated, see if it's in one of our modules. 3048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = findModuleForSymbol(Name, CheckFunctionsOnly); 3058e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!M) 3068e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return 0; 3078e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3088e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If this is in one of our modules, generate code for that module. 3098e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 3108e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If the module code has already been generated, we won't find the symbol. 3118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded()) 3128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return 0; 31335ed842773da41779d57d3ed23f440202d0be198Jim Grosbach 3148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: We probably need to make sure we aren't in the process of 3158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // loading or finalizing this module. 3168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 3178e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3188e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Check the RuntimeDyld table again, it should be there now. 3198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return getExistingSymbolAddress(Name); 3208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getGlobalValueAddress(const std::string &Name) { 3238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = getSymbolAddress(Name, false); 3248e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result != 0) 3258e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeLoadedModules(); 3268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 3278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getFunctionAddress(const std::string &Name) { 3308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = getSymbolAddress(Name, true); 3318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result != 0) 3328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeLoadedModules(); 3338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 3348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// Deprecated. Use getFunctionAddress instead. 3378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid *MCJIT::getPointerToFunction(Function *F) { 338ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 33934714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) { 34034714a06096f854c76371295d8c20b017fbba50bJim Grosbach bool AbortOnFailure = !F->hasExternalWeakLinkage(); 34134714a06096f854c76371295d8c20b017fbba50bJim Grosbach void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure); 34234714a06096f854c76371295d8c20b017fbba50bJim Grosbach addGlobalMapping(F, Addr); 34334714a06096f854c76371295d8c20b017fbba50bJim Grosbach return Addr; 34434714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 34534714a06096f854c76371295d8c20b017fbba50bJim Grosbach 3468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If this function doesn't belong to one of our modules, we're done. 3478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = F->getParent(); 3488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (std::find(Modules.begin(), Modules.end(), M) == Modules.end()) 3498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return NULL; 3508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 3528e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Make sure the relevant module has been compiled and loaded. 3548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!ModuleStates[M].hasBeenLoaded()) 3558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 3568e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 357ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // FIXME: Should the Dyld be retaining module information? Probably not. 3583ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach // FIXME: Should we be using the mangler for this? Probably. 35935ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // 36035ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // This is the accessor for the target address, so make sure to check the 36135ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // load address of the symbol, not the local address. 3623ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach StringRef BaseName = F->getName(); 3633ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach if (BaseName[0] == '\1') 36435ed842773da41779d57d3ed23f440202d0be198Jim Grosbach return (void*)Dyld.getSymbolLoadAddress(BaseName.substr(1)); 36535ed842773da41779d57d3ed23f440202d0be198Jim Grosbach return (void*)Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix() 366c0ceedb6f885b1cbd3d3cea02f695afe393dfd2cJim Grosbach + BaseName).str()); 3676aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3686aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3696aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::recompileAndRelinkFunction(Function *F) { 3706aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 3716aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3726aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3736aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid MCJIT::freeMachineCodeForFunction(Function *F) { 3746aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 3756aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3766aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3776aec29848676494867e26307698155bc2c5a4033Daniel DunbarGenericValue MCJIT::runFunction(Function *F, 3786aec29848676494867e26307698155bc2c5a4033Daniel Dunbar const std::vector<GenericValue> &ArgValues) { 37934714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(F && "Function *F was null at entry to run()"); 38034714a06096f854c76371295d8c20b017fbba50bJim Grosbach 38131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach void *FPtr = getPointerToFunction(F); 38234714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(FPtr && "Pointer to fn's code was null after getPointerToFunction"); 383db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FTy = F->getFunctionType(); 384db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *RetTy = FTy->getReturnType(); 38534714a06096f854c76371295d8c20b017fbba50bJim Grosbach 38634714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert((FTy->getNumParams() == ArgValues.size() || 38734714a06096f854c76371295d8c20b017fbba50bJim Grosbach (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) && 38834714a06096f854c76371295d8c20b017fbba50bJim Grosbach "Wrong number of arguments passed into function!"); 38934714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(FTy->getNumParams() == ArgValues.size() && 39034714a06096f854c76371295d8c20b017fbba50bJim Grosbach "This doesn't support passing arguments through varargs (yet)!"); 39134714a06096f854c76371295d8c20b017fbba50bJim Grosbach 39234714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Handle some common cases first. These cases correspond to common `main' 39334714a06096f854c76371295d8c20b017fbba50bJim Grosbach // prototypes. 39434714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) { 39534714a06096f854c76371295d8c20b017fbba50bJim Grosbach switch (ArgValues.size()) { 39634714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 3: 39734714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getParamType(0)->isIntegerTy(32) && 39834714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(1)->isPointerTy() && 39934714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(2)->isPointerTy()) { 40034714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int, char **, const char **) = 40134714a06096f854c76371295d8c20b017fbba50bJim Grosbach (int(*)(int, char **, const char **))(intptr_t)FPtr; 40234714a06096f854c76371295d8c20b017fbba50bJim Grosbach 40334714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Call the function. 40434714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 40534714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 40634714a06096f854c76371295d8c20b017fbba50bJim Grosbach (char **)GVTOP(ArgValues[1]), 40734714a06096f854c76371295d8c20b017fbba50bJim Grosbach (const char **)GVTOP(ArgValues[2]))); 40834714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 40934714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 41034714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 41134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 2: 41234714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getParamType(0)->isIntegerTy(32) && 41334714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(1)->isPointerTy()) { 41434714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr; 41534714a06096f854c76371295d8c20b017fbba50bJim Grosbach 41634714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Call the function. 41734714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 41834714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 41934714a06096f854c76371295d8c20b017fbba50bJim Grosbach (char **)GVTOP(ArgValues[1]))); 42034714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 42134714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 42234714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 42334714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 1: 42434714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getNumParams() == 1 && 42534714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(0)->isIntegerTy(32)) { 42634714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 42734714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int) = (int(*)(int))(intptr_t)FPtr; 42834714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue())); 42934714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 43034714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 43134714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 43234714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 43334714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 43434714a06096f854c76371295d8c20b017fbba50bJim Grosbach 43534714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Handle cases where no arguments are passed first. 43634714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (ArgValues.empty()) { 43734714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 43834714a06096f854c76371295d8c20b017fbba50bJim Grosbach switch (RetTy->getTypeID()) { 43934714a06096f854c76371295d8c20b017fbba50bJim Grosbach default: llvm_unreachable("Unknown return type for function call!"); 44034714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::IntegerTyID: { 44134714a06096f854c76371295d8c20b017fbba50bJim Grosbach unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth(); 44234714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (BitWidth == 1) 44334714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)()); 44434714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 8) 44534714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)()); 44634714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 16) 44734714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)()); 44834714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 32) 44934714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)()); 45034714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 64) 45134714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)()); 45234714a06096f854c76371295d8c20b017fbba50bJim Grosbach else 45334714a06096f854c76371295d8c20b017fbba50bJim Grosbach llvm_unreachable("Integer types > 64 bits not supported"); 45434714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 45534714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 45634714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::VoidTyID: 45734714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)()); 45834714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 45934714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::FloatTyID: 46034714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.FloatVal = ((float(*)())(intptr_t)FPtr)(); 46134714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 46234714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::DoubleTyID: 46334714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.DoubleVal = ((double(*)())(intptr_t)FPtr)(); 46434714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 46534714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::X86_FP80TyID: 46634714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::FP128TyID: 46734714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::PPC_FP128TyID: 46834714a06096f854c76371295d8c20b017fbba50bJim Grosbach llvm_unreachable("long double not supported yet"); 46934714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::PointerTyID: 47034714a06096f854c76371295d8c20b017fbba50bJim Grosbach return PTOGV(((void*(*)())(intptr_t)FPtr)()); 47134714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 47234714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 47334714a06096f854c76371295d8c20b017fbba50bJim Grosbach 474858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("Full-featured argument passing not supported yet!"); 4756aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 47630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 47730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshevvoid *MCJIT::getPointerToNamedFunction(const std::string &Name, 4785fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky bool AbortOnFailure) { 4798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!isSymbolSearchingDisabled()) { 4808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor void *ptr = MemMgr.getPointerToNamedFunction(Name, false); 48130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (ptr) 48230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return ptr; 48330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 48430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 48530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev /// If a LazyFunctionCreator is installed, use it to get/create the function. 48630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (LazyFunctionCreator) 48730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (void *RP = LazyFunctionCreator(Name)) 48830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return RP; 48930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 49030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (AbortOnFailure) { 49130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev report_fatal_error("Program used external function '"+Name+ 4925fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky "' which could not be resolved!"); 49330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 49430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return 0; 49530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev} 496776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor 497776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::RegisterJITEventListener(JITEventListener *L) { 498776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (L == NULL) 499776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor return; 500776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 501776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners.push_back(L); 502776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 503776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::UnregisterJITEventListener(JITEventListener *L) { 504776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (L == NULL) 505776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor return; 506776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 507776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor SmallVector<JITEventListener*, 2>::reverse_iterator I= 508776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor std::find(EventListeners.rbegin(), EventListeners.rend(), L); 509776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (I != EventListeners.rend()) { 510776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor std::swap(*I, EventListeners.back()); 511776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners.pop_back(); 512776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 513776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 514776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) { 515776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 516776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 517776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners[I]->NotifyObjectEmitted(Obj); 518776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 519776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 520776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyFreeingObject(const ObjectImage& Obj) { 521776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 522776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 523776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners[I]->NotifyFreeingObject(Obj); 524776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 525776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 5268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 5278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t LinkingMemoryManager::getSymbolAddress(const std::string &Name) { 5288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = ParentEngine->getSymbolAddress(Name, false); 52952c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor // If the symbols wasn't found and it begins with an underscore, try again 53052c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor // without the underscore. 53152c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor if (!Result && Name[0] == '_') 53252c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor Result = ParentEngine->getSymbolAddress(Name.substr(1), false); 5338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result) 5348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 5358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return ClientMM->getSymbolAddress(Name); 5368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 537