lenary created this revision.
lenary added reviewers: tejohnson, dblaikie, khchen, dsanders, echristo.
Herald added subscribers: llvm-commits, lldb-commits, cfe-commits, liufengdb,
herhut, lucyrfox, mgester, arpith-jacob, csigg, nicolasvasilache, antiagainst,
shauheen, burmako, jpienaar, rriddle, mehdi_amini, dang, dexonsmith, steven_wu,
hiraditya.
Herald added projects: clang, LLDB, LLVM.
This patch attempts to add a target-overridable hook for allowing module
metadata
to override TargetMachine options, especially during LTO.
The new hook is called `TargetMachine::resetTargetDefaultOptions` and takes the
`llvm::Module` so that the module metadata can be read with the API provided
by `llvm::Module`.
It is not clear that this patch handles LTO correctly at the moment.
This patch relates to D72245 <https://reviews.llvm.org/D72245> and D72246
<https://reviews.llvm.org/D72246> and the discussion in
http://lists.llvm.org/pipermail/llvm-dev/2020-January/138151.html
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D72624
Files:
clang/lib/CodeGen/BackendUtil.cpp
clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp
llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst
llvm/examples/Kaleidoscope/Chapter8/toy.cpp
llvm/include/llvm/Target/TargetMachine.h
llvm/lib/LTO/LTOCodeGenerator.cpp
llvm/lib/Target/TargetMachine.cpp
llvm/lib/Target/TargetMachineC.cpp
llvm/tools/llc/llc.cpp
llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp
llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp
llvm/tools/opt/opt.cpp
mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp
mlir/lib/ExecutionEngine/ExecutionEngine.cpp
Index: mlir/lib/ExecutionEngine/ExecutionEngine.cpp
===================================================================
--- mlir/lib/ExecutionEngine/ExecutionEngine.cpp
+++ mlir/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -110,8 +110,9 @@
}
std::unique_ptr<llvm::TargetMachine> machine(
target->createTargetMachine(targetTriple, "generic", "", {}, {}));
- llvmModule->setDataLayout(machine->createDataLayout());
llvmModule->setTargetTriple(targetTriple);
+ machine->resetTargetDefaultOptions(*llvmModule);
+ llvmModule->setDataLayout(machine->createDataLayout());
return false;
}
Index: mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp
===================================================================
--- mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp
+++ mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp
@@ -142,6 +142,7 @@
}
// Set the data layout of the llvm module to match what the ptx target needs.
+ targetMachine->resetTargetDefaultOptions(llvmModule);
llvmModule.setDataLayout(targetMachine->createDataLayout());
auto ptx = translateModuleToPtx(llvmModule, *targetMachine);
Index: llvm/tools/opt/opt.cpp
===================================================================
--- llvm/tools/opt/opt.cpp
+++ llvm/tools/opt/opt.cpp
@@ -674,6 +674,8 @@
std::unique_ptr<TargetMachine> TM(Machine);
+ TM->resetTargetDefaultOptions(*M);
+
// Override function attributes based on CPUStr, FeaturesStr, and command line
// flags.
setFunctionAttributes(CPUStr, FeaturesStr, *M);
Index: llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp
===================================================================
--- llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp
+++ llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp
@@ -123,6 +123,7 @@
//
M->setTargetTriple(TM->getTargetTriple().normalize());
+ TM->resetTargetDefaultOptions(*M);
M->setDataLayout(TM->createDataLayout());
setFunctionAttributes(TM->getTargetCPU(), TM->getTargetFeatureString(), *M);
Index: llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp
===================================================================
--- llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp
+++ llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp
@@ -91,6 +91,7 @@
// Set up the module to build for our target.
M->setTargetTriple(TM->getTargetTriple().normalize());
+ TM->resetTargetDefaultOptions(*M);
M->setDataLayout(TM->createDataLayout());
// Build up a PM to do instruction selection.
Index: llvm/tools/llc/llc.cpp
===================================================================
--- llvm/tools/llc/llc.cpp
+++ llvm/tools/llc/llc.cpp
@@ -504,6 +504,9 @@
TLII.disableAllFunctions();
PM.add(new TargetLibraryInfoWrapperPass(TLII));
+ // Initialise target default options from module metadata
+ Target->resetTargetDefaultOptions(*M);
+
// Add the target data from the target machine, if it exists, or the module.
M->setDataLayout(Target->createDataLayout());
Index: llvm/lib/Target/TargetMachineC.cpp
===================================================================
--- llvm/lib/Target/TargetMachineC.cpp
+++ llvm/lib/Target/TargetMachineC.cpp
@@ -193,6 +193,7 @@
std::string error;
+ TM->resetTargetDefaultOptions(*Mod);
Mod->setDataLayout(TM->createDataLayout());
CodeGenFileType ft;
Index: llvm/lib/Target/TargetMachine.cpp
===================================================================
--- llvm/lib/Target/TargetMachine.cpp
+++ llvm/lib/Target/TargetMachine.cpp
@@ -45,6 +45,15 @@
return getRelocationModel() == Reloc::PIC_;
}
+/// Reset the target default options based on the module's attributes.
+// This will only be called once on TargetMachine initialisation.
+//
+// Override methods should only change DefaultOptions, and use this super
+// method to copy the default options into the current options.
+void TargetMachine::resetTargetDefaultOptions(const Module &M) const {
+ Options = DefaultOptions;
+}
+
/// Reset the target options based on the function's attributes.
// FIXME: This function needs to go away for a number of reasons:
// a) global state on the TargetMachine is terrible in general,
Index: llvm/lib/LTO/LTOCodeGenerator.cpp
===================================================================
--- llvm/lib/LTO/LTOCodeGenerator.cpp
+++ llvm/lib/LTO/LTOCodeGenerator.cpp
@@ -371,6 +371,7 @@
}
TargetMach = createTargetMachine();
+ TargetMach->resetTargetDefaultOptions(*MergedModule);
return true;
}
Index: llvm/include/llvm/Target/TargetMachine.h
===================================================================
--- llvm/include/llvm/Target/TargetMachine.h
+++ llvm/include/llvm/Target/TargetMachine.h
@@ -180,6 +180,14 @@
return DL.getPointerSize(DL.getAllocaAddrSpace());
}
+ /// Update the target option defaults based on module's attributes.
+ // Called once on TargetMachine initialisation if Module available.
+ //
+ // When initialising an `llvm::Module M`, this should be called after
+ // `M.setTargetTriple(TM->getTargetTriple())` and before
+ // `M.setDataLayout(createDataLayout())`.
+ virtual void resetTargetDefaultOptions(const Module &M) const;
+
/// Reset the target options based on the function's attributes.
// FIXME: Remove TargetOptions that affect per-function code generation
// from TargetMachine.
Index: llvm/examples/Kaleidoscope/Chapter8/toy.cpp
===================================================================
--- llvm/examples/Kaleidoscope/Chapter8/toy.cpp
+++ llvm/examples/Kaleidoscope/Chapter8/toy.cpp
@@ -1241,6 +1241,7 @@
auto TheTargetMachine =
Target->createTargetMachine(TargetTriple, CPU, Features, opt, RM);
+ TheTargetMachine->resetTargetDefaultOptions(*TheModule);
TheModule->setDataLayout(TheTargetMachine->createDataLayout());
auto Filename = "output.o";
Index: llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst
===================================================================
--- llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst
+++ llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst
@@ -129,9 +129,10 @@
.. code-block:: c++
+ TheModule->setTargetTriple(TargetTriple);
+ TargetMachine->resetTargetDefaultOptions(*TheModule);
TheModule->setDataLayout(TargetMachine->createDataLayout());
- TheModule->setTargetTriple(TargetTriple);
-
+
Emit Object Code
================
Index: lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp
===================================================================
--- lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp
+++ lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp
@@ -147,6 +147,7 @@
target_machine->createDataLayout().getStringRepresentation().c_str());
}
module.setTargetTriple(real_triple);
+ target_machine->resetTargetDefaultOptions(module);
module.setDataLayout(target_machine->createDataLayout());
}
return changed_module;
Index: clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
===================================================================
--- clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
+++ clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
@@ -108,6 +108,7 @@
getFeaturesStr(), Options, getRelocModel(),
getCodeModel(), OLvl);
std::unique_ptr<TargetMachine> TM(Machine);
+ TM->resetTargetDefaultOptions(*M);
setFunctionAttributes(getCPUStr(), getFeaturesStr(), *M);
legacy::PassManager Passes;
Index: clang/lib/CodeGen/BackendUtil.cpp
===================================================================
--- clang/lib/CodeGen/BackendUtil.cpp
+++ clang/lib/CodeGen/BackendUtil.cpp
@@ -813,8 +813,11 @@
if (UsesCodeGen && !TM)
return;
- if (TM)
+
+ if (TM) {
+ TM->resetTargetDefaultOptions(*TheModule);
TheModule->setDataLayout(TM->createDataLayout());
+ }
legacy::PassManager PerModulePasses;
PerModulePasses.add(
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits