1 //===----- ExampleModules.h - IR modules for LLJIT examples -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Example modules for LLJIT examples 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_EXAMPLES_ORCV2EXAMPLES_EXAMPLEMODULES_H 14 #define LLVM_EXAMPLES_ORCV2EXAMPLES_EXAMPLEMODULES_H 15 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h" 18 #include "llvm/IR/LLVMContext.h" 19 #include "llvm/IR/Module.h" 20 #include "llvm/IRReader/IRReader.h" 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/Error.h" 23 #include "llvm/Support/SourceMgr.h" 24 25 const llvm::StringRef Add1Example = 26 R"( 27 define i32 @add1(i32 %x) { 28 entry: 29 %r = add nsw i32 %x, 1 30 ret i32 %r 31 } 32 )"; 33 34 inline llvm::Error createSMDiagnosticError(llvm::SMDiagnostic &Diag) { 35 using namespace llvm; 36 std::string Msg; 37 { 38 raw_string_ostream OS(Msg); 39 Diag.print("", OS); 40 } 41 return make_error<StringError>(std::move(Msg), inconvertibleErrorCode()); 42 } 43 44 inline llvm::Expected<llvm::orc::ThreadSafeModule> 45 parseExampleModule(llvm::StringRef Source, llvm::StringRef Name) { 46 using namespace llvm; 47 auto Ctx = std::make_unique<LLVMContext>(); 48 SMDiagnostic Err; 49 if (auto M = parseIR(MemoryBufferRef(Source, Name), Err, *Ctx)) 50 return orc::ThreadSafeModule(std::move(M), std::move(Ctx)); 51 52 return createSMDiagnosticError(Err); 53 } 54 55 inline llvm::Expected<llvm::orc::ThreadSafeModule> 56 parseExampleModuleFromFile(llvm::StringRef FileName) { 57 using namespace llvm; 58 auto Ctx = std::make_unique<LLVMContext>(); 59 SMDiagnostic Err; 60 61 if (auto M = parseIRFile(FileName, Err, *Ctx)) 62 return orc::ThreadSafeModule(std::move(M), std::move(Ctx)); 63 64 return createSMDiagnosticError(Err); 65 } 66 67 #endif // LLVM_EXAMPLES_ORCV2EXAMPLES_EXAMPLEMODULES_H 68