Skip to content

Commit

Permalink
[ORC] Add a unit test to verify that bound weak symbols can't be over…
Browse files Browse the repository at this point in the history
…ridden.

Weak symbols can be overridden while they're in the NeverSearched state, but
should not be able to be overridden once they've been bound by some lookup.
Historically we guaranteed this by stripping the weak flag once a symbol as
bound, causing it to appear as if it were strong. In ffe2dda we changed
that behavior to retain weak flags on symbols (to facilitate tracking for
dynamic re-binding during dlopen). This test checks that we still fail as
required after ffe2dda.
  • Loading branch information
lhames committed Nov 9, 2022
1 parent 5905246 commit c92ddf4
Showing 1 changed file with 15 additions and 0 deletions.
15 changes: 15 additions & 0 deletions llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp
Expand Up @@ -1039,6 +1039,21 @@ TEST_F(CoreAPIsStandardTest, TestBasicWeakSymbolMaterialization) {
<< "Duplicate bar definition not discarded";
}

TEST_F(CoreAPIsStandardTest, RedefineBoundWeakSymbol) {
// Check that redefinition of a bound weak symbol fails.

JITSymbolFlags WeakExported(JITSymbolFlags::Exported);
WeakExported |= JITSymbolFlags::Weak;

// Define "Foo" as weak, force materialization.
cantFail(JD.define(absoluteSymbols({{Foo, {FooAddr, WeakExported}}})));
cantFail(ES.lookup({&JD}, Foo));

// Attempt to redefine "Foo". Expect failure, despite "Foo" being weak,
// since it has already been bound.
EXPECT_THAT_ERROR(JD.define(absoluteSymbols({{Foo, FooSym}})), Failed());
}

TEST_F(CoreAPIsStandardTest, DefineMaterializingSymbol) {
bool ExpectNoMoreMaterialization = false;
ES.setDispatchTask([&](std::unique_ptr<Task> T) {
Expand Down

0 comments on commit c92ddf4

Please sign in to comment.