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