diff options
author | Lang Hames <lhames@gmail.com> | 2016-03-03 21:23:15 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2016-03-03 21:23:15 +0000 |
commit | 3b514554a2ab643813c91f161d69c5a5c305efcf (patch) | |
tree | 9d4c90086d2f8914b1a2f10ff9b3402675a9d747 /llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp | |
parent | 30138256fa629a78da3bcc587a0885dd4a8bdd7a (diff) | |
download | bcm5719-llvm-3b514554a2ab643813c91f161d69c5a5c305efcf.tar.gz bcm5719-llvm-3b514554a2ab643813c91f161d69c5a5c305efcf.zip |
[RuntimeDyld] Fix '_' stripping in RTDyldMemoryManager::getSymbolAddressInProcess.
The RTDyldMemoryManager::getSymbolAddressInProcess method accepts a
linker-mangled symbol name, but it calls through to dlsym to do the lookup (via
DynamicLibrary::SearchForAddressOfSymbol), and dlsym expects an unmangled
symbol name.
Historically we've attempted to "demangle" by removing leading '_'s on all
platforms, and fallen back to an extra search if that failed. That's broken, as
it can cause symbols to resolve incorrectly on platforms that don't do mangling
if you query '_foo' and the process also happens to contain a 'foo'.
Fix this by demangling conditionally based on the host platform. That's safe
here because this function is specifically for symbols in the host process, so
the usual cross-process JIT looking concerns don't apply.
M unittests/ExecutionEngine/ExecutionEngineTest.cpp
M lib/ExecutionEngine/RuntimeDyld/RTDyldMemoryManager.cpp
llvm-svn: 262657
Diffstat (limited to 'llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp')
-rw-r--r-- | llvm/unittests/ExecutionEngine/ExecutionEngineTest.cpp | 26 |
1 files changed, 7 insertions, 19 deletions
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 } } |