mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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:
parent
f1dd28d89e
commit
0d448c03f3
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user