#include "llvm/ExecutionEngine/Orc/LLJIT.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Pass.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Scalar.h"
#include "../ExampleModules.h"
using namespace llvm;
using namespace llvm::orc;
ExitOnError ExitOnErr;
const llvm::StringRef FooMod =
R"(
define void @foo() {
entry:
ret void
}
)";
const llvm::StringRef BarMod =
R"(
define void @bar() {
entry:
ret void
}
)";
const llvm::StringRef BazMod =
R"(
define void @baz() {
entry:
ret void
}
)";
int main(int argc, char *argv[]) {
InitLLVM X(argc, argv);
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
ExitOnErr.setBanner(std::string(argv[0]) + ": ");
auto J = ExitOnErr(LLJITBuilder().create());
auto &JD = ExitOnErr(J->createJITDylib("JD"));
ExitOnErr(J->addIRModule(JD, ExitOnErr(parseExampleModule(FooMod, "foo"))));
auto BarRT = JD.createResourceTracker();
ExitOnErr(
J->addIRModule(BarRT, ExitOnErr(parseExampleModule(BarMod, "bar"))));
auto BazRT = JD.createResourceTracker();
ExitOnErr(
J->addIRModule(BazRT, ExitOnErr(parseExampleModule(BazMod, "baz"))));
auto PrintSymbol = [&](StringRef Name) {
dbgs() << Name << " = ";
if (auto Sym = J->lookup(JD, Name))
dbgs() << *Sym;
else
dbgs() << "error: " << toString(Sym.takeError()) << "\n";
};
dbgs() << "Initially:\n";
PrintSymbol("foo");
PrintSymbol("bar");
PrintSymbol("baz");
dbgs() << "After implicitly transferring ownership of baz to JD's default "
"tracker:\n";
BazRT = nullptr;
PrintSymbol("foo");
PrintSymbol("bar");
PrintSymbol("baz");
dbgs() << "After removing bar (lookup for bar should yield a missing symbol "
"error):\n";
ExitOnErr(BarRT->remove());
PrintSymbol("foo");
PrintSymbol("bar");
PrintSymbol("baz");
dbgs() << "After clearing JD (lookup should yield missing symbol errors for "
"all symbols):\n";
ExitOnErr(JD.clear());
PrintSymbol("foo");
PrintSymbol("bar");
PrintSymbol("baz");
dbgs() << "Removing JD.\n";
ExitOnErr(J->getExecutionSession().removeJITDylib(JD));
dbgs() << "done.\n";
return 0;
}