mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-29 14:40:39 +00:00
[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
This commit is contained in:
parent
fa79defc96
commit
b80c6300c5
@ -364,10 +364,11 @@ private:
|
|||||||
assert(!EC && "Error generating stubs");
|
assert(!EC && "Error generating stubs");
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this module doesn't contain any globals or aliases we can bail out
|
// If this module doesn't contain any globals, aliases, or module flags then
|
||||||
// early and avoid the overhead of creating and managing an empty globals
|
// we can bail out early and avoid the overhead of creating and managing an
|
||||||
// module.
|
// empty globals module.
|
||||||
if (SrcM.global_empty() && SrcM.alias_empty())
|
if (SrcM.global_empty() && SrcM.alias_empty() &&
|
||||||
|
!SrcM.getModuleFlagsMetadata())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Create the GlobalValues module.
|
// Create the GlobalValues module.
|
||||||
@ -387,6 +388,9 @@ private:
|
|||||||
if (!VMap.count(&A))
|
if (!VMap.count(&A))
|
||||||
cloneGlobalAliasDecl(*GVsM, A, VMap);
|
cloneGlobalAliasDecl(*GVsM, A, VMap);
|
||||||
|
|
||||||
|
// Clone the module flags.
|
||||||
|
cloneModuleFlagsMetadata(*GVsM, SrcM, VMap);
|
||||||
|
|
||||||
// Now we need to clone the GV and alias initializers.
|
// Now we need to clone the GV and alias initializers.
|
||||||
|
|
||||||
// Initializers may refer to functions declared (but not defined) in this
|
// Initializers may refer to functions declared (but not defined) in this
|
||||||
|
@ -415,6 +415,10 @@ void moveGlobalVariableInitializer(GlobalVariable &OrigGV,
|
|||||||
GlobalAlias *cloneGlobalAliasDecl(Module &Dst, const GlobalAlias &OrigA,
|
GlobalAlias *cloneGlobalAliasDecl(Module &Dst, const GlobalAlias &OrigA,
|
||||||
ValueToValueMapTy &VMap);
|
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 orc.
|
||||||
} // End namespace llvm.
|
} // End namespace llvm.
|
||||||
|
|
||||||
|
@ -241,5 +241,14 @@ GlobalAlias* cloneGlobalAliasDecl(Module &Dst, const GlobalAlias &OrigA,
|
|||||||
return NewA;
|
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 orc.
|
||||||
} // End namespace llvm.
|
} // End namespace llvm.
|
||||||
|
13
test/ExecutionEngine/OrcLazy/module-flags.ll
Normal file
13
test/ExecutionEngine/OrcLazy/module-flags.ll
Normal file
@ -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}
|
@ -18,7 +18,7 @@ using namespace llvm;
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
enum class DumpKind { NoDump, DumpFuncsToStdOut, DumpModsToStdErr,
|
enum class DumpKind { NoDump, DumpFuncsToStdOut, DumpModsToStdOut,
|
||||||
DumpModsToDisk };
|
DumpModsToDisk };
|
||||||
|
|
||||||
cl::opt<DumpKind> OrcDumpKind("orc-lazy-debug",
|
cl::opt<DumpKind> OrcDumpKind("orc-lazy-debug",
|
||||||
@ -30,9 +30,9 @@ namespace {
|
|||||||
clEnumValN(DumpKind::DumpFuncsToStdOut,
|
clEnumValN(DumpKind::DumpFuncsToStdOut,
|
||||||
"funcs-to-stdout",
|
"funcs-to-stdout",
|
||||||
"Dump function names to stdout."),
|
"Dump function names to stdout."),
|
||||||
clEnumValN(DumpKind::DumpModsToStdErr,
|
clEnumValN(DumpKind::DumpModsToStdOut,
|
||||||
"mods-to-stderr",
|
"mods-to-stdout",
|
||||||
"Dump modules to stderr."),
|
"Dump modules to stdout."),
|
||||||
clEnumValN(DumpKind::DumpModsToDisk,
|
clEnumValN(DumpKind::DumpModsToDisk,
|
||||||
"mods-to-disk",
|
"mods-to-disk",
|
||||||
"Dump modules to the current "
|
"Dump modules to the current "
|
||||||
@ -71,9 +71,9 @@ OrcLazyJIT::TransformFtor OrcLazyJIT::createDebugDumper() {
|
|||||||
return M;
|
return M;
|
||||||
};
|
};
|
||||||
|
|
||||||
case DumpKind::DumpModsToStdErr:
|
case DumpKind::DumpModsToStdOut:
|
||||||
return [](std::unique_ptr<Module> M) {
|
return [](std::unique_ptr<Module> M) {
|
||||||
dbgs() << "----- Module Start -----\n" << *M
|
outs() << "----- Module Start -----\n" << *M
|
||||||
<< "----- Module End -----\n";
|
<< "----- Module End -----\n";
|
||||||
|
|
||||||
return M;
|
return M;
|
||||||
|
Loading…
Reference in New Issue
Block a user