aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ExecutionEngine
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2009-03-04 19:10:38 +0000
committerNate Begeman <natebegeman@mac.com>2009-03-04 19:10:38 +0000
commite1ba87fd4ccc66407e01072465fabce75205dc78 (patch)
tree4c164fb4ef8279881468af9273e16f0a25780b52 /lib/ExecutionEngine
parent0e94e91f8140a123512e7a658fcd9f54c7758c48 (diff)
downloadexternal_llvm-e1ba87fd4ccc66407e01072465fabce75205dc78.zip
external_llvm-e1ba87fd4ccc66407e01072465fabce75205dc78.tar.gz
external_llvm-e1ba87fd4ccc66407e01072465fabce75205dc78.tar.bz2
Fix a thinko in the JIT where the address of a GV was only recorded in the map
on failure to resolve it. Do not abort on failure to resolve an external symbol when using dlsym stubs, since the symbol may not be in the JIT's address space. Just use 0. Allow dlsym stubs to differentiate between GlobalVars and Functions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@66050 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r--lib/ExecutionEngine/JIT/JIT.cpp4
-rw-r--r--lib/ExecutionEngine/JIT/JITEmitter.cpp18
2 files changed, 16 insertions, 6 deletions
diff --git a/lib/ExecutionEngine/JIT/JIT.cpp b/lib/ExecutionEngine/JIT/JIT.cpp
index 3fd5be7..633a75e 100644
--- a/lib/ExecutionEngine/JIT/JIT.cpp
+++ b/lib/ExecutionEngine/JIT/JIT.cpp
@@ -609,12 +609,12 @@ void *JIT::getOrEmitGlobalVariable(const GlobalVariable *GV) {
return (void*)&__dso_handle;
#endif
Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(GV->getName().c_str());
- if (Ptr == 0) {
+ if (Ptr == 0 && !areDlsymStubsEnabled()) {
cerr << "Could not resolve external global address: "
<< GV->getName() << "\n";
abort();
- addGlobalMapping(GV, Ptr);
}
+ addGlobalMapping(GV, Ptr);
} else {
// GlobalVariable's which are not "constant" will cause trouble in a server
// situation. It's returned in the same block of memory as code which may
diff --git a/lib/ExecutionEngine/JIT/JITEmitter.cpp b/lib/ExecutionEngine/JIT/JITEmitter.cpp
index 5c6236d..22515f3 100644
--- a/lib/ExecutionEngine/JIT/JITEmitter.cpp
+++ b/lib/ExecutionEngine/JIT/JITEmitter.cpp
@@ -1348,12 +1348,22 @@ void JIT::updateDlsymStubTable() {
for (unsigned i = 0; i != GVs.size(); ++i)
MCE->emitInt32(Offsets[i]);
- // Emit the pointers
- for (unsigned i = 0; i != GVs.size(); ++i)
+ // Emit the pointers. Verify that they are at least 2-byte aligned, and set
+ // the low bit to 0 == GV, 1 == Function, so that the client code doing the
+ // relocation can write the relocated pointer at the appropriate place in
+ // the stub.
+ for (unsigned i = 0; i != GVs.size(); ++i) {
+ intptr_t Ptr = (intptr_t)Ptrs[i];
+ assert((Ptr & 1) == 0 && "Stub pointers must be at least 2-byte aligned!");
+
+ if (isa<Function>(GVs[i]))
+ Ptr |= (intptr_t)1;
+
if (sizeof(void *) == 8)
- MCE->emitInt64((intptr_t)Ptrs[i]);
+ MCE->emitInt64(Ptr);
else
- MCE->emitInt32((intptr_t)Ptrs[i]);
+ MCE->emitInt32(Ptr);
+ }
// Emit the strings
for (unsigned i = 0; i != GVs.size(); ++i)