1097a140dSpatrick //===--------------- LLJITWithCustomObjectLinkingLayer.cpp ----------------===//
2097a140dSpatrick //
3097a140dSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4097a140dSpatrick // See https://llvm.org/LICENSE.txt for license information.
5097a140dSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6097a140dSpatrick //
7097a140dSpatrick //===----------------------------------------------------------------------===//
8097a140dSpatrick //
9097a140dSpatrick // This file shows how to switch LLJIT to use a custom object linking layer (we
10097a140dSpatrick // use ObjectLinkingLayer, which is backed by JITLink, as an example).
11097a140dSpatrick //
12097a140dSpatrick //===----------------------------------------------------------------------===//
13097a140dSpatrick
14097a140dSpatrick #include "llvm/ADT/StringMap.h"
15097a140dSpatrick #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h"
16097a140dSpatrick #include "llvm/ExecutionEngine/Orc/LLJIT.h"
17097a140dSpatrick #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
18097a140dSpatrick #include "llvm/Support/InitLLVM.h"
19097a140dSpatrick #include "llvm/Support/TargetSelect.h"
20097a140dSpatrick #include "llvm/Support/raw_ostream.h"
21097a140dSpatrick
22097a140dSpatrick #include "../ExampleModules.h"
23097a140dSpatrick
24097a140dSpatrick using namespace llvm;
25097a140dSpatrick using namespace llvm::orc;
26097a140dSpatrick
27097a140dSpatrick ExitOnError ExitOnErr;
28097a140dSpatrick
main(int argc,char * argv[])29097a140dSpatrick int main(int argc, char *argv[]) {
30097a140dSpatrick // Initialize LLVM.
31097a140dSpatrick InitLLVM X(argc, argv);
32097a140dSpatrick
33097a140dSpatrick InitializeNativeTarget();
34097a140dSpatrick InitializeNativeTargetAsmPrinter();
35097a140dSpatrick
36097a140dSpatrick cl::ParseCommandLineOptions(argc, argv, "LLJITWithCustomObjectLinkingLayer");
37097a140dSpatrick ExitOnErr.setBanner(std::string(argv[0]) + ": ");
38097a140dSpatrick
39097a140dSpatrick // Detect the host and set code model to small.
40097a140dSpatrick auto JTMB = ExitOnErr(JITTargetMachineBuilder::detectHost());
41097a140dSpatrick JTMB.setCodeModel(CodeModel::Small);
42097a140dSpatrick
43097a140dSpatrick // Create an LLJIT instance with an ObjectLinkingLayer as the base layer.
44097a140dSpatrick auto J = ExitOnErr(
45097a140dSpatrick LLJITBuilder()
46097a140dSpatrick .setJITTargetMachineBuilder(std::move(JTMB))
47097a140dSpatrick .setObjectLinkingLayerCreator(
48097a140dSpatrick [&](ExecutionSession &ES, const Triple &TT) {
49097a140dSpatrick return std::make_unique<ObjectLinkingLayer>(
50*d415bd75Srobert ES, ExitOnErr(jitlink::InProcessMemoryManager::Create()));
51097a140dSpatrick })
52097a140dSpatrick .create());
53097a140dSpatrick
54097a140dSpatrick auto M = ExitOnErr(parseExampleModule(Add1Example, "add1"));
55097a140dSpatrick
56097a140dSpatrick ExitOnErr(J->addIRModule(std::move(M)));
57097a140dSpatrick
58097a140dSpatrick // Look up the JIT'd function, cast it to a function pointer, then call it.
59*d415bd75Srobert auto Add1Addr = ExitOnErr(J->lookup("add1"));
60*d415bd75Srobert int (*Add1)(int) = Add1Addr.toPtr<int(int)>();
61097a140dSpatrick
62097a140dSpatrick int Result = Add1(42);
63097a140dSpatrick outs() << "add1(42) = " << Result << "\n";
64097a140dSpatrick
65097a140dSpatrick return 0;
66097a140dSpatrick }
67