aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2016-09-04 17:53:30 +0000
committerLang Hames <lhames@gmail.com>2016-09-04 17:53:30 +0000
commitb80c6300c56a13e4787e3ae10ced955585f05f16 (patch)
tree3e820e1bb1230e00b092881bbc79b6e35d4b22c1
parentfa79defc962df5886c096b8d3224799746b5d6b5 (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.h12
-rw-r--r--include/llvm/ExecutionEngine/Orc/IndirectionUtils.h4
-rw-r--r--lib/ExecutionEngine/Orc/IndirectionUtils.cpp9
-rw-r--r--test/ExecutionEngine/OrcLazy/module-flags.ll13
-rw-r--r--tools/lli/OrcLazyJIT.cpp12
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;