summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp14
-rw-r--r--llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp26
2 files changed, 13 insertions, 27 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
index a9f8ab7bb88..e39acc7ee14 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
@@ -262,18 +262,15 @@ RTDyldMemoryManager::getSymbolAddressInProcess(const std::string &Name) {
// is called before ExecutionEngine::runFunctionAsMain() is called.
if (Name == "__main") return (uint64_t)&jit_noop;
- // Try to demangle Name before looking it up in the process, otherwise symbol
- // '_<Name>' (if present) will shadow '<Name>', and there will be no way to
- // refer to the latter.
-
const char *NameStr = Name.c_str();
+ // DynamicLibrary::SearchForAddresOfSymbol expects an unmangled 'C' symbol
+ // name so ff we're on Darwin, strip the leading '_' off.
+#ifdef __APPLE__
if (NameStr[0] == '_')
- if (void *Ptr = sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr + 1))
- return (uint64_t)Ptr;
+ ++NameStr;
+#endif
- // If we Name did not require demangling, or we failed to find the demangled
- // name, try again without demangling.
return (uint64_t)sys::DynamicLibrary::SearchForAddressOfSymbol(NameStr);
}
@@ -284,6 +281,7 @@ void *RTDyldMemoryManager::getPointerToNamedFunction(const std::string &Name,
if (!Addr && AbortOnFailure)
report_fatal_error("Program used external function '" + Name +
"' which could not be resolved!");
+
return (void*)Addr;
}
diff --git a/llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp b/llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp
index bb47c4c0030..3ffa9cd9b8f 100644
--- a/llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp
+++ b/llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp
@@ -136,35 +136,23 @@ TEST_F(ExecutionEngineTest, DestructionRemovesGlobalMapping) {
EXPECT_EQ(nullptr, Engine->getGlobalValueAtAddress(&Mem1));
}
-TEST_F(ExecutionEngineTest, LookupWithMangledName) {
- int x;
- llvm::sys::DynamicLibrary::AddSymbol("x", &x);
-
- // Demonstrate that getSymbolAddress accepts mangled names and always strips
- // the leading underscore.
- EXPECT_EQ(reinterpret_cast<uint64_t>(&x),
- RTDyldMemoryManager::getSymbolAddressInProcess("_x"));
-}
-
TEST_F(ExecutionEngineTest, LookupWithMangledAndDemangledSymbol) {
int x;
int _x;
llvm::sys::DynamicLibrary::AddSymbol("x", &x);
llvm::sys::DynamicLibrary::AddSymbol("_x", &_x);
- // Lookup the demangled name first, even if there's a demangled symbol that
- // matches the input already.
+ // RTDyldMemoryManager::getSymbolAddressInProcess expects a mangled symbol,
+ // but DynamicLibrary is a wrapper for dlsym, which expects the unmangled C
+ // symbol name. This test verifies that getSymbolAddressInProcess strips the
+ // leading '_' on Darwin, but not on other platforms.
+#ifdef __APPLE__
EXPECT_EQ(reinterpret_cast<uint64_t>(&x),
RTDyldMemoryManager::getSymbolAddressInProcess("_x"));
-}
-
-TEST_F(ExecutionEngineTest, LookupwithDemangledName) {
- int _x;
- llvm::sys::DynamicLibrary::AddSymbol("_x", &_x);
-
- // But do fallback to looking up a demangled name if there's no ambiguity
+#else
EXPECT_EQ(reinterpret_cast<uint64_t>(&_x),
RTDyldMemoryManager::getSymbolAddressInProcess("_x"));
+#endif
}
}
OpenPOWER on IntegriCloud