summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisha Brukman <brukman+llvm@gmail.com>2003-07-28 19:09:06 +0000
committerMisha Brukman <brukman+llvm@gmail.com>2003-07-28 19:09:06 +0000
commit057f46005333ee7db2cedc14d8aac95744d9dd62 (patch)
treeacaa426d096867355ac28c248d5ed758afad4f1d
parentee79899ce56ee6a2035e3509ab2c8884ee7f6a1f (diff)
downloadbcm5719-llvm-057f46005333ee7db2cedc14d8aac95744d9dd62.tar.gz
bcm5719-llvm-057f46005333ee7db2cedc14d8aac95744d9dd62.zip
Add ability for external C code to get pointers to functions given their name.
This us used by bugpoint -- when code is compiled to a shared object to be JITted, it must use the JIT's lazy resolution method to find function addresses, because some functions will not be available at .so load time, as they are in the bytecode file. llvm-svn: 7363
-rw-r--r--llvm/lib/ExecutionEngine/JIT/Emitter.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/Emitter.cpp b/llvm/lib/ExecutionEngine/JIT/Emitter.cpp
index 506da118c59..e6dc706d55f 100644
--- a/llvm/lib/ExecutionEngine/JIT/Emitter.cpp
+++ b/llvm/lib/ExecutionEngine/JIT/Emitter.cpp
@@ -11,14 +11,13 @@
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/Target/TargetData.h"
-#include "llvm/Function.h"
+#include "llvm/Module.h"
#include "Support/Statistic.h"
#include <stdio.h>
-static VM *TheVM = 0;
-
namespace {
Statistic<> NumBytes("jello", "Number of bytes of machine code compiled");
+ VM *TheVM = 0;
class Emitter : public MachineCodeEmitter {
// CurBlock - The start of the current block of memory. CurByte - The
@@ -186,3 +185,16 @@ uint64_t Emitter::forceCompilationOf(Function *F) {
return (intptr_t)TheVM->getPointerToFunction(F);
}
+// getPointerToNamedFunction - This function is used as a global wrapper to
+// VM::getPointerToNamedFunction for the purpose of resolving symbols when
+// bugpoint is debugging the JIT. In that scenario, we are loading an .so and
+// need to resolve function(s) that are being mis-codegenerated, so we need to
+// resolve their addresses at runtime, and this is the way to do it.
+extern "C" {
+ void *getPointerToNamedFunction(const char *Name) {
+ Module &M = TheVM->getModule();
+ if (Function *F = M.getNamedFunction(Name))
+ return TheVM->getPointerToFunction(F);
+ return TheVM->getPointerToNamedFunction(Name);
+ }
+}
OpenPOWER on IntegriCloud