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

Lang Hames lhames at gmail.com
Tue Apr 14 10:03:56 PDT 2015


Thanks for catching this Yaron. Looks like Aaron Ballman fixed it in 234884.

Cheers,
Lang.

On Mon, Apr 13, 2015 at 11:57 PM, Yaron Keren <yaron.keren at gmail.com> wrote:

> 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/d1d4e902/attachment.html>


More information about the llvm-commits mailing list