From: Chris Lattner Date: Mon, 13 Jan 2003 01:00:48 +0000 (+0000) Subject: Add support for named functions X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0d448c03f30d7f4f7fa27fea1478aaf35e954f56;p=oota-llvm.git Add support for named functions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5258 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ExecutionEngine/JIT/JIT.h b/lib/ExecutionEngine/JIT/JIT.h index d3745e50827..3b267ed877b 100644 --- a/lib/ExecutionEngine/JIT/JIT.h +++ b/lib/ExecutionEngine/JIT/JIT.h @@ -44,6 +44,12 @@ public: void *resolveFunctionReference(void *RefAddr); + /// getPointerToNamedFunction - This method returns the address of the + /// specified function by using the dlsym function call. As such it is only + /// useful for resolving library symbols, not code generated symbols. + /// + void *getPointerToNamedFunction(const std::string &Name); + private: static MachineCodeEmitter *createEmitter(VM &V); void setupPassManager(); diff --git a/lib/ExecutionEngine/JIT/VM.cpp b/lib/ExecutionEngine/JIT/VM.cpp index f66d4d7b7ea..c107438f0f2 100644 --- a/lib/ExecutionEngine/JIT/VM.cpp +++ b/lib/ExecutionEngine/JIT/VM.cpp @@ -55,6 +55,22 @@ const std::string &VM::getFunctionReferencedName(void *RefAddr) { static void NoopFn() {} +/// getPointerToNamedFunction - This method returns the address of the specified +/// function by using the dlsym function call. As such it is only useful for +/// resolving library symbols, not code generated symbols. +/// +void *VM::getPointerToNamedFunction(const std::string &Name) { + // If it's an external function, look it up in the process image... + void *Ptr = dlsym(0, Name.c_str()); + if (Ptr == 0) { + std::cerr << "WARNING: Cannot resolve fn '" << Name + << "' using a dummy noop function instead!\n"; + Ptr = (void*)NoopFn; + } + + return Ptr; +} + /// getPointerToFunction - This method is used to get the address of the /// specified function, compiling it if neccesary. /// @@ -62,17 +78,8 @@ void *VM::getPointerToFunction(const Function *F) { void *&Addr = GlobalAddress[F]; // Function already code gen'd if (Addr) return Addr; - if (F->isExternal()) { - // If it's an external function, look it up in the process image... - void *Ptr = dlsym(0, F->getName().c_str()); - if (Ptr == 0) { - std::cerr << "WARNING: Cannot resolve fn '" << F->getName() - << "' using a dummy noop function instead!\n"; - Ptr = (void*)NoopFn; - } - - return Addr = Ptr; - } + if (F->isExternal()) + return Addr = getPointerToNamedFunction(F->getName()); // JIT all of the functions in the module. Eventually this will JIT functions // on demand. This has the effect of populating all of the non-external diff --git a/lib/ExecutionEngine/JIT/VM.h b/lib/ExecutionEngine/JIT/VM.h index d3745e50827..3b267ed877b 100644 --- a/lib/ExecutionEngine/JIT/VM.h +++ b/lib/ExecutionEngine/JIT/VM.h @@ -44,6 +44,12 @@ public: void *resolveFunctionReference(void *RefAddr); + /// getPointerToNamedFunction - This method returns the address of the + /// specified function by using the dlsym function call. As such it is only + /// useful for resolving library symbols, not code generated symbols. + /// + void *getPointerToNamedFunction(const std::string &Name); + private: static MachineCodeEmitter *createEmitter(VM &V); void setupPassManager();