MCJIT.cpp revision 43507d026bef31100cb0c35614bcf419029a265b
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() { 6543507d026bef31100cb0c35614bcf419029a265bAndrew Kaylor Dyld.deregisterEHFrames(); 6643507d026bef31100cb0c35614bcf419029a265bAndrew Kaylor 678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjectMap::iterator it, end = LoadedObjects.end(); 688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = LoadedObjects.begin(); it != end; ++it) { 698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjectImage *Obj = it->second; 708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Obj) { 718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor NotifyFreeingObject(*Obj); 728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor delete Obj; 738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjects.clear(); 76ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor delete TM; 77ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor} 78ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::addModule(Module *M) { 808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Modules.push_back(M); 818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = MCJITModuleState(); 828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 841c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylorvoid MCJIT::setObjectCache(ObjectCache* NewCache) { 851c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjCache = NewCache; 861c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor} 871c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 888e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorObjectBufferStream* MCJIT::emitObject(Module *M) { 898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end()); 918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 92ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 93ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // Get a thread lock to make sure we aren't trying to compile multiple times 94ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor MutexGuard locked(lock); 95ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 96ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // Re-compilation is not supported 978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(!ModuleStates[M].hasBeenEmitted()); 98ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 99ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor PassManager PM; 100ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 1013574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow PM.add(new DataLayout(*TM->getDataLayout())); 10231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 1033f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // The RuntimeDyld will take ownership of this shortly 1041c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor OwningPtr<ObjectBufferStream> CompiledObject(new ObjectBufferStream()); 1053f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor 10631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Turn the machine code intermediate representation into bytes in memory 10731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // that may be executed. 1081c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), false)) { 10931649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach report_fatal_error("Target does not support MC emission!"); 11031649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach } 11131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 11231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Initialize passes. 1138e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor PM.run(*M); 1143f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // Flush the output buffer to get the generated code into memory 1151c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor CompiledObject->flush(); 1161c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1171c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // If we have an object cache, tell it about the new object. 1181c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Note that we're using the compiled image, not the loaded image (as below). 1191c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (ObjCache) { 1201c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // MemoryBuffer is a thin wrapper around the actual memory, so it's OK 1211c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // to create a temporary object here and delete it after the call. 1221c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor OwningPtr<MemoryBuffer> MB(CompiledObject->getMemBuffer()); 1238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjCache->notifyObjectCompiled(M, MB.get()); 1241c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 1251c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1261c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor return CompiledObject.take(); 1271c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor} 1281c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::generateCodeForModule(Module *M) { 1308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 1318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end()); 1328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 1331c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1341c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Get a thread lock to make sure we aren't trying to load multiple times 1351c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor MutexGuard locked(lock); 1361c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1371c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Re-compilation is not supported 1388e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded()) 1391c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor return; 1401c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1411c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor OwningPtr<ObjectBuffer> ObjectToLoad; 1421c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Try to load the pre-compiled object from cache if possible 1431c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (0 != ObjCache) { 14440d8171e3e74f4786d89a8f1fb370653f81c7941Andrew Kaylor OwningPtr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M)); 1451c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (0 != PreCompiledObject.get()) 1461c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.take())); 1471c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 1481c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1491c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // If the cache did not contain a suitable object, compile the object 1501c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (!ObjectToLoad) { 1511c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjectToLoad.reset(emitObject(M)); 1521c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor assert(ObjectToLoad.get() && "Compilation did not produce an object."); 1531c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 154f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach 155f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach // Load the object into the dynamic linker. 1568e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // MCJIT now owns the ObjectImage pointer (via its LoadedObjects map). 1578e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.take()); 1588e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjects[M] = LoadedObject; 1593f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor if (!LoadedObject) 1608086f3b49429e02603270c8e09e2aabac9215a21Jim Grosbach report_fatal_error(Dyld.getErrorString()); 161ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 1623f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // FIXME: Make this optional, maybe even move it to a JIT event listener 1633f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor LoadedObject->registerWithDebugger(); 1643f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor 165776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor NotifyObjectEmitted(*LoadedObject); 166776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor 1678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleLoaded; 1688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 1698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeLoadedModules() { 1718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Resolve any outstanding relocations. 1728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Dyld.resolveRelocations(); 1738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Register EH frame data for any module we own which has been loaded 1758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator end = Modules.end(); 1768e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator it; 1778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = Modules.begin(); it != end; ++it) { 1788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = *it; 1798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 1808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded() && 1828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor !ModuleStates[M].hasBeenFinalized()) { 1838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleFinalized; 1848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 1858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 1868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 187528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor Dyld.registerEHFrames(); 188528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew 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 ModuleStates[M] = ModuleFinalized; 2258e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 22628989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor } 22728989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor 228528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor Dyld.registerEHFrames(); 229528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor 2308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Set page permissions. 2318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.finalizeMemory(); 2328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeModule(Module *M) { 2358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 2368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(std::find(Modules.begin(), Modules.end(), M) != Modules.end()); 2378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 2388e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2398e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenFinalized()) 2408e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return; 2418e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2428e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If the module hasn't been compiled, just do that. 2438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!ModuleStates[M].hasBeenLoaded()) 2448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 2458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Resolve any outstanding relocations. 2478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Dyld.resolveRelocations(); 2488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 249528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor Dyld.registerEHFrames(); 25053608a34ce3f0969e9fb01eaa983422761011e03Andrew Kaylor 25153608a34ce3f0969e9fb01eaa983422761011e03Andrew Kaylor // Set page permissions. 2528e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.finalizeMemory(); 2538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ModuleStates[M] = ModuleFinalized; 25528989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor} 25628989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor 2576aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::getPointerToBasicBlock(BasicBlock *BB) { 2586aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 2596aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 2606aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 2618e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getExistingSymbolAddress(const std::string &Name) { 2628e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Check with the RuntimeDyld to see if we already have this symbol. 2638e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Name[0] == '\1') 2648e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Dyld.getSymbolLoadAddress(Name.substr(1)); 2658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix() 2668e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor + Name)); 2678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2698e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorModule *MCJIT::findModuleForSymbol(const std::string &Name, 2708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool CheckFunctionsOnly) { 2718e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If it hasn't already been generated, see if it's in one of our modules. 2728e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator end = Modules.end(); 2738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor SmallVector<Module *, 1>::iterator it; 2748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor for (it = Modules.begin(); it != end; ++it) { 2758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = *it; 2768e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Function *F = M->getFunction(Name); 2778e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (F && !F->empty()) 2788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return M; 2798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!CheckFunctionsOnly) { 2808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor GlobalVariable *G = M->getGlobalVariable(Name); 2818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (G) 2828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return M; 2838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: Do we need to worry about global aliases? 2848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // We didn't find the symbol in any of our modules. 2878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return NULL; 2888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getSymbolAddress(const std::string &Name, 2918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool CheckFunctionsOnly) 2928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor{ 2938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // First, check to see if we already have this symbol. 2948e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Addr = getExistingSymbolAddress(Name); 2958e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Addr) 2968e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Addr; 2978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If it hasn't already been generated, see if it's in one of our modules. 2998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = findModuleForSymbol(Name, CheckFunctionsOnly); 3008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!M) 3018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return 0; 3028e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3038e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If this is in one of our modules, generate code for that module. 3048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 3058e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If the module code has already been generated, we won't find the symbol. 3068e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (ModuleStates[M].hasBeenLoaded()) 3078e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return 0; 30835ed842773da41779d57d3ed23f440202d0be198Jim Grosbach 3098e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: We probably need to make sure we aren't in the process of 3108e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // loading or finalizing this module. 3118e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 3128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3138e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Check the RuntimeDyld table again, it should be there now. 3148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return getExistingSymbolAddress(Name); 3158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3178e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getGlobalValueAddress(const std::string &Name) { 3188e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = getSymbolAddress(Name, false); 3198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result != 0) 3208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeLoadedModules(); 3218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 3228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3248e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getFunctionAddress(const std::string &Name) { 3258e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = getSymbolAddress(Name, true); 3268e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result != 0) 3278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeLoadedModules(); 3288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 3298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// Deprecated. Use getFunctionAddress instead. 3328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid *MCJIT::getPointerToFunction(Function *F) { 333ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 33434714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) { 33534714a06096f854c76371295d8c20b017fbba50bJim Grosbach bool AbortOnFailure = !F->hasExternalWeakLinkage(); 33634714a06096f854c76371295d8c20b017fbba50bJim Grosbach void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure); 33734714a06096f854c76371295d8c20b017fbba50bJim Grosbach addGlobalMapping(F, Addr); 33834714a06096f854c76371295d8c20b017fbba50bJim Grosbach return Addr; 33934714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 34034714a06096f854c76371295d8c20b017fbba50bJim Grosbach 3418e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If this function doesn't belong to one of our modules, we're done. 3428e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = F->getParent(); 3438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (std::find(Modules.begin(), Modules.end(), M) == Modules.end()) 3448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return NULL; 3458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor assert(ModuleStates.find(M) != ModuleStates.end()); 3478e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Make sure the relevant module has been compiled and loaded. 3498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!ModuleStates[M].hasBeenLoaded()) 3508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 3518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 352ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // FIXME: Should the Dyld be retaining module information? Probably not. 3533ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach // FIXME: Should we be using the mangler for this? Probably. 35435ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // 35535ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // This is the accessor for the target address, so make sure to check the 35635ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // load address of the symbol, not the local address. 3573ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach StringRef BaseName = F->getName(); 3583ec2c7c3e48f1fbab749870c51a74920f91c82c1Jim Grosbach if (BaseName[0] == '\1') 35935ed842773da41779d57d3ed23f440202d0be198Jim Grosbach return (void*)Dyld.getSymbolLoadAddress(BaseName.substr(1)); 36035ed842773da41779d57d3ed23f440202d0be198Jim Grosbach return (void*)Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix() 361c0ceedb6f885b1cbd3d3cea02f695afe393dfd2cJim Grosbach + BaseName).str()); 3626aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3636aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3646aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::recompileAndRelinkFunction(Function *F) { 3656aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 3666aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3676aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3686aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid MCJIT::freeMachineCodeForFunction(Function *F) { 3696aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 3706aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3716aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3726aec29848676494867e26307698155bc2c5a4033Daniel DunbarGenericValue MCJIT::runFunction(Function *F, 3736aec29848676494867e26307698155bc2c5a4033Daniel Dunbar const std::vector<GenericValue> &ArgValues) { 37434714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(F && "Function *F was null at entry to run()"); 37534714a06096f854c76371295d8c20b017fbba50bJim Grosbach 37631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach void *FPtr = getPointerToFunction(F); 37734714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(FPtr && "Pointer to fn's code was null after getPointerToFunction"); 378db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FTy = F->getFunctionType(); 379db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *RetTy = FTy->getReturnType(); 38034714a06096f854c76371295d8c20b017fbba50bJim Grosbach 38134714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert((FTy->getNumParams() == ArgValues.size() || 38234714a06096f854c76371295d8c20b017fbba50bJim Grosbach (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) && 38334714a06096f854c76371295d8c20b017fbba50bJim Grosbach "Wrong number of arguments passed into function!"); 38434714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(FTy->getNumParams() == ArgValues.size() && 38534714a06096f854c76371295d8c20b017fbba50bJim Grosbach "This doesn't support passing arguments through varargs (yet)!"); 38634714a06096f854c76371295d8c20b017fbba50bJim Grosbach 38734714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Handle some common cases first. These cases correspond to common `main' 38834714a06096f854c76371295d8c20b017fbba50bJim Grosbach // prototypes. 38934714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) { 39034714a06096f854c76371295d8c20b017fbba50bJim Grosbach switch (ArgValues.size()) { 39134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 3: 39234714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getParamType(0)->isIntegerTy(32) && 39334714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(1)->isPointerTy() && 39434714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(2)->isPointerTy()) { 39534714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int, char **, const char **) = 39634714a06096f854c76371295d8c20b017fbba50bJim Grosbach (int(*)(int, char **, const char **))(intptr_t)FPtr; 39734714a06096f854c76371295d8c20b017fbba50bJim Grosbach 39834714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Call the function. 39934714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 40034714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 40134714a06096f854c76371295d8c20b017fbba50bJim Grosbach (char **)GVTOP(ArgValues[1]), 40234714a06096f854c76371295d8c20b017fbba50bJim Grosbach (const char **)GVTOP(ArgValues[2]))); 40334714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 40434714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 40534714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 40634714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 2: 40734714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getParamType(0)->isIntegerTy(32) && 40834714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(1)->isPointerTy()) { 40934714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr; 41034714a06096f854c76371295d8c20b017fbba50bJim Grosbach 41134714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Call the function. 41234714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 41334714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 41434714a06096f854c76371295d8c20b017fbba50bJim Grosbach (char **)GVTOP(ArgValues[1]))); 41534714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 41634714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 41734714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 41834714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 1: 41934714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getNumParams() == 1 && 42034714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(0)->isIntegerTy(32)) { 42134714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 42234714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int) = (int(*)(int))(intptr_t)FPtr; 42334714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue())); 42434714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 42534714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 42634714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 42734714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 42834714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 42934714a06096f854c76371295d8c20b017fbba50bJim Grosbach 43034714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Handle cases where no arguments are passed first. 43134714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (ArgValues.empty()) { 43234714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 43334714a06096f854c76371295d8c20b017fbba50bJim Grosbach switch (RetTy->getTypeID()) { 43434714a06096f854c76371295d8c20b017fbba50bJim Grosbach default: llvm_unreachable("Unknown return type for function call!"); 43534714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::IntegerTyID: { 43634714a06096f854c76371295d8c20b017fbba50bJim Grosbach unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth(); 43734714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (BitWidth == 1) 43834714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)()); 43934714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 8) 44034714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)()); 44134714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 16) 44234714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)()); 44334714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 32) 44434714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)()); 44534714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 64) 44634714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)()); 44734714a06096f854c76371295d8c20b017fbba50bJim Grosbach else 44834714a06096f854c76371295d8c20b017fbba50bJim Grosbach llvm_unreachable("Integer types > 64 bits not supported"); 44934714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 45034714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 45134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::VoidTyID: 45234714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)()); 45334714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 45434714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::FloatTyID: 45534714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.FloatVal = ((float(*)())(intptr_t)FPtr)(); 45634714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 45734714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::DoubleTyID: 45834714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.DoubleVal = ((double(*)())(intptr_t)FPtr)(); 45934714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 46034714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::X86_FP80TyID: 46134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::FP128TyID: 46234714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::PPC_FP128TyID: 46334714a06096f854c76371295d8c20b017fbba50bJim Grosbach llvm_unreachable("long double not supported yet"); 46434714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::PointerTyID: 46534714a06096f854c76371295d8c20b017fbba50bJim Grosbach return PTOGV(((void*(*)())(intptr_t)FPtr)()); 46634714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 46734714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 46834714a06096f854c76371295d8c20b017fbba50bJim Grosbach 469858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("Full-featured argument passing not supported yet!"); 4706aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 47130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 47230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshevvoid *MCJIT::getPointerToNamedFunction(const std::string &Name, 4735fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky bool AbortOnFailure) { 4748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!isSymbolSearchingDisabled()) { 4758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor void *ptr = MemMgr.getPointerToNamedFunction(Name, false); 47630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (ptr) 47730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return ptr; 47830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 47930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 48030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev /// If a LazyFunctionCreator is installed, use it to get/create the function. 48130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (LazyFunctionCreator) 48230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (void *RP = LazyFunctionCreator(Name)) 48330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return RP; 48430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 48530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (AbortOnFailure) { 48630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev report_fatal_error("Program used external function '"+Name+ 4875fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky "' which could not be resolved!"); 48830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 48930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return 0; 49030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev} 491776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor 492776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::RegisterJITEventListener(JITEventListener *L) { 493776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (L == NULL) 494776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor return; 495776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 496776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners.push_back(L); 497776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 498776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::UnregisterJITEventListener(JITEventListener *L) { 499776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (L == NULL) 500776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor return; 501776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 502776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor SmallVector<JITEventListener*, 2>::reverse_iterator I= 503776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor std::find(EventListeners.rbegin(), EventListeners.rend(), L); 504776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (I != EventListeners.rend()) { 505776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor std::swap(*I, EventListeners.back()); 506776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners.pop_back(); 507776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 508776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 509776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) { 510776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 511b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor MemMgr.notifyObjectLoaded(this, &Obj); 512776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 513776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners[I]->NotifyObjectEmitted(Obj); 514776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 515776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 516776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyFreeingObject(const ObjectImage& Obj) { 517776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 518776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 519776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners[I]->NotifyFreeingObject(Obj); 520776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 521776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 5228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 5238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t LinkingMemoryManager::getSymbolAddress(const std::string &Name) { 5248e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = ParentEngine->getSymbolAddress(Name, false); 52552c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor // If the symbols wasn't found and it begins with an underscore, try again 52652c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor // without the underscore. 52752c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor if (!Result && Name[0] == '_') 52852c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor Result = ParentEngine->getSymbolAddress(Name.substr(1), false); 5298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result) 5308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 5318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return ClientMM->getSymbolAddress(Name); 5328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 533