Skip to content

Commit

Permalink
[clang-repl] Adapt to the recent dylib-related changes in ORC.
Browse files Browse the repository at this point in the history
ORC splits into separate dylibs symbols coming from the process and symbols
materialized in the Jit. This patch adapts intent of the existing interface and
adds a regression test to make sure both Jit'd and compiled symbols can be found.

Differential revision: https://reviews.llvm.org/D159115
  • Loading branch information
vgvassilev committed Aug 29, 2023
1 parent 34e2f4f commit 196d856
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
19 changes: 13 additions & 6 deletions clang/lib/Interpreter/IncrementalExecutor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,19 @@ llvm::Error IncrementalExecutor::runCtors() const {
llvm::Expected<llvm::orc::ExecutorAddr>
IncrementalExecutor::getSymbolAddress(llvm::StringRef Name,
SymbolNameKind NameKind) const {
auto Sym = (NameKind == LinkerName) ? Jit->lookupLinkerMangled(Name)
: Jit->lookup(Name);

if (!Sym)
return Sym.takeError();
return Sym;
using namespace llvm::orc;
auto SO = makeJITDylibSearchOrder({&Jit->getMainJITDylib(),
Jit->getPlatformJITDylib().get(),
Jit->getProcessSymbolsJITDylib().get()});

ExecutionSession &ES = Jit->getExecutionSession();

auto SymOrErr =
ES.lookup(SO, (NameKind == LinkerName) ? ES.intern(Name)
: Jit->mangleAndIntern(Name));
if (auto Err = SymOrErr.takeError())
return std::move(Err);
return SymOrErr->getAddress();
}

} // end namespace clang
12 changes: 9 additions & 3 deletions clang/unittests/Interpreter/InterpreterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,10 +234,16 @@ TEST(IncrementalProcessing, FindMangledNameSymbol) {
}

std::string MangledName = MangleName(FD);
auto Addr = cantFail(Interp->getSymbolAddress(MangledName));
EXPECT_NE(0U, Addr.getValue());
auto Addr = Interp->getSymbolAddress(MangledName);
EXPECT_FALSE(!Addr);
EXPECT_NE(0U, Addr->getValue());
GlobalDecl GD(FD);
EXPECT_EQ(Addr, cantFail(Interp->getSymbolAddress(GD)));
EXPECT_EQ(*Addr, cantFail(Interp->getSymbolAddress(GD)));
cantFail(
Interp->ParseAndExecute("extern \"C\" int printf(const char*,...);"));
Addr = Interp->getSymbolAddress("printf");
EXPECT_FALSE(!Addr);
EXPECT_EQ((unsigned long long)&printf, Addr->getValue());
}

static void *AllocateObject(TypeDecl *TD, Interpreter &Interp) {
Expand Down

0 comments on commit 196d856

Please sign in to comment.