From: Lang Hames Date: Sun, 23 Oct 2022 20:26:24 +0000 (-0700) Subject: [ORC] Reset MaterializationUnit::InitSymbol if the init symbol is discarded. X-Git-Tag: upstream/17.0.6~29769 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=56af226b63f86ed1317020ebfe7f8bdd6704998f;p=platform%2Fupstream%2Fllvm.git [ORC] Reset MaterializationUnit::InitSymbol if the init symbol is discarded. Discarding the init symbol is expected to be uncommon (it represents metadata in the MaterializationUnit that is relevant to dlopen, and this will not usually be fully duplicated in some other location), however if a client has marked an InitSymbol as weak and it is selected to be discarded then we should keep the data structure consistent. --- diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h index f86ef14..d5e5222 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h @@ -707,6 +707,13 @@ public: /// has been overridden. void doDiscard(const JITDylib &JD, const SymbolStringPtr &Name) { SymbolFlags.erase(Name); + if (InitSymbol == Name) { + DEBUG_WITH_TYPE("orc", { + dbgs() << "In " << JD.getName() << ", " << getName() + << ": discarding init symbol \"" << *Name << "\"\n"; + }); + InitSymbol = nullptr; + } discard(JD, std::move(Name)); } diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp index 7ef20cd..8022f03 100644 --- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp @@ -237,6 +237,27 @@ TEST_F(CoreAPIsStandardTest, RemoveSymbolsTest) { EXPECT_TRUE(OnCompletionRun) << "OnCompletion should have been run"; } +TEST_F(CoreAPIsStandardTest, DiscardInitSymbol) { + SymbolStringPtr ForwardedDiscardSym = nullptr; + + auto MU = std::make_unique( + SymbolFlagsMap({{Foo, FooSym.getFlags()}, {Bar, BarSym.getFlags()}}), + [](std::unique_ptr R) { + llvm_unreachable("Materialize called unexpectedly?"); + }, + Foo, + [&](const JITDylib &, SymbolStringPtr Sym) { + ForwardedDiscardSym = std::move(Sym); + }); + + MU->doDiscard(JD, Foo); + + EXPECT_EQ(ForwardedDiscardSym, Foo); + EXPECT_EQ(MU->getSymbols().size(), 1U); + EXPECT_TRUE(MU->getSymbols().count(Bar)); + EXPECT_EQ(MU->getInitializerSymbol(), nullptr); +} + TEST_F(CoreAPIsStandardTest, LookupWithHiddenSymbols) { auto BarHiddenFlags = BarSym.getFlags() & ~JITSymbolFlags::Exported; auto BarHiddenSym = JITEvaluatedSymbol(BarSym.getAddress(), BarHiddenFlags);