diff options
-rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h | 12 | ||||
-rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h | 4 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 9 | ||||
-rw-r--r-- | llvm/test/ExecutionEngine/OrcLazy/module-flags.ll | 13 | ||||
-rw-r--r-- | llvm/tools/lli/OrcLazyJIT.cpp | 12 |
5 files changed, 40 insertions, 10 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h index ca3f7eec64d..c670ad635ea 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h +++ b/llvm/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/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h index 4592e74126b..6b38a24b5ae 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h +++ b/llvm/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/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index 7e2e873f8d3..711b887da6e 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/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/llvm/test/ExecutionEngine/OrcLazy/module-flags.ll b/llvm/test/ExecutionEngine/OrcLazy/module-flags.ll new file mode 100644 index 00000000000..c1240a876cb --- /dev/null +++ b/llvm/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/llvm/tools/lli/OrcLazyJIT.cpp b/llvm/tools/lli/OrcLazyJIT.cpp index d9cec0ce363..de69a269887 100644 --- a/llvm/tools/lli/OrcLazyJIT.cpp +++ b/llvm/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; |