//===- LLJITWithExecutorProcessControl.cpp - LLJIT example with EPC utils -===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // In this example we will use the lazy re-exports utility to lazily compile // IR modules. We will do this in seven steps: // // 1. Create an LLJIT instance. // 2. Install a transform so that we can see what is being compiled. // 3. Create an indirect stubs manager and lazy call-through manager. // 4. Add two modules that will be conditionally compiled, plus a main module. // 5. Add lazy-rexports of the symbols in the conditionally compiled modules. // 6. Dump the ExecutionSession state to see the symbol table prior to // executing any code. // 7. Verify that only modules containing executed code are compiled. // //===----------------------------------------------------------------------===// #include "llvm/ADT/StringMap.h" #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" #include "llvm/ExecutionEngine/Orc/EPCIndirectionUtils.h" #include "llvm/ExecutionEngine/Orc/ExecutorProcessControl.h" #include "llvm/ExecutionEngine/Orc/LLJIT.h" #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" #include "llvm/ExecutionEngine/Orc/OrcABISupport.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/raw_ostream.h" #include "../ExampleModules.h" #include <future> usingnamespacellvm; usingnamespacellvm::orc; ExitOnError ExitOnErr; // Example IR modules. // // Note that in the conditionally compiled modules, FooMod and BarMod, functions // have been given an _body suffix. This is to ensure that their names do not // clash with their lazy-reexports. // For clients who do not wish to rename function bodies (e.g. because they want // to re-use cached objects between static and JIT compiles) techniques exist to // avoid renaming. See the lazy-reexports section of the ORCv2 design doc. const llvm::StringRef FooMod = …; const llvm::StringRef BarMod = …; const llvm::StringRef MainMod = …; extern "C" int32_t return1() { … } extern "C" int32_t return2() { … } static void *reenter(void *Ctx, void *TrampolineAddr) { … } static void reportErrorAndExit() { … } cl::list<std::string> InputArgv(cl::Positional, cl::desc("<program arguments>...")); int main(int argc, char *argv[]) { … }