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(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits