[llvm] r234805 - [Orc] Add an Orc layer for applying arbitrary transforms to IR, use it to add

Yaron Keren yaron.keren at gmail.com
Mon Apr 13 23:57:08 PDT 2015


Hi Lang,

Visual C++ complains:

llvm\tools\lli\orclazyjit.cpp(106): warning C4715:
'llvm::OrcLazyJIT::createDebugDumper' : not all control paths
return a value

you may want to add llvm_unreachable() after the case statement?

Yaron


2015-04-14 1:12 GMT+03:00 Lang Hames <lhames at gmail.com>:

> Author: lhames
> Date: Mon Apr 13 17:12:54 2015
> New Revision: 234805
>
> URL: http://llvm.org/viewvc/llvm-project?rev=234805&view=rev
> Log:
> [Orc] Add an Orc layer for applying arbitrary transforms to IR, use it to
> add
> debugging output to the LLI orc-lazy JIT, and update the orc-lazy
> "hello.ll"
> test to actually test for lazy compilation.
>
>
> Added:
>     llvm/trunk/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h
> Modified:
>     llvm/trunk/test/ExecutionEngine/OrcLazy/hello.ll
>     llvm/trunk/tools/lli/OrcLazyJIT.cpp
>     llvm/trunk/tools/lli/OrcLazyJIT.h
>
> Added: llvm/trunk/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h?rev=234805&view=auto
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h (added)
> +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/IRTransformLayer.h Mon Apr
> 13 17:12:54 2015
> @@ -0,0 +1,101 @@
> +//===----- IRTransformLayer.h - Run all IR through a functor ----*- C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// Run all IR passed in through a user supplied functor.
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef LLVM_EXECUTIONENGINE_ORC_IRTRANSFORMLAYER_H
> +#define LLVM_EXECUTIONENGINE_ORC_IRTRANSFORMLAYER_H
> +
> +#include "JITSymbol.h"
> +
> +namespace llvm {
> +namespace orc {
> +
> +/// @brief IR mutating layer.
> +///
> +///   This layer accepts sets of LLVM IR Modules (via addModuleSet). It
> +/// immediately applies the user supplied functor to each module, then
> adds
> +/// the set of transformed modules to the layer below.
> +template <typename BaseLayerT, typename TransformFtor>
> +class IRTransformLayer {
> +public:
> +  /// @brief Handle to a set of added modules.
> +  typedef typename BaseLayerT::ModuleSetHandleT ModuleSetHandleT;
> +
> +  /// @brief Construct an IRTransformLayer with the given BaseLayer
> +  IRTransformLayer(BaseLayerT &BaseLayer,
> +                   TransformFtor Transform = TransformFtor())
> +    : BaseLayer(BaseLayer), Transform(std::move(Transform)) {}
> +
> +  /// @brief Apply the transform functor to each module in the module
> set, then
> +  ///        add the resulting set of modules to the base layer, along
> with the
> +  ///        memory manager and symbol resolver.
> +  ///
> +  /// @return A handle for the added modules.
> +  template <typename ModuleSetT, typename MemoryManagerPtrT,
> +            typename SymbolResolverPtrT>
> +  ModuleSetHandleT addModuleSet(ModuleSetT Ms,
> +                                MemoryManagerPtrT MemMgr,
> +                                SymbolResolverPtrT Resolver) {
> +
> +    for (auto I = Ms.begin(), E = Ms.end(); I != E; ++I)
> +      *I = Transform(std::move(*I));
> +
> +    return BaseLayer.addModuleSet(std::move(Ms), std::move(MemMgr),
> +                                  std::move(Resolver));
> +  }
> +
> +  /// @brief Remove the module set associated with the handle H.
> +  void removeModuleSet(ModuleSetHandleT H) {
> BaseLayer.removeModuleSet(H); }
> +
> +  /// @brief Search for the given named symbol.
> +  /// @param Name The name of the symbol to search for.
> +  /// @param ExportedSymbolsOnly If true, search only for exported
> symbols.
> +  /// @return A handle for the given named symbol, if it exists.
> +  JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly)
> {
> +    return BaseLayer.findSymbol(Name, ExportedSymbolsOnly);
> +  }
> +
> +  /// @brief Get the address of the given symbol in the context of the
> set of
> +  ///        modules represented by the handle H. This call is forwarded
> to the
> +  ///        base layer's implementation.
> +  /// @param H The handle for the module set to search in.
> +  /// @param Name The name of the symbol to search for.
> +  /// @param ExportedSymbolsOnly If true, search only for exported
> symbols.
> +  /// @return A handle for the given named symbol, if it is found in the
> +  ///         given module set.
> +  JITSymbol findSymbolIn(ModuleSetHandleT H, const std::string &Name,
> +                         bool ExportedSymbolsOnly) {
> +    return BaseLayer.findSymbolIn(H, Name, ExportedSymbolsOnly);
> +  }
> +
> +  /// @brief Immediately emit and finalize the module set represented by
> the
> +  ///        given handle.
> +  /// @param H Handle for module set to emit/finalize.
> +  void emitAndFinalize(ModuleSetHandleT H) {
> +    BaseLayer.emitAndFinalize(H);
> +  }
> +
> +  /// @brief Access the transform functor directly.
> +  TransformFtor& getTransform() { return Transform; }
> +
> +  /// @brief Access the mumate functor directly.
> +  const TransformFtor& getTransform() const { return Transform; }
> +
> +private:
> +  BaseLayerT &BaseLayer;
> +  TransformFtor Transform;
> +};
> +
> +} // End namespace orc.
> +} // End namespace llvm.
> +
> +#endif // LLVM_EXECUTIONENGINE_ORC_IRTRANSFORMLAYER_H
>
> Modified: llvm/trunk/test/ExecutionEngine/OrcLazy/hello.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcLazy/hello.ll?rev=234805&r1=234804&r2=234805&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/ExecutionEngine/OrcLazy/hello.ll (original)
> +++ llvm/trunk/test/ExecutionEngine/OrcLazy/hello.ll Mon Apr 13 17:12:54
> 2015
> @@ -1,7 +1,8 @@
> -; RUN: lli -jit-kind=orc-lazy %s | FileCheck %s
> +; RUN: lli -jit-kind=orc-lazy -orc-lazy-debug=funcs-to-stderr %s |
> FileCheck %s
>  ;
>  ; CHECK: Hello
> -; CHECK-NEXT: Goodbye
> +; CHECK: [ main$orc_body ]
> +; CHECK: Goodbye
>
>  %class.Foo = type { i8 }
>
>
> Modified: llvm/trunk/tools/lli/OrcLazyJIT.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/OrcLazyJIT.cpp?rev=234805&r1=234804&r2=234805&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lli/OrcLazyJIT.cpp (original)
> +++ llvm/trunk/tools/lli/OrcLazyJIT.cpp Mon Apr 13 17:12:54 2015
> @@ -9,26 +9,101 @@
>
>  #include "OrcLazyJIT.h"
>  #include "llvm/ExecutionEngine/Orc/OrcTargetSupport.h"
> +#include "llvm/Support/Debug.h"
>  #include "llvm/Support/DynamicLibrary.h"
> +#include <system_error>
>
>  using namespace llvm;
>
> +namespace {
> +
> +  enum class DumpKind { NoDump, DumpFuncsToStdErr, DumpModsToStdErr,
> +                        DumpModsToDisk };
> +
> +  cl::opt<DumpKind> OrcDumpKind("orc-lazy-debug",
> +                                cl::desc("Debug dumping for the orc-lazy
> JIT."),
> +                                cl::init(DumpKind::NoDump),
> +                                cl::values(
> +                                  clEnumValN(DumpKind::NoDump, "no-dump",
> +                                             "Don't dump anything."),
> +                                  clEnumValN(DumpKind::DumpFuncsToStdErr,
> +                                             "funcs-to-stderr",
> +                                             "Dump function names to
> stderr."),
> +                                  clEnumValN(DumpKind::DumpModsToStdErr,
> +                                             "mods-to-stderr",
> +                                             "Dump modules to stderr."),
> +                                  clEnumValN(DumpKind::DumpModsToDisk,
> +                                             "mods-to-disk",
> +                                             "Dump modules to the current
> "
> +                                             "working directory.
> (WARNING: "
> +                                             "will overwrite existing
> files)."),
> +                                  clEnumValEnd));
> +}
> +
>  OrcLazyJIT::CallbackManagerBuilder
>  OrcLazyJIT::createCallbackManagerBuilder(Triple T) {
>    switch (T.getArch()) {
>      default: return nullptr;
>
>      case Triple::x86_64: {
> -      typedef orc::JITCompileCallbackManager<CompileLayerT,
> +      typedef orc::JITCompileCallbackManager<IRDumpLayerT,
>                                               orc::OrcX86_64> CCMgrT;
> -      return [](CompileLayerT &CompileLayer, RuntimeDyld::MemoryManager
> &MemMgr,
> +      return [](IRDumpLayerT &IRDumpLayer, RuntimeDyld::MemoryManager
> &MemMgr,
>                  LLVMContext &Context) {
> -               return make_unique<CCMgrT>(CompileLayer, MemMgr, Context,
> 0, 64);
> +               return make_unique<CCMgrT>(IRDumpLayer, MemMgr, Context,
> 0, 64);
>               };
>      }
>    }
>  }
>
> +OrcLazyJIT::TransformFtor OrcLazyJIT::createDebugDumper() {
> +
> +  switch (OrcDumpKind) {
> +  case DumpKind::NoDump:
> +    return [](std::unique_ptr<Module> M) { return std::move(M); };
> +
> +  case DumpKind::DumpFuncsToStdErr:
> +    return [](std::unique_ptr<Module> M) {
> +      dbgs() << "[ ";
> +
> +      for (const auto &F : *M) {
> +        if (F.isDeclaration())
> +          continue;
> +
> +        if (F.hasName())
> +          dbgs() << F.getName() << " ";
> +        else
> +          dbgs() << "<anon> ";
> +      }
> +
> +      dbgs() << "]\n";
> +      return std::move(M);
> +    };
> +
> +  case DumpKind::DumpModsToStdErr:
> +    return [](std::unique_ptr<Module> M) {
> +             dbgs() << "----- Module Start -----\n" << *M
> +                    << "----- Module End -----\n";
> +
> +             return std::move(M);
> +           };
> +
> +  case DumpKind::DumpModsToDisk:
> +    return [](std::unique_ptr<Module> M) {
> +             std::error_code EC;
> +             raw_fd_ostream Out(M->getModuleIdentifier() + ".ll", EC,
> +                                sys::fs::F_Text);
> +             if (EC) {
> +               errs() << "Couldn't open " << M->getModuleIdentifier()
> +                      << " for dumping.\nError:" << EC.message() << "\n";
> +               exit(1);
> +             }
> +             Out << *M;
> +             return std::move(M);
> +           };
> +  }
> +}
> +
>  int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char*
> ArgV[]) {
>    // Add the program's symbols into the JIT's search space.
>    if (sys::DynamicLibrary::LoadLibraryPermanently(nullptr)) {
>
> Modified: llvm/trunk/tools/lli/OrcLazyJIT.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/OrcLazyJIT.h?rev=234805&r1=234804&r2=234805&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lli/OrcLazyJIT.h (original)
> +++ llvm/trunk/tools/lli/OrcLazyJIT.h Mon Apr 13 17:12:54 2015
> @@ -20,6 +20,7 @@
>  #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
>  #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
>  #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
> +#include "llvm/ExecutionEngine/Orc/IRTransformLayer.h"
>  #include "llvm/ExecutionEngine/Orc/LazyEmittingLayer.h"
>  #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
>  #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
> @@ -33,13 +34,16 @@ public:
>    typedef orc::JITCompileCallbackManagerBase CompileCallbackMgr;
>    typedef orc::ObjectLinkingLayer<> ObjLayerT;
>    typedef orc::IRCompileLayer<ObjLayerT> CompileLayerT;
> -  typedef orc::LazyEmittingLayer<CompileLayerT> LazyEmitLayerT;
> +  typedef std::function<std::unique_ptr<Module>(std::unique_ptr<Module>)>
> +    TransformFtor;
> +  typedef orc::IRTransformLayer<CompileLayerT, TransformFtor>
> IRDumpLayerT;
> +  typedef orc::LazyEmittingLayer<IRDumpLayerT> LazyEmitLayerT;
>    typedef orc::CompileOnDemandLayer<LazyEmitLayerT,
>                                      CompileCallbackMgr> CODLayerT;
>    typedef CODLayerT::ModuleSetHandleT ModuleHandleT;
>
>    typedef std::function<
> -            std::unique_ptr<CompileCallbackMgr>(CompileLayerT&,
> +            std::unique_ptr<CompileCallbackMgr>(IRDumpLayerT&,
>
>  RuntimeDyld::MemoryManager&,
>                                                  LLVMContext&)>
>      CallbackManagerBuilder;
> @@ -52,8 +56,9 @@ public:
>        Mang(this->TM->getDataLayout()),
>        ObjectLayer(),
>        CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)),
> -      LazyEmitLayer(CompileLayer),
> -      CCMgr(BuildCallbackMgr(CompileLayer, CCMgrMemMgr, Context)),
> +      IRDumpLayer(CompileLayer, createDebugDumper()),
> +      LazyEmitLayer(IRDumpLayer),
> +      CCMgr(BuildCallbackMgr(IRDumpLayer, CCMgrMemMgr, Context)),
>        CODLayer(LazyEmitLayer, *CCMgr),
>        CXXRuntimeOverrides([this](const std::string &S) { return
> mangle(S); }) {}
>
> @@ -137,12 +142,15 @@ private:
>      return MangledName;
>    }
>
> +  static TransformFtor createDebugDumper();
> +
>    std::unique_ptr<TargetMachine> TM;
>    Mangler Mang;
>    SectionMemoryManager CCMgrMemMgr;
>
>    ObjLayerT ObjectLayer;
>    CompileLayerT CompileLayer;
> +  IRDumpLayerT IRDumpLayer;
>    LazyEmitLayerT LazyEmitLayer;
>    std::unique_ptr<CompileCallbackMgr> CCMgr;
>    CODLayerT CODLayer;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150414/d477ca6f/attachment.html>


More information about the llvm-commits mailing list