diff options
author | Lang Hames <lhames@gmail.com> | 2018-06-12 20:43:18 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-06-12 20:43:18 +0000 |
commit | 2aae25819e8a83fa739ac602dd0ef3199deb63a7 (patch) | |
tree | bd1943d21793a4a21878046b323ac94e9932d260 /llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp | |
parent | 253584fdaf7dcda75fc56478895f0d4fad1e8534 (diff) | |
download | bcm5719-llvm-2aae25819e8a83fa739ac602dd0ef3199deb63a7.tar.gz bcm5719-llvm-2aae25819e8a83fa739ac602dd0ef3199deb63a7.zip |
[ORC] Add a fallback definition generator for VSOs.
If a VSO has a fallback definition generator attached it will be called during
lookup (and lookupFlags) for any unresolved symbols. The definition generator
can add new definitions to the VSO for any unresolved symbol. This allows VSOs
to generate new definitions on demand.
The immediate use case for this code is supporting VSOs that can import
definitions found via dlsym on demand.
llvm-svn: 334538
Diffstat (limited to 'llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp')
-rw-r--r-- | llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp index bc7a3622a06..01f81d9a80f 100644 --- a/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/CoreAPIsTest.cpp @@ -508,6 +508,33 @@ TEST(CoreAPIsTest, DefineMaterializingSymbol) { EXPECT_TRUE(BarResolved) << "Bar should have been resolved"; } +TEST(CoreAPIsTest, FallbackDefinitionGeneratorTest) { + constexpr JITTargetAddress FakeFooAddr = 0xdeadbeef; + constexpr JITTargetAddress FakeBarAddr = 0xcafef00d; + + ExecutionSession ES; + auto Foo = ES.getSymbolStringPool().intern("foo"); + auto Bar = ES.getSymbolStringPool().intern("bar"); + + auto FooSym = JITEvaluatedSymbol(FakeFooAddr, JITSymbolFlags::Exported); + auto BarSym = JITEvaluatedSymbol(FakeBarAddr, JITSymbolFlags::Exported); + + auto &V = ES.createVSO("V"); + + cantFail(V.define(absoluteSymbols({{Foo, FooSym}}))); + + V.setFallbackDefinitionGenerator([&](VSO &W, const SymbolNameSet &Names) { + cantFail(W.define(absoluteSymbols({{Bar, BarSym}}))); + return SymbolNameSet({Bar}); + }); + + auto Result = cantFail(lookup({&V}, {Foo, Bar})); + + EXPECT_EQ(Result.count(Bar), 1U) << "Expected to find fallback def for 'bar'"; + EXPECT_EQ(Result[Bar].getAddress(), FakeBarAddr) + << "Expected address of fallback def for 'bar' to be " << FakeBarAddr; +} + TEST(CoreAPIsTest, FailResolution) { ExecutionSession ES; auto Foo = ES.getSymbolStringPool().intern("foo"); |