Add support for named functions

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5258 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-01-13 01:00:48 +00:00
parent f1dd28d89e
commit 0d448c03f3
3 changed files with 30 additions and 11 deletions

View File

@ -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();

View File

@ -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

View File

@ -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();