Author: David Greene Date: 2021-12-02T08:24:56-08:00 New Revision: 53adfa8750eaf4558c41a50f699616545eb0151b
URL: https://github.com/llvm/llvm-project/commit/53adfa8750eaf4558c41a50f699616545eb0151b DIFF: https://github.com/llvm/llvm-project/commit/53adfa8750eaf4558c41a50f699616545eb0151b.diff LOG: [clang] Do not duplicate "EnableSplitLTOUnit" module flag If clang's output is set to bitcode and LTO is enabled, clang would unconditionally add the flag to the module. Unfortunately, if the input were a bitcode or IR file and had the flag set, this would result in two copies of the flag, which is illegal IR. Guard the setting of the flag by checking whether it already exists. This follows existing practice for the related "ThinLTO" module flag. Differential Revision: https://reviews.llvm.org/D112177 Added: clang/test/CodeGen/enable-split-lto-unit.ll Modified: clang/lib/CodeGen/BackendUtil.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 648c7b3df8ed4..510f3911939cf 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1034,8 +1034,9 @@ void EmitAssemblyHelper::EmitAssemblyWithLegacyPassManager( if (!ThinLinkOS) return; } - TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", - CodeGenOpts.EnableSplitLTOUnit); + if (!TheModule->getModuleFlag("EnableSplitLTOUnit")) + TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", + CodeGenOpts.EnableSplitLTOUnit); PerModulePasses.add(createWriteThinLTOBitcodePass( *OS, ThinLinkOS ? &ThinLinkOS->os() : nullptr)); } else { @@ -1049,8 +1050,9 @@ void EmitAssemblyHelper::EmitAssemblyWithLegacyPassManager( if (EmitLTOSummary) { if (!TheModule->getModuleFlag("ThinLTO")) TheModule->addModuleFlag(Module::Error, "ThinLTO", uint32_t(0)); - TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", - uint32_t(1)); + if (!TheModule->getModuleFlag("EnableSplitLTOUnit")) + TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", + uint32_t(1)); } PerModulePasses.add(createBitcodeWriterPass( @@ -1451,8 +1453,9 @@ void EmitAssemblyHelper::RunOptimizationPipeline( if (!ThinLinkOS) return; } - TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", - CodeGenOpts.EnableSplitLTOUnit); + if (!TheModule->getModuleFlag("EnableSplitLTOUnit")) + TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", + CodeGenOpts.EnableSplitLTOUnit); MPM.addPass(ThinLTOBitcodeWriterPass(*OS, ThinLinkOS ? &ThinLinkOS->os() : nullptr)); } else { @@ -1465,8 +1468,9 @@ void EmitAssemblyHelper::RunOptimizationPipeline( if (EmitLTOSummary) { if (!TheModule->getModuleFlag("ThinLTO")) TheModule->addModuleFlag(Module::Error, "ThinLTO", uint32_t(0)); - TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", - uint32_t(1)); + if (!TheModule->getModuleFlag("EnableSplitLTOUnit")) + TheModule->addModuleFlag(Module::Error, "EnableSplitLTOUnit", + uint32_t(1)); } MPM.addPass( BitcodeWriterPass(*OS, CodeGenOpts.EmitLLVMUseLists, EmitLTOSummary)); diff --git a/clang/test/CodeGen/enable-split-lto-unit.ll b/clang/test/CodeGen/enable-split-lto-unit.ll new file mode 100644 index 0000000000000..2ca09a1ae3a8a --- /dev/null +++ b/clang/test/CodeGen/enable-split-lto-unit.ll @@ -0,0 +1,25 @@ +; Test that we do not duplicate the EnableSplitLTOUnit module flag. +; +; Disable the verifier so the compiler doesn't abort and thus lead to empty +; output and false pass. +; +; RUN: %clang_cc1 -fno-legacy-pass-manager -emit-llvm-bc -flto=full -disable-llvm-verifier -o - %s | llvm-dis | FileCheck %s --check-prefix=FULL-NPM +; RUN: %clang_cc1 -fno-legacy-pass-manager -emit-llvm-bc -flto=thin -disable-llvm-verifier -o - %s | llvm-dis | FileCheck %s --check-prefix=THIN-NPM +; RUN: %clang_cc1 -flegacy-pass-manager -emit-llvm-bc -flto=full -disable-llvm-verifier -o - %s | llvm-dis | FileCheck %s --check-prefix=FULL-OPM +; RUN: %clang_cc1 -flegacy-pass-manager -emit-llvm-bc -flto=thin -disable-llvm-verifier -o - %s | llvm-dis | FileCheck %s --check-prefix=THIN-OPM + +define dso_local void @main() local_unnamed_addr { +entry: + ret void +} + +; FULL-NPM-NOT: !llvm.module.flags = !{!0, !1, !2, !3, !3} +; FULL-OPM-NOT: !llvm.module.flags = !{!0, !1, !2, !3, !3} +; THIN-NPM-NOT: !llvm.module.flags = !{!0, !1, !2, !3, !4} +; THIN-OPM-NOT: !llvm.module.flags = !{!0, !1, !2, !3, !4} +!llvm.module.flags = !{!0, !1, !2, !3} + +!0 = !{i32 1, !"wchar_size", i32 2} +!1 = !{i32 7, !"frame-pointer", i32 2} +!2 = !{i32 1, !"ThinLTO", i32 0} +!3 = !{i32 1, !"EnableSplitLTOUnit", i32 1} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits