Home | History | Annotate | Line # | Download | only in OrcV2Examples
      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