Skip to content

Commit

Permalink
[ORC] Add findSymbolIn() wrapper to C bindings.
Browse files Browse the repository at this point in the history
In many cases JIT users will know in which module a symbol
resides. Avoiding to search other modules can be more efficient. It
also allows to handle duplicate symbol names between modules.

Reviewed By: lhames

Differential Revision: https://reviews.llvm.org/D44889

llvm-svn: 333147
  • Loading branch information
anarazel committed May 24, 2018
1 parent a4c410d commit b0b67b0
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 6 deletions.
9 changes: 9 additions & 0 deletions llvm/include/llvm-c/OrcBindings.h
Expand Up @@ -140,6 +140,15 @@ LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
LLVMOrcTargetAddress *RetAddr,
const char *SymbolName);

/**
* Get symbol address from JIT instance, searching only the specified
* handle.
*/
LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack,
LLVMOrcTargetAddress *RetAddr,
LLVMOrcModuleHandle H,
const char *SymbolName);

/**
* Dispose of an ORC JIT stack.
*/
Expand Down
8 changes: 8 additions & 0 deletions llvm/lib/ExecutionEngine/Orc/OrcCBindings.cpp
Expand Up @@ -112,6 +112,14 @@ LLVMOrcErrorCode LLVMOrcGetSymbolAddress(LLVMOrcJITStackRef JITStack,
return J.findSymbolAddress(*RetAddr, SymbolName, true);
}

LLVMOrcErrorCode LLVMOrcGetSymbolAddressIn(LLVMOrcJITStackRef JITStack,
LLVMOrcTargetAddress *RetAddr,
LLVMOrcModuleHandle H,
const char *SymbolName) {
OrcCBindingsStack &J = *unwrap(JITStack);
return J.findSymbolAddressIn(*RetAddr, H, SymbolName, true);
}

LLVMOrcErrorCode LLVMOrcDisposeInstance(LLVMOrcJITStackRef JITStack) {
auto *J = unwrap(JITStack);
auto Err = J->shutdown();
Expand Down
22 changes: 22 additions & 0 deletions llvm/lib/ExecutionEngine/Orc/OrcCBindingsStack.h
Expand Up @@ -380,6 +380,7 @@ class OrcCBindingsStack {

JITSymbol findSymbolIn(orc::VModuleKey K, const std::string &Name,
bool ExportedSymbolsOnly) {
assert(KeyLayers.count(K) && "looking up symbol in unknown module");
return KeyLayers[K]->findSymbolIn(K, Name, ExportedSymbolsOnly);
}

Expand All @@ -403,6 +404,27 @@ class OrcCBindingsStack {
return LLVMOrcErrSuccess;
}

LLVMOrcErrorCode findSymbolAddressIn(JITTargetAddress &RetAddr,
orc::VModuleKey K,
const std::string &Name,
bool ExportedSymbolsOnly) {
RetAddr = 0;
if (auto Sym = findSymbolIn(K, Name, ExportedSymbolsOnly)) {
// Successful lookup, non-null symbol:
if (auto AddrOrErr = Sym.getAddress()) {
RetAddr = *AddrOrErr;
return LLVMOrcErrSuccess;
} else
return mapError(AddrOrErr.takeError());
} else if (auto Err = Sym.takeError()) {
// Lookup failure - report error.
return mapError(std::move(Err));
}
// Otherwise we had a successful lookup but got a null result. We already
// set RetAddr to '0' above, so just return success.
return LLVMOrcErrSuccess;
}

const std::string &getErrorMessage() const { return ErrMsg; }

private:
Expand Down
26 changes: 20 additions & 6 deletions llvm/unittests/ExecutionEngine/Orc/OrcCAPITest.cpp
Expand Up @@ -98,12 +98,26 @@ TEST_F(OrcCAPIExecutionTest, TestEagerIRCompilation) {

LLVMOrcModuleHandle H;
LLVMOrcAddEagerlyCompiledIR(JIT, &H, wrap(M.release()), myResolver, nullptr);
LLVMOrcTargetAddress MainAddr;
LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
MainFnTy MainFn = (MainFnTy)MainAddr;
int Result = MainFn();
EXPECT_EQ(Result, 42)
<< "Eagerly JIT'd code did not return expected result";

// get symbol address searching the entire stack
{
LLVMOrcTargetAddress MainAddr;
LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
MainFnTy MainFn = (MainFnTy)MainAddr;
int Result = MainFn();
EXPECT_EQ(Result, 42)
<< "Eagerly JIT'd code did not return expected result";
}

// and then just searching a single handle
{
LLVMOrcTargetAddress MainAddr;
LLVMOrcGetSymbolAddressIn(JIT, &MainAddr, H, "main");
MainFnTy MainFn = (MainFnTy)MainAddr;
int Result = MainFn();
EXPECT_EQ(Result, 42)
<< "Eagerly JIT'd code did not return expected result";
}

LLVMOrcRemoveModule(JIT, H);

Expand Down

0 comments on commit b0b67b0

Please sign in to comment.