mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 06:06:19 +00:00
Implement external function support
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4902 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
08053e46be
commit
75a213dbe8
@ -10,6 +10,7 @@
|
||||
#include "llvm/CodeGen/MachineCodeEmitter.h"
|
||||
#include "llvm/Function.h"
|
||||
#include <iostream>
|
||||
#include <dlfcn.h> // dlsym access
|
||||
|
||||
|
||||
VM::~VM() {
|
||||
@ -58,6 +59,7 @@ const std::string &VM::getFunctionReferencedName(void *RefAddr) {
|
||||
return FunctionRefs[RefAddr]->getName();
|
||||
}
|
||||
|
||||
static void NoopFn() {}
|
||||
|
||||
/// getPointerToFunction - This method is used to get the address of the
|
||||
/// specified function, compiling it if neccesary.
|
||||
@ -67,7 +69,15 @@ void *VM::getPointerToFunction(Function *F) {
|
||||
if (Addr) return Addr;
|
||||
|
||||
if (F->isExternal()) {
|
||||
assert(0 && "VM::getPointerToFunction: Doesn't handle external fn's yet!");
|
||||
// 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;
|
||||
}
|
||||
|
||||
// JIT all of the functions in the module. Eventually this will JIT functions
|
||||
|
Loading…
Reference in New Issue
Block a user