Skip to content

Commit

Permalink
Reland "[clang-repl] Adapt to the recent dylib-related changes in ORC."
Browse files Browse the repository at this point in the history
Original commit message:"

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
"

This patch disables the test statement on windows as it seems we might have a
bug in the way we model dllimports.

(cherry picked from commit 452cb7f)
  • Loading branch information
vgvassilev authored and tru committed Aug 30, 2023
1 parent 94af834 commit d469d5c
Show file tree
Hide file tree
Showing 2 changed files with 26 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
16 changes: 13 additions & 3 deletions clang/unittests/Interpreter/InterpreterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,10 +232,20 @@ 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);

// FIXME: Re-enable when we investigate the way we handle dllimports on Win.
#ifndef _WIN32
EXPECT_EQ((unsigned long long)&printf, Addr->getValue());
#endif // _WIN32
}

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

0 comments on commit d469d5c

Please sign in to comment.