<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><div dir="ltr"><br></div><div>Yaron</div><div><br></div></div></div><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">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>