diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/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( diff --git a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp --- a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp +++ b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp @@ -108,6 +108,7 @@ getFeaturesStr(), Options, getRelocModel(), getCodeModel(), OLvl); std::unique_ptr TM(Machine); + TM->resetTargetDefaultOptions(*M); setFunctionAttributes(getCPUStr(), getFeaturesStr(), *M); legacy::PassManager Passes; diff --git a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp --- a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptExpressionOpts.cpp +++ b/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; diff --git a/llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst b/llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst --- a/llvm/docs/tutorial/MyFirstLanguageFrontend/LangImpl08.rst +++ b/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 ================ diff --git a/llvm/examples/Kaleidoscope/Chapter8/toy.cpp b/llvm/examples/Kaleidoscope/Chapter8/toy.cpp --- a/llvm/examples/Kaleidoscope/Chapter8/toy.cpp +++ b/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"; diff --git a/llvm/include/llvm/Target/TargetMachine.h b/llvm/include/llvm/Target/TargetMachine.h --- a/llvm/include/llvm/Target/TargetMachine.h +++ b/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. diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -371,6 +371,7 @@ } TargetMach = createTargetMachine(); + TargetMach->resetTargetDefaultOptions(*MergedModule); return true; } diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp --- a/llvm/lib/Target/TargetMachine.cpp +++ b/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, diff --git a/llvm/lib/Target/TargetMachineC.cpp b/llvm/lib/Target/TargetMachineC.cpp --- a/llvm/lib/Target/TargetMachineC.cpp +++ b/llvm/lib/Target/TargetMachineC.cpp @@ -193,6 +193,7 @@ std::string error; + TM->resetTargetDefaultOptions(*Mod); Mod->setDataLayout(TM->createDataLayout()); CodeGenFileType ft; diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp --- a/llvm/tools/llc/llc.cpp +++ b/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()); diff --git a/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp b/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp --- a/llvm/tools/llvm-isel-fuzzer/llvm-isel-fuzzer.cpp +++ b/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. diff --git a/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp b/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp --- a/llvm/tools/llvm-opt-fuzzer/llvm-opt-fuzzer.cpp +++ b/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); diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -674,6 +674,8 @@ std::unique_ptr TM(Machine); + TM->resetTargetDefaultOptions(*M); + // Override function attributes based on CPUStr, FeaturesStr, and command line // flags. setFunctionAttributes(CPUStr, FeaturesStr, *M); diff --git a/mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp b/mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp --- a/mlir/lib/Conversion/GPUToCUDA/ConvertKernelFuncToCubin.cpp +++ b/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); diff --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp --- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp @@ -110,8 +110,9 @@ } std::unique_ptr machine( target->createTargetMachine(targetTriple, "generic", "", {}, {})); - llvmModule->setDataLayout(machine->createDataLayout()); llvmModule->setTargetTriple(targetTriple); + machine->resetTargetDefaultOptions(*llvmModule); + llvmModule->setDataLayout(machine->createDataLayout()); return false; }