xref: /llvm-project/llvm/examples/OrcV2Examples/ExampleModules.h (revision 258f055ed93661900bc568350e09f467c0950486)
1633ea072SLang Hames //===----- ExampleModules.h - IR modules for LLJIT examples -----*- C++ -*-===//
2633ea072SLang Hames //
3633ea072SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4633ea072SLang Hames // See https://llvm.org/LICENSE.txt for license information.
5633ea072SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6633ea072SLang Hames //
7633ea072SLang Hames //===----------------------------------------------------------------------===//
8633ea072SLang Hames //
9633ea072SLang Hames // Example modules for LLJIT examples
10633ea072SLang Hames //
11633ea072SLang Hames //===----------------------------------------------------------------------===//
12633ea072SLang Hames 
1371975531SStefan Gränitz #ifndef LLVM_EXAMPLES_ORCV2EXAMPLES_EXAMPLEMODULES_H
1471975531SStefan Gränitz #define LLVM_EXAMPLES_ORCV2EXAMPLES_EXAMPLEMODULES_H
15633ea072SLang Hames 
16633ea072SLang Hames #include "llvm/ADT/StringRef.h"
17633ea072SLang Hames #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
18633ea072SLang Hames #include "llvm/IR/LLVMContext.h"
19633ea072SLang Hames #include "llvm/IR/Module.h"
20633ea072SLang Hames #include "llvm/IRReader/IRReader.h"
21910506fdSSimon Pilgrim #include "llvm/Support/CommandLine.h"
22633ea072SLang Hames #include "llvm/Support/Error.h"
23633ea072SLang Hames #include "llvm/Support/SourceMgr.h"
24633ea072SLang Hames 
25633ea072SLang Hames const llvm::StringRef Add1Example =
26633ea072SLang Hames     R"(
27633ea072SLang Hames   define i32 @add1(i32 %x) {
28633ea072SLang Hames   entry:
29633ea072SLang Hames     %r = add nsw i32 %x, 1
30633ea072SLang Hames     ret i32 %r
31633ea072SLang Hames   }
32633ea072SLang Hames )";
33633ea072SLang Hames 
createSMDiagnosticError(llvm::SMDiagnostic & Diag)34571d5f92SStefan Gränitz inline llvm::Error createSMDiagnosticError(llvm::SMDiagnostic &Diag) {
35571d5f92SStefan Gränitz   using namespace llvm;
36571d5f92SStefan Gränitz   std::string Msg;
37571d5f92SStefan Gränitz   {
38571d5f92SStefan Gränitz     raw_string_ostream OS(Msg);
39571d5f92SStefan Gränitz     Diag.print("", OS);
40571d5f92SStefan Gränitz   }
41571d5f92SStefan Gränitz   return make_error<StringError>(std::move(Msg), inconvertibleErrorCode());
42571d5f92SStefan Gränitz }
43571d5f92SStefan Gränitz 
44633ea072SLang Hames inline llvm::Expected<llvm::orc::ThreadSafeModule>
parseExampleModule(llvm::StringRef Source,llvm::StringRef Name)45633ea072SLang Hames parseExampleModule(llvm::StringRef Source, llvm::StringRef Name) {
46633ea072SLang Hames   using namespace llvm;
47633ea072SLang Hames   auto Ctx = std::make_unique<LLVMContext>();
48633ea072SLang Hames   SMDiagnostic Err;
49571d5f92SStefan Gränitz   if (auto M = parseIR(MemoryBufferRef(Source, Name), Err, *Ctx))
50571d5f92SStefan Gränitz     return orc::ThreadSafeModule(std::move(M), std::move(Ctx));
51633ea072SLang Hames 
52571d5f92SStefan Gränitz   return createSMDiagnosticError(Err);
53633ea072SLang Hames }
54633ea072SLang Hames 
55*258f055eSStefan Gränitz inline llvm::Expected<llvm::orc::ThreadSafeModule>
parseExampleModuleFromFile(llvm::StringRef FileName)56*258f055eSStefan Gränitz parseExampleModuleFromFile(llvm::StringRef FileName) {
57*258f055eSStefan Gränitz   using namespace llvm;
58*258f055eSStefan Gränitz   auto Ctx = std::make_unique<LLVMContext>();
59*258f055eSStefan Gränitz   SMDiagnostic Err;
60*258f055eSStefan Gränitz 
61*258f055eSStefan Gränitz   if (auto M = parseIRFile(FileName, Err, *Ctx))
62*258f055eSStefan Gränitz     return orc::ThreadSafeModule(std::move(M), std::move(Ctx));
63*258f055eSStefan Gränitz 
64*258f055eSStefan Gränitz   return createSMDiagnosticError(Err);
65*258f055eSStefan Gränitz }
66*258f055eSStefan Gränitz 
6771975531SStefan Gränitz #endif // LLVM_EXAMPLES_ORCV2EXAMPLES_EXAMPLEMODULES_H
68