diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp index b445d3d49d7e4..0f6f9efe11027 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/JITSymbol.cpp @@ -20,6 +20,8 @@ using namespace llvm; JITSymbolFlags llvm::JITSymbolFlags::fromGlobalValue(const GlobalValue &GV) { + assert(GV.hasName() && "Can't get flags for anonymous symbol"); + JITSymbolFlags Flags = JITSymbolFlags::None; if (GV.hasWeakLinkage() || GV.hasLinkOnceLinkage()) Flags |= JITSymbolFlags::Weak; @@ -34,6 +36,16 @@ JITSymbolFlags llvm::JITSymbolFlags::fromGlobalValue(const GlobalValue &GV) { isa(cast(GV).getAliasee())) Flags |= JITSymbolFlags::Callable; + // Check for a linker-private-global-prefix on the symbol name, in which + // case it must be marked as non-exported. + if (auto *M = GV.getParent()) { + const auto &DL = M->getDataLayout(); + StringRef LPGP = DL.getLinkerPrivateGlobalPrefix(); + if (!LPGP.empty() && GV.getName().front() == '\01' && + GV.getName().substr(1).startswith(LPGP)) + Flags &= ~JITSymbolFlags::Exported; + } + return Flags; } diff --git a/llvm/test/ExecutionEngine/OrcLazy/private_linkage.ll b/llvm/test/ExecutionEngine/OrcLazy/private_linkage.ll index 11813dd977600..c8f1531f31391 100644 --- a/llvm/test/ExecutionEngine/OrcLazy/private_linkage.ll +++ b/llvm/test/ExecutionEngine/OrcLazy/private_linkage.ll @@ -1,12 +1,18 @@ ; RUN: lli -jit-kind=orc-lazy %s -define private void @_ZL3foov() { +define private void @foo() { +entry: + ret void +} + +define void @"\01l_bar"() { entry: ret void } define i32 @main(i32 %argc, i8** nocapture readnone %argv) { entry: - tail call void @_ZL3foov() + call void @foo() + call void @"\01l_bar"() ret i32 0 }