diff options
author | Lang Hames <lhames@gmail.com> | 2016-09-04 17:53:30 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2016-09-04 17:53:30 +0000 |
commit | b80c6300c56a13e4787e3ae10ced955585f05f16 (patch) | |
tree | 3e820e1bb1230e00b092881bbc79b6e35d4b22c1 | |
parent | fa79defc962df5886c096b8d3224799746b5d6b5 (diff) |
[ORC] Clone module flags metadata into the globals module in the
CompileOnDemandLayer.
Also contains a tweak to the orc-lazy jit in LLI to enable the test case.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280632 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h | 12 | ||||
-rw-r--r-- | include/llvm/ExecutionEngine/Orc/IndirectionUtils.h | 4 | ||||
-rw-r--r-- | lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 9 | ||||
-rw-r--r-- | test/ExecutionEngine/OrcLazy/module-flags.ll | 13 | ||||
-rw-r--r-- | tools/lli/OrcLazyJIT.cpp | 12 |
5 files changed, 40 insertions, 10 deletions
diff --git a/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h b/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h index ca3f7eec64d..c670ad635ea 100644 --- a/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h +++ b/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h @@ -364,10 +364,11 @@ private: assert(!EC && "Error generating stubs"); } - // If this module doesn't contain any globals or aliases we can bail out - // early and avoid the overhead of creating and managing an empty globals - // module. - if (SrcM.global_empty() && SrcM.alias_empty()) + // If this module doesn't contain any globals, aliases, or module flags then + // we can bail out early and avoid the overhead of creating and managing an + // empty globals module. + if (SrcM.global_empty() && SrcM.alias_empty() && + !SrcM.getModuleFlagsMetadata()) return; // Create the GlobalValues module. @@ -387,6 +388,9 @@ private: if (!VMap.count(&A)) cloneGlobalAliasDecl(*GVsM, A, VMap); + // Clone the module flags. + cloneModuleFlagsMetadata(*GVsM, SrcM, VMap); + // Now we need to clone the GV and alias initializers. // Initializers may refer to functions declared (but not defined) in this diff --git a/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h index 4592e74126b..6b38a24b5ae 100644 --- a/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h +++ b/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h @@ -415,6 +415,10 @@ void moveGlobalVariableInitializer(GlobalVariable &OrigGV, GlobalAlias *cloneGlobalAliasDecl(Module &Dst, const GlobalAlias &OrigA, ValueToValueMapTy &VMap); +/// @brief Clone module flags metadata into the destination module. +void cloneModuleFlagsMetadata(Module &Dst, const Module &Src, + ValueToValueMapTy &VMap); + } // End namespace orc. } // End namespace llvm. diff --git a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index 7e2e873f8d3..711b887da6e 100644 --- a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -241,5 +241,14 @@ GlobalAlias* cloneGlobalAliasDecl(Module &Dst, const GlobalAlias &OrigA, return NewA; } +void cloneModuleFlagsMetadata(Module &Dst, const Module &Src, + ValueToValueMapTy &VMap) { + auto *MFs = Src.getModuleFlagsMetadata(); + if (!MFs) + return; + for (auto *MF : MFs->operands()) + Dst.addModuleFlag(MapMetadata(MF, VMap)); +} + } // End namespace orc. } // End namespace llvm. diff --git a/test/ExecutionEngine/OrcLazy/module-flags.ll b/test/ExecutionEngine/OrcLazy/module-flags.ll new file mode 100644 index 00000000000..c1240a876cb --- /dev/null +++ b/test/ExecutionEngine/OrcLazy/module-flags.ll @@ -0,0 +1,13 @@ +; RUN: lli -jit-kind=orc-lazy -orc-lazy-debug=mods-to-stdout %s | FileCheck %s +; +; CHECK: module-flags.ll.globals +; CHECK-NOT: Module End +; CHECK: The Answer is {{.*}}42 + +define i32 @main() { + ret i32 0 +} + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"The Answer is ", i32 42} diff --git a/tools/lli/OrcLazyJIT.cpp b/tools/lli/OrcLazyJIT.cpp index d9cec0ce363..de69a269887 100644 --- a/tools/lli/OrcLazyJIT.cpp +++ b/tools/lli/OrcLazyJIT.cpp @@ -18,7 +18,7 @@ using namespace llvm; namespace { - enum class DumpKind { NoDump, DumpFuncsToStdOut, DumpModsToStdErr, + enum class DumpKind { NoDump, DumpFuncsToStdOut, DumpModsToStdOut, DumpModsToDisk }; cl::opt<DumpKind> OrcDumpKind("orc-lazy-debug", @@ -30,9 +30,9 @@ namespace { clEnumValN(DumpKind::DumpFuncsToStdOut, "funcs-to-stdout", "Dump function names to stdout."), - clEnumValN(DumpKind::DumpModsToStdErr, - "mods-to-stderr", - "Dump modules to stderr."), + clEnumValN(DumpKind::DumpModsToStdOut, + "mods-to-stdout", + "Dump modules to stdout."), clEnumValN(DumpKind::DumpModsToDisk, "mods-to-disk", "Dump modules to the current " @@ -71,9 +71,9 @@ OrcLazyJIT::TransformFtor OrcLazyJIT::createDebugDumper() { return M; }; - case DumpKind::DumpModsToStdErr: + case DumpKind::DumpModsToStdOut: return [](std::unique_ptr<Module> M) { - dbgs() << "----- Module Start -----\n" << *M + outs() << "----- Module Start -----\n" << *M << "----- Module End -----\n"; return M; |