diff options
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp | 14 | ||||
-rw-r--r-- | llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp | 26 |
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 } } |