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