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" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h" 228e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor#include "llvm/IR/Module.h" 23f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/MC/MCAsmInfo.h" 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/Archive.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/PassManager.h" 261f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DynamicLibrary.h" 27d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h" 28f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach#include "llvm/Support/MemoryBuffer.h" 29ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor#include "llvm/Support/MutexGuard.h" 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetLowering.h" 316aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 326aec29848676494867e26307698155bc2c5a4033Daniel Dunbarusing namespace llvm; 336aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 346aec29848676494867e26307698155bc2c5a4033Daniel Dunbarnamespace { 356aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 366aec29848676494867e26307698155bc2c5a4033Daniel Dunbarstatic struct RegisterJIT { 376aec29848676494867e26307698155bc2c5a4033Daniel Dunbar RegisterJIT() { MCJIT::Register(); } 386aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} JITRegistrator; 396aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 406aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 416aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 426aec29848676494867e26307698155bc2c5a4033Daniel Dunbarextern "C" void LLVMLinkInMCJIT() { 436aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 446aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 456aec29848676494867e26307698155bc2c5a4033Daniel DunbarExecutionEngine *MCJIT::createJIT(Module *M, 466aec29848676494867e26307698155bc2c5a4033Daniel Dunbar std::string *ErrorStr, 4713a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo RTDyldMemoryManager *MemMgr, 486aec29848676494867e26307698155bc2c5a4033Daniel Dunbar bool GVsWithCode, 49c5b28580a94e247300e5d3ccf532e153f2ae6f12Dylan Noblesmith TargetMachine *TM) { 506aec29848676494867e26307698155bc2c5a4033Daniel Dunbar // Try to register the program as a source of symbols to resolve against. 516aec29848676494867e26307698155bc2c5a4033Daniel Dunbar // 526aec29848676494867e26307698155bc2c5a4033Daniel Dunbar // FIXME: Don't do this here. 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines sys::DynamicLibrary::LoadLibraryPermanently(nullptr, nullptr); 546aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 5513a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo return new MCJIT(M, TM, MemMgr ? MemMgr : new SectionMemoryManager(), 5613a3cf192887233fb9452ec5b7f841e4652c33c7Filip Pizlo GVsWithCode); 576aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 586aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 598005bcd5e0c923881d82afcb813a7e537cd1b241Jim GrosbachMCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM, 608005bcd5e0c923881d82afcb813a7e537cd1b241Jim Grosbach bool AllocateGVsWithCode) 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : ExecutionEngine(m), TM(tm), Ctx(nullptr), MemMgr(this, MM), Dyld(&MemMgr), 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ObjCache(nullptr) { 6331649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 642ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor OwnedModules.addModule(m); 653574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow setDataLayout(TM->getDataLayout()); 66ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor} 67ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 68ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew KaylorMCJIT::~MCJIT() { 696169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 702ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // FIXME: We are managing our modules, so we do not want the base class 712ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // ExecutionEngine to manage them as well. To avoid double destruction 722ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // of the first (and only) module added in ExecutionEngine constructor 732ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // we remove it from EE and will destruct it ourselves. 742ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // 752ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // It may make sense to move our module manager (based on SmallStPtr) back 762ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // into EE if the JIT and Interpreter can live with it. 772ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // If so, additional functions: addModule, removeModule, FindFunctionNamed, 782ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // runStaticConstructorsDestructors could be moved back to EE as well. 792ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // 802ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor Modules.clear(); 8143507d026bef31100cb0c35614bcf419029a265bAndrew Kaylor Dyld.deregisterEHFrames(); 82817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LoadedObjectList::iterator it, end; 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (it = LoadedObjects.begin(), end = LoadedObjects.end(); it != end; ++it) { 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ObjectImage *Obj = *it; 86817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth if (Obj) { 87817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth NotifyFreeingObject(*Obj); 88817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth delete Obj; 89817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth } 90817987350442e9349dbcf3416abaadc1796036a4Chandler Carruth } 918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor LoadedObjects.clear(); 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<object::Archive *, 2>::iterator ArIt, ArEnd; 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (ArIt = Archives.begin(), ArEnd = Archives.end(); ArIt != ArEnd; ++ArIt) { 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::Archive *A = *ArIt; 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines delete A; 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Archives.clear(); 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 101ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor delete TM; 102ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor} 103ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 1048e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::addModule(Module *M) { 1056169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 1062ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor OwnedModules.addModule(M); 1072ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor} 1082ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 1092ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylorbool MCJIT::removeModule(Module *M) { 1102ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor MutexGuard locked(lock); 1112ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor return OwnedModules.removeModule(M); 1128e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 1138e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 1142ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 1152ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) { 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ObjectImage *LoadedObject = Dyld.loadObject(std::move(Obj)); 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (!LoadedObject || Dyld.hasError()) 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines report_fatal_error(Dyld.getErrorString()); 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LoadedObjects.push_back(LoadedObject); 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines NotifyObjectEmitted(*LoadedObject); 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid MCJIT::addArchive(object::Archive *A) { 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Archives.push_back(A); 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1311c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylorvoid MCJIT::setObjectCache(ObjectCache* NewCache) { 1326169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 1331c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjCache = NewCache; 1341c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor} 1351c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1368e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorObjectBufferStream* MCJIT::emitObject(Module *M) { 1376169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 1386169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 1392ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // This must be a module which has already been added but not loaded to this 1402ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // MCJIT instance, since these conditions are tested by our caller, 1412ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // generateCodeForModule. 142ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 143ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor PassManager PM; 144ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines M->setDataLayout(TM->getDataLayout()); 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PM.add(new DataLayoutPass(M)); 14731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 1483f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // The RuntimeDyld will take ownership of this shortly 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<ObjectBufferStream> CompiledObject(new ObjectBufferStream()); 1503f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor 15131649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Turn the machine code intermediate representation into bytes in memory 15231649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // that may be executed. 153dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), 154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines !getVerifyModules())) { 15531649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach report_fatal_error("Target does not support MC emission!"); 15631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach } 15731649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach 15831649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach // Initialize passes. 1598e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor PM.run(*M); 1603f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // Flush the output buffer to get the generated code into memory 1611c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor CompiledObject->flush(); 1621c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1631c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // If we have an object cache, tell it about the new object. 1641c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Note that we're using the compiled image, not the loaded image (as below). 1651c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (ObjCache) { 1661c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // MemoryBuffer is a thin wrapper around the actual memory, so it's OK 1671c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // to create a temporary object here and delete it after the call. 16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MemoryBuffer> MB(CompiledObject->getMemBuffer()); 1698e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor ObjCache->notifyObjectCompiled(M, MB.get()); 1701c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 1711c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return CompiledObject.release(); 1731c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor} 1741c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1758e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::generateCodeForModule(Module *M) { 1766169453ba37ac353655f2475f336e66f31276752Andrew Kaylor // Get a thread lock to make sure we aren't trying to load multiple times 1776169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 1786169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 1798e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 1802ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor assert(OwnedModules.ownsModule(M) && 1812ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor "MCJIT::generateCodeForModule: Unknown module."); 1821c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1831c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Re-compilation is not supported 1842ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor if (OwnedModules.hasModuleBeenLoaded(M)) 1851c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor return; 1861c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<ObjectBuffer> ObjectToLoad; 1881c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // Try to load the pre-compiled object from cache if possible 189dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (ObjCache) { 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MemoryBuffer> PreCompiledObject(ObjCache->getObject(M)); 191dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (PreCompiledObject.get()) 19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ObjectToLoad.reset(new ObjectBuffer(PreCompiledObject.release())); 1931c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 1941c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor 1951c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor // If the cache did not contain a suitable object, compile the object 1961c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor if (!ObjectToLoad) { 1971c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor ObjectToLoad.reset(emitObject(M)); 1981c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor assert(ObjectToLoad.get() && "Compilation did not produce an object."); 1991c489455ea5fac43a5f20911dfb5486630eb0160Andrew Kaylor } 200f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach 201f922910494377909b4cf2a0b73f509b2b1925799Jim Grosbach // Load the object into the dynamic linker. 20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // MCJIT now owns the ObjectImage pointer (via its LoadedObjects list). 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.release()); 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LoadedObjects.push_back(LoadedObject); 2053f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor if (!LoadedObject) 2068086f3b49429e02603270c8e09e2aabac9215a21Jim Grosbach report_fatal_error(Dyld.getErrorString()); 207ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 2083f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor // FIXME: Make this optional, maybe even move it to a JIT event listener 2093f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor LoadedObject->registerWithDebugger(); 2103f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor 211776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor NotifyObjectEmitted(*LoadedObject); 212776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor 2132ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor OwnedModules.markModuleAsLoaded(M); 2148e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2158e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2168e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeLoadedModules() { 2176169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 2186169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 2198e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Resolve any outstanding relocations. 2208e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Dyld.resolveRelocations(); 2218e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2222ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor OwnedModules.markAllLoadedModulesAsFinalized(); 2238e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2242ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // Register EH frame data for any module we own which has been loaded 225528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor Dyld.registerEHFrames(); 226528f6d787b1a847e61eb2f1114559f423fdeb68cAndrew Kaylor 2278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Set page permissions. 2288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor MemMgr.finalizeMemory(); 2296aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 2306aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 2318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// FIXME: Rename this. 23228989889bf3aa3314562d438aece245b71176ec4Andrew Kaylorvoid MCJIT::finalizeObject() { 2336169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 2346169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 2352ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor for (ModulePtrSet::iterator I = OwnedModules.begin_added(), 2362ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor E = OwnedModules.end_added(); 2372ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor I != E; ++I) { 2382ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor Module *M = *I; 2392ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor generateCodeForModule(M); 24028989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor } 24128989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor 2422ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor finalizeLoadedModules(); 2438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid MCJIT::finalizeModule(Module *M) { 2466169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 2476169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 2488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // This must be a module which has already been added to this MCJIT instance. 2492ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor assert(OwnedModules.ownsModule(M) && "MCJIT::finalizeModule: Unknown module."); 2508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If the module hasn't been compiled, just do that. 2522ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor if (!OwnedModules.hasModuleBeenLoaded(M)) 2538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 2548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2552ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor finalizeLoadedModules(); 25628989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor} 25728989889bf3aa3314562d438aece245b71176ec4Andrew Kaylor 2586aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::getPointerToBasicBlock(BasicBlock *BB) { 2596aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 2606aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 2616aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 2628e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getExistingSymbolAddress(const std::string &Name) { 26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mangler Mang(TM->getDataLayout()); 26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallString<128> FullName; 26536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mang.getNameWithPrefix(FullName, Name); 26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Dyld.getSymbolLoadAddress(FullName); 2678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2698e9ec015348c5419b905c2ca6e39534429eda073Andrew KaylorModule *MCJIT::findModuleForSymbol(const std::string &Name, 2708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool CheckFunctionsOnly) { 2716169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 2726169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 2738e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If it hasn't already been generated, see if it's in one of our modules. 2742ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor for (ModulePtrSet::iterator I = OwnedModules.begin_added(), 2752ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor E = OwnedModules.end_added(); 2762ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor I != E; ++I) { 2772ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor Module *M = *I; 2788e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Function *F = M->getFunction(Name); 27959bbf5a759a4891ea90ac67f13485f67ef42234cAndrew Kaylor if (F && !F->isDeclaration()) 2808e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return M; 2818e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!CheckFunctionsOnly) { 2828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor GlobalVariable *G = M->getGlobalVariable(Name); 28359bbf5a759a4891ea90ac67f13485f67ef42234cAndrew Kaylor if (G && !G->isDeclaration()) 2848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return M; 2858e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // FIXME: Do we need to worry about global aliases? 2868e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2878e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor } 2888e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // We didn't find the symbol in any of our modules. 289dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 2908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 2918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 2928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getSymbolAddress(const std::string &Name, 2938e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor bool CheckFunctionsOnly) 2948e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor{ 2956169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 2966169453ba37ac353655f2475f336e66f31276752Andrew Kaylor 2978e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // First, check to see if we already have this symbol. 2988e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Addr = getExistingSymbolAddress(Name); 2998e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Addr) 3008e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Addr; 3018e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallVector<object::Archive*, 2>::iterator I, E; 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines for (I = Archives.begin(), E = Archives.end(); I != E; ++I) { 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::Archive *A = *I; 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Look for our symbols in each Archive 30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines object::Archive::child_iterator ChildIt = A->findSym(Name); 30736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (ChildIt != A->child_end()) { 30836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: Support nested archives? 309cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ErrorOr<std::unique_ptr<object::Binary>> ChildBinOrErr = 310cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ChildIt->getAsBinary(); 311cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ChildBinOrErr.getError()) 312cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 313cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines std::unique_ptr<object::Binary> ChildBin = std::move(ChildBinOrErr.get()); 314cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ChildBin->isObject()) { 315dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines std::unique_ptr<object::ObjectFile> OF( 316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines static_cast<object::ObjectFile *>(ChildBin.release())); 31736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // This causes the object file to be loaded. 318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines addObjectFile(std::move(OF)); 31936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The address should be here now. 32036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Addr = getExistingSymbolAddress(Name); 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (Addr) 32236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return Addr; 32336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3278e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // If it hasn't already been generated, see if it's in one of our modules. 3288e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = findModuleForSymbol(Name, CheckFunctionsOnly); 3298e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!M) 3308e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return 0; 3318e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3328e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 3338e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Check the RuntimeDyld table again, it should be there now. 3358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return getExistingSymbolAddress(Name); 3368e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3378e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3388e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getGlobalValueAddress(const std::string &Name) { 3396169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 3408e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = getSymbolAddress(Name, false); 3418e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result != 0) 3428e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeLoadedModules(); 3438e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 3448e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3458e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3468e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t MCJIT::getFunctionAddress(const std::string &Name) { 3476169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 3488e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = getSymbolAddress(Name, true); 3498e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result != 0) 3508e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor finalizeLoadedModules(); 3518e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 3528e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 3538e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3548e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor// Deprecated. Use getFunctionAddress instead. 3558e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylorvoid *MCJIT::getPointerToFunction(Function *F) { 3566169453ba37ac353655f2475f336e66f31276752Andrew Kaylor MutexGuard locked(lock); 357ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor 35834714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (F->isDeclaration() || F->hasAvailableExternallyLinkage()) { 35934714a06096f854c76371295d8c20b017fbba50bJim Grosbach bool AbortOnFailure = !F->hasExternalWeakLinkage(); 36034714a06096f854c76371295d8c20b017fbba50bJim Grosbach void *Addr = getPointerToNamedFunction(F->getName(), AbortOnFailure); 36134714a06096f854c76371295d8c20b017fbba50bJim Grosbach addGlobalMapping(F, Addr); 36234714a06096f854c76371295d8c20b017fbba50bJim Grosbach return Addr; 36334714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 36434714a06096f854c76371295d8c20b017fbba50bJim Grosbach 3658e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor Module *M = F->getParent(); 3662ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor bool HasBeenAddedButNotLoaded = OwnedModules.hasModuleBeenAddedButNotLoaded(M); 3678e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 3688e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor // Make sure the relevant module has been compiled and loaded. 3692ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor if (HasBeenAddedButNotLoaded) 3708e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor generateCodeForModule(M); 3712ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor else if (!OwnedModules.hasModuleBeenLoaded(M)) 3722ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // If this function doesn't belong to one of our modules, we're done. 373dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 3748e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 375ea708d1071898bd8fda58f9d58d1d3fe38faf9f2Andrew Kaylor // FIXME: Should the Dyld be retaining module information? Probably not. 37635ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // 37735ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // This is the accessor for the target address, so make sure to check the 37835ed842773da41779d57d3ed23f440202d0be198Jim Grosbach // load address of the symbol, not the local address. 37936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mangler Mang(TM->getDataLayout()); 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SmallString<128> Name; 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines TM->getNameWithPrefix(Name, F, Mang); 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return (void*)Dyld.getSymbolLoadAddress(Name); 3836aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3846aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3856aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid *MCJIT::recompileAndRelinkFunction(Function *F) { 3866aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 3876aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3886aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3896aec29848676494867e26307698155bc2c5a4033Daniel Dunbarvoid MCJIT::freeMachineCodeForFunction(Function *F) { 3906aec29848676494867e26307698155bc2c5a4033Daniel Dunbar report_fatal_error("not yet implemented"); 3916aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 3926aec29848676494867e26307698155bc2c5a4033Daniel Dunbar 3932ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylorvoid MCJIT::runStaticConstructorsDestructorsInModulePtrSet( 3942ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor bool isDtors, ModulePtrSet::iterator I, ModulePtrSet::iterator E) { 3952ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor for (; I != E; ++I) { 3962ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor ExecutionEngine::runStaticConstructorsDestructors(*I, isDtors); 3972ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor } 3982ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor} 3992ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 4002ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylorvoid MCJIT::runStaticConstructorsDestructors(bool isDtors) { 4012ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor // Execute global ctors/dtors for each module in the program. 4022ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor runStaticConstructorsDestructorsInModulePtrSet( 4032ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor isDtors, OwnedModules.begin_added(), OwnedModules.end_added()); 4042ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor runStaticConstructorsDestructorsInModulePtrSet( 4052ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor isDtors, OwnedModules.begin_loaded(), OwnedModules.end_loaded()); 4062ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor runStaticConstructorsDestructorsInModulePtrSet( 4072ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor isDtors, OwnedModules.begin_finalized(), OwnedModules.end_finalized()); 4082ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor} 4092ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 4102ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew KaylorFunction *MCJIT::FindFunctionNamedInModulePtrSet(const char *FnName, 4112ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor ModulePtrSet::iterator I, 4122ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor ModulePtrSet::iterator E) { 4132ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor for (; I != E; ++I) { 4142ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor if (Function *F = (*I)->getFunction(FnName)) 4152ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor return F; 4162ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor } 417dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 4182ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor} 4192ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 4202ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew KaylorFunction *MCJIT::FindFunctionNamed(const char *FnName) { 4212ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor Function *F = FindFunctionNamedInModulePtrSet( 4222ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor FnName, OwnedModules.begin_added(), OwnedModules.end_added()); 4232ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor if (!F) 4242ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor F = FindFunctionNamedInModulePtrSet(FnName, OwnedModules.begin_loaded(), 4252ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor OwnedModules.end_loaded()); 4262ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor if (!F) 4272ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor F = FindFunctionNamedInModulePtrSet(FnName, OwnedModules.begin_finalized(), 4282ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor OwnedModules.end_finalized()); 4292ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor return F; 4302ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor} 4312ad18efdc73bc2356aa7fbf811d5ecbbaac0f2c9Andrew Kaylor 4326aec29848676494867e26307698155bc2c5a4033Daniel DunbarGenericValue MCJIT::runFunction(Function *F, 4336aec29848676494867e26307698155bc2c5a4033Daniel Dunbar const std::vector<GenericValue> &ArgValues) { 43434714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(F && "Function *F was null at entry to run()"); 43534714a06096f854c76371295d8c20b017fbba50bJim Grosbach 43631649e61bcead26a63c7cd452da90fff5e000b91Jim Grosbach void *FPtr = getPointerToFunction(F); 43734714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(FPtr && "Pointer to fn's code was null after getPointerToFunction"); 438db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *FTy = F->getFunctionType(); 439db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *RetTy = FTy->getReturnType(); 44034714a06096f854c76371295d8c20b017fbba50bJim Grosbach 44134714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert((FTy->getNumParams() == ArgValues.size() || 44234714a06096f854c76371295d8c20b017fbba50bJim Grosbach (FTy->isVarArg() && FTy->getNumParams() <= ArgValues.size())) && 44334714a06096f854c76371295d8c20b017fbba50bJim Grosbach "Wrong number of arguments passed into function!"); 44434714a06096f854c76371295d8c20b017fbba50bJim Grosbach assert(FTy->getNumParams() == ArgValues.size() && 44534714a06096f854c76371295d8c20b017fbba50bJim Grosbach "This doesn't support passing arguments through varargs (yet)!"); 44634714a06096f854c76371295d8c20b017fbba50bJim Grosbach 44734714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Handle some common cases first. These cases correspond to common `main' 44834714a06096f854c76371295d8c20b017fbba50bJim Grosbach // prototypes. 44934714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (RetTy->isIntegerTy(32) || RetTy->isVoidTy()) { 45034714a06096f854c76371295d8c20b017fbba50bJim Grosbach switch (ArgValues.size()) { 45134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 3: 45234714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getParamType(0)->isIntegerTy(32) && 45334714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(1)->isPointerTy() && 45434714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(2)->isPointerTy()) { 45534714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int, char **, const char **) = 45634714a06096f854c76371295d8c20b017fbba50bJim Grosbach (int(*)(int, char **, const char **))(intptr_t)FPtr; 45734714a06096f854c76371295d8c20b017fbba50bJim Grosbach 45834714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Call the function. 45934714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 46034714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 46134714a06096f854c76371295d8c20b017fbba50bJim Grosbach (char **)GVTOP(ArgValues[1]), 46234714a06096f854c76371295d8c20b017fbba50bJim Grosbach (const char **)GVTOP(ArgValues[2]))); 46334714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 46434714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 46534714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 46634714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 2: 46734714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getParamType(0)->isIntegerTy(32) && 46834714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(1)->isPointerTy()) { 46934714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int, char **) = (int(*)(int, char **))(intptr_t)FPtr; 47034714a06096f854c76371295d8c20b017fbba50bJim Grosbach 47134714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Call the function. 47234714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 47334714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue(), 47434714a06096f854c76371295d8c20b017fbba50bJim Grosbach (char **)GVTOP(ArgValues[1]))); 47534714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 47634714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 47734714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 47834714a06096f854c76371295d8c20b017fbba50bJim Grosbach case 1: 47934714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (FTy->getNumParams() == 1 && 48034714a06096f854c76371295d8c20b017fbba50bJim Grosbach FTy->getParamType(0)->isIntegerTy(32)) { 48134714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 48234714a06096f854c76371295d8c20b017fbba50bJim Grosbach int (*PF)(int) = (int(*)(int))(intptr_t)FPtr; 48334714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, PF(ArgValues[0].IntVal.getZExtValue())); 48434714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 48534714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 48634714a06096f854c76371295d8c20b017fbba50bJim Grosbach break; 48734714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 48834714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 48934714a06096f854c76371295d8c20b017fbba50bJim Grosbach 49034714a06096f854c76371295d8c20b017fbba50bJim Grosbach // Handle cases where no arguments are passed first. 49134714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (ArgValues.empty()) { 49234714a06096f854c76371295d8c20b017fbba50bJim Grosbach GenericValue rv; 49334714a06096f854c76371295d8c20b017fbba50bJim Grosbach switch (RetTy->getTypeID()) { 49434714a06096f854c76371295d8c20b017fbba50bJim Grosbach default: llvm_unreachable("Unknown return type for function call!"); 49534714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::IntegerTyID: { 49634714a06096f854c76371295d8c20b017fbba50bJim Grosbach unsigned BitWidth = cast<IntegerType>(RetTy)->getBitWidth(); 49734714a06096f854c76371295d8c20b017fbba50bJim Grosbach if (BitWidth == 1) 49834714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((bool(*)())(intptr_t)FPtr)()); 49934714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 8) 50034714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((char(*)())(intptr_t)FPtr)()); 50134714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 16) 50234714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((short(*)())(intptr_t)FPtr)()); 50334714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 32) 50434714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((int(*)())(intptr_t)FPtr)()); 50534714a06096f854c76371295d8c20b017fbba50bJim Grosbach else if (BitWidth <= 64) 50634714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(BitWidth, ((int64_t(*)())(intptr_t)FPtr)()); 50734714a06096f854c76371295d8c20b017fbba50bJim Grosbach else 50834714a06096f854c76371295d8c20b017fbba50bJim Grosbach llvm_unreachable("Integer types > 64 bits not supported"); 50934714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 51034714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 51134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::VoidTyID: 51234714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.IntVal = APInt(32, ((int(*)())(intptr_t)FPtr)()); 51334714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 51434714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::FloatTyID: 51534714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.FloatVal = ((float(*)())(intptr_t)FPtr)(); 51634714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 51734714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::DoubleTyID: 51834714a06096f854c76371295d8c20b017fbba50bJim Grosbach rv.DoubleVal = ((double(*)())(intptr_t)FPtr)(); 51934714a06096f854c76371295d8c20b017fbba50bJim Grosbach return rv; 52034714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::X86_FP80TyID: 52134714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::FP128TyID: 52234714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::PPC_FP128TyID: 52334714a06096f854c76371295d8c20b017fbba50bJim Grosbach llvm_unreachable("long double not supported yet"); 52434714a06096f854c76371295d8c20b017fbba50bJim Grosbach case Type::PointerTyID: 52534714a06096f854c76371295d8c20b017fbba50bJim Grosbach return PTOGV(((void*(*)())(intptr_t)FPtr)()); 52634714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 52734714a06096f854c76371295d8c20b017fbba50bJim Grosbach } 52834714a06096f854c76371295d8c20b017fbba50bJim Grosbach 529858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper llvm_unreachable("Full-featured argument passing not supported yet!"); 5306aec29848676494867e26307698155bc2c5a4033Daniel Dunbar} 53130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 53230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshevvoid *MCJIT::getPointerToNamedFunction(const std::string &Name, 5335fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky bool AbortOnFailure) { 5348e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (!isSymbolSearchingDisabled()) { 5358e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor void *ptr = MemMgr.getPointerToNamedFunction(Name, false); 53630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (ptr) 53730b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return ptr; 53830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 53930b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 54030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev /// If a LazyFunctionCreator is installed, use it to get/create the function. 54130b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (LazyFunctionCreator) 54230b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (void *RP = LazyFunctionCreator(Name)) 54330b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev return RP; 54430b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev 54530b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev if (AbortOnFailure) { 54630b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev report_fatal_error("Program used external function '"+Name+ 5475fe019835c269ccbfe185276269bc53b3f9a7a86Eli Bendersky "' which could not be resolved!"); 54830b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev } 549dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 55030b9e322e159df8eaabb5b194cec6e11ba99c261Danil Malyshev} 551776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor 552776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::RegisterJITEventListener(JITEventListener *L) { 553dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!L) 554776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor return; 555776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 556776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners.push_back(L); 557776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 558776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::UnregisterJITEventListener(JITEventListener *L) { 559dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!L) 560776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor return; 561776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 562776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor SmallVector<JITEventListener*, 2>::reverse_iterator I= 563776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor std::find(EventListeners.rbegin(), EventListeners.rend(), L); 564776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor if (I != EventListeners.rend()) { 565776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor std::swap(*I, EventListeners.back()); 566776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners.pop_back(); 567776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 568776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 569776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) { 570776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 571b868e9101c138016aad5bd910b67f40a3213d6fcAndrew Kaylor MemMgr.notifyObjectLoaded(this, &Obj); 572776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 573776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners[I]->NotifyObjectEmitted(Obj); 574776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 575776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 576776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylorvoid MCJIT::NotifyFreeingObject(const ObjectImage& Obj) { 577776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor MutexGuard locked(lock); 578776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { 579776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor EventListeners[I]->NotifyFreeingObject(Obj); 580776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor } 581776054dd938472828ac3ebf75b05e21171ef4ecfAndrew Kaylor} 5828e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor 5838e9ec015348c5419b905c2ca6e39534429eda073Andrew Kayloruint64_t LinkingMemoryManager::getSymbolAddress(const std::string &Name) { 5848e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor uint64_t Result = ParentEngine->getSymbolAddress(Name, false); 58552c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor // If the symbols wasn't found and it begins with an underscore, try again 58652c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor // without the underscore. 58752c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor if (!Result && Name[0] == '_') 58852c9016db0560644a03ca661302e45143372f2fcAndrew Kaylor Result = ParentEngine->getSymbolAddress(Name.substr(1), false); 5898e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor if (Result) 5908e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return Result; 5918e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor return ClientMM->getSymbolAddress(Name); 5928e9ec015348c5419b905c2ca6e39534429eda073Andrew Kaylor} 593