https://github.com/Prabhuk updated https://github.com/llvm/llvm-project/pull/222099
>From 61817f265e44155c14ad096e0b578ac9b269a63a Mon Sep 17 00:00:00 2001 From: prabhukr <[email protected]> Date: Tue, 8 Sep 2026 11:32:58 -0700 Subject: [PATCH 1/3] [clang] Fix target-dependent default for -mincremental-linker-compatible Patch #188800 modified the target specific default for this flag which resulted in non MSVC, non UEFI targets getting this flag set. This caused issue https://github.com/llvm/llvm-project/issues/219457 which this patch should fix. Assisted-by: Gemini --- clang/include/clang/Options/Options.td | 15 ++-- clang/test/CodeGen/coff-default-timestamp.c | 21 ++++++ .../Driver/incremental-linker-compatible.c | 10 +++ clang/test/Misc/cc1as-coff-timestamp.s | 19 +++++ clang/tools/driver/cc1as_main.cpp | 6 +- .../Frontend/CompilerInvocationTest.cpp | 71 +++++++++++++++++++ 6 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 clang/test/CodeGen/coff-default-timestamp.c create mode 100644 clang/test/Misc/cc1as-coff-timestamp.s diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index b4023d278dfe8..b1354581a5fce 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -6275,15 +6275,14 @@ def mrelax_all : Flag<["-"], "mrelax-all">, Group<m_Group>, Visibility<[ClangOption, CC1Option, CC1AsOption]>, HelpText<"(integrated-as) Relax all machine instructions">, MarshallingInfoFlag<CodeGenOpts<"RelaxAll">>; -def mincremental_linker_compatible : Flag<["-"], "mincremental-linker-compatible">, Group<m_Group>, - Visibility<[ClangOption, CC1Option, CC1AsOption]>, +defm incremental_linker_compatible : BoolMOption<"incremental-linker-compatible", + CodeGenOpts<"IncrementalLinkerCompatible">, Default<"T.isDefaultIncrementalLinkerCompatibleByDefault()">, - HelpText<"(integrated-as) Emit an object file which can be used with an incremental linker">, - MarshallingInfoFlag<CodeGenOpts<"IncrementalLinkerCompatible">>; -def mno_incremental_linker_compatible : Flag<["-"], "mno-incremental-linker-compatible">, Group<m_Group>, - Visibility<[ClangOption, CC1Option, CC1AsOption]>, - HelpText<"(integrated-as) Emit an object file which cannot be used with an incremental linker">, - MarshallingInfoNegativeFlag<CodeGenOpts<"IncrementalLinkerCompatible">>; + PosFlag<SetTrue, [], [], + "Emit an object file which can be used with an incremental linker">, + NegFlag<SetFalse, [], [], + "Emit an object file which cannot be used with an incremental linker">, + BothFlags<[], [ClangOption, CC1Option, CC1AsOption]>>; def mrtd : Flag<["-"], "mrtd">, Group<m_Group>, Visibility<[ClangOption, CC1Option]>, HelpText<"Make StdCall calling convention the default">; diff --git a/clang/test/CodeGen/coff-default-timestamp.c b/clang/test/CodeGen/coff-default-timestamp.c new file mode 100644 index 0000000000000..82d5bdf5b7fb4 --- /dev/null +++ b/clang/test/CodeGen/coff-default-timestamp.c @@ -0,0 +1,21 @@ +// REQUIRES: x86-registered-target +// RUN: %clang_cc1 -triple x86_64-w64-windows-gnu -emit-obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=GNU-DEFAULT +// GNU-DEFAULT: TimeDateStamp: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang_cc1 -triple x86_64-w64-windows-gnu -mincremental-linker-compatible -emit-obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=GNU-INC +// GNU-INC: ImageFileHeader { +// GNU-INC: TimeDateStamp: +// GNU-INC-NOT: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -mno-incremental-linker-compatible -emit-obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=MSVC-NOINC +// MSVC-NOINC: TimeDateStamp: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -emit-obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=MSVC-DEFAULT +// MSVC-DEFAULT: ImageFileHeader { +// MSVC-DEFAULT: TimeDateStamp: +// MSVC-DEFAULT-NOT: 1970-01-01 00:00:00 (0x0) + + +int main(void) { + return 0; +} diff --git a/clang/test/Driver/incremental-linker-compatible.c b/clang/test/Driver/incremental-linker-compatible.c index 5c3c85d46c214..765fcd66f50d9 100644 --- a/clang/test/Driver/incremental-linker-compatible.c +++ b/clang/test/Driver/incremental-linker-compatible.c @@ -27,3 +27,13 @@ // RUN: %clang '-###' %s -c -o tmp.o -target x86_64-uefi -integrated-as -mno-incremental-linker-compatible 2>&1 | FileCheck %s --check-prefix=TEST9 // TEST9: "-cc1" {{.*}} "-mno-incremental-linker-compatible" + +// RUN: %clang '-###' %s -c -o tmp.o -target x86_64-w64-windows-gnu -integrated-as 2>&1 | FileCheck %s --check-prefix=TEST10 +// TEST10-NOT: "-cc1" {{.*}} "-mincremental-linker-compatible" +// TEST10-NOT: "-cc1" {{.*}} "-mno-incremental-linker-compatible" + +// RUN: %clang '-###' %s -c -o tmp.o -target x86_64-w64-windows-gnu -integrated-as -mincremental-linker-compatible 2>&1 | FileCheck %s --check-prefix=TEST11 +// TEST11: "-cc1" {{.*}} "-mincremental-linker-compatible" + +// RUN: %clang '-###' %s -c -o tmp.o -target x86_64-w64-windows-gnu -integrated-as -mno-incremental-linker-compatible 2>&1 | FileCheck %s --check-prefix=TEST12 +// TEST12: "-cc1" {{.*}} "-mno-incremental-linker-compatible" diff --git a/clang/test/Misc/cc1as-coff-timestamp.s b/clang/test/Misc/cc1as-coff-timestamp.s new file mode 100644 index 0000000000000..88b6981ed5ff8 --- /dev/null +++ b/clang/test/Misc/cc1as-coff-timestamp.s @@ -0,0 +1,19 @@ +// REQUIRES: x86-registered-target +// RUN: %clang -cc1as -triple x86_64-w64-windows-gnu -filetype obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=GNU-DEFAULT +// GNU-DEFAULT: TimeDateStamp: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang -cc1as -triple x86_64-w64-windows-gnu -mincremental-linker-compatible -filetype obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=GNU-INC +// GNU-INC: ImageFileHeader { +// GNU-INC: TimeDateStamp: +// GNU-INC-NOT: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang -cc1as -triple x86_64-pc-windows-msvc -mno-incremental-linker-compatible -filetype obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=MSVC-NOINC +// MSVC-NOINC: TimeDateStamp: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang -cc1as -triple x86_64-pc-windows-msvc -filetype obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=MSVC-DEFAULT +// MSVC-DEFAULT: ImageFileHeader { +// MSVC-DEFAULT: TimeDateStamp: +// MSVC-DEFAULT-NOT: 1970-01-01 00:00:00 (0x0) + + .text + ret diff --git a/clang/tools/driver/cc1as_main.cpp b/clang/tools/driver/cc1as_main.cpp index 077cd69ce4e2c..0c716a7cc7673 100644 --- a/clang/tools/driver/cc1as_main.cpp +++ b/clang/tools/driver/cc1as_main.cpp @@ -370,8 +370,9 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, Opts.RelocationModel = std::string(Args.getLastArgValue(OPT_mrelocation_model, "pic")); Opts.TargetABI = std::string(Args.getLastArgValue(OPT_target_abi)); - Opts.IncrementalLinkerCompatible = - Args.hasArg(OPT_mincremental_linker_compatible); + Opts.IncrementalLinkerCompatible = Args.hasFlag( + OPT_mincremental_linker_compatible, OPT_mno_incremental_linker_compatible, + Opts.Triple.isDefaultIncrementalLinkerCompatibleByDefault()); Opts.SymbolDefs = Args.getAllArgValues(OPT_defsym); // EmbedBitcode Option. If -fembed-bitcode is enabled, set the flag. @@ -465,6 +466,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, MCTargetOptions MCOptions; MCOptions.MCRelaxAll = Opts.RelaxAll; + MCOptions.MCIncrementalLinkerCompatible = Opts.IncrementalLinkerCompatible; MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind; MCOptions.EmitCompactUnwindNonCanonical = Opts.EmitCompactUnwindNonCanonical; MCOptions.EmitSFrameUnwind = Opts.EmitSFrameUnwind; diff --git a/clang/unittests/Frontend/CompilerInvocationTest.cpp b/clang/unittests/Frontend/CompilerInvocationTest.cpp index 8c6c1d58f7e59..f799e3bcd6359 100644 --- a/clang/unittests/Frontend/CompilerInvocationTest.cpp +++ b/clang/unittests/Frontend/CompilerInvocationTest.cpp @@ -427,6 +427,77 @@ TEST_F(CommandLineTest, BoolOptionDefaultArbitraryTwoFlagsPresentReset) { ASSERT_THAT(GeneratedArgs, Not(Contains(StrEq("-clear-ast-before-backend")))); } +// Boolean option with a keypath that defaults to a target-dependent expression. +// IncrementalLinkerCompatible defaults to true on MSVC/UEFI, and false on +// others. + +TEST_F(CommandLineTest, BoolOptionDefaultTargetDependentPresentNoneGNU) { + const char *Args[] = {"-triple", "x86_64-w64-windows-gnu"}; + + ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags)); + ASSERT_FALSE(Invocation.getCodeGenOpts().IncrementalLinkerCompatible); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mincremental-linker-compatible")))); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mno-incremental-linker-compatible")))); +} + +TEST_F(CommandLineTest, BoolOptionDefaultTargetDependentPresentNoneMSVC) { + const char *Args[] = {"-triple", "x86_64-pc-windows-msvc"}; + + ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags)); + ASSERT_TRUE(Invocation.getCodeGenOpts().IncrementalLinkerCompatible); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mincremental-linker-compatible")))); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mno-incremental-linker-compatible")))); +} + +TEST_F(CommandLineTest, BoolOptionDefaultTargetDependentPresentNoneUEFI) { + const char *Args[] = {"-triple", "x86_64-unknown-uefi"}; + + ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags)); + ASSERT_TRUE(Invocation.getCodeGenOpts().IncrementalLinkerCompatible); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mincremental-linker-compatible")))); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mno-incremental-linker-compatible")))); +} + +TEST_F(CommandLineTest, BoolOptionDefaultTargetDependentPresentChangeGNU) { + const char *Args[] = {"-triple", "x86_64-w64-windows-gnu", + "-mincremental-linker-compatible"}; + + ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags)); + ASSERT_TRUE(Invocation.getCodeGenOpts().IncrementalLinkerCompatible); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, + Contains(StrEq("-mincremental-linker-compatible"))); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mno-incremental-linker-compatible")))); +} + +TEST_F(CommandLineTest, BoolOptionDefaultTargetDependentPresentChangeMSVC) { + const char *Args[] = {"-triple", "x86_64-pc-windows-msvc", + "-mno-incremental-linker-compatible"}; + + ASSERT_TRUE(CompilerInvocation::CreateFromArgs(Invocation, Args, *Diags)); + ASSERT_FALSE(Invocation.getCodeGenOpts().IncrementalLinkerCompatible); + + Invocation.generateCC1CommandLine(GeneratedArgs, *this); + ASSERT_THAT(GeneratedArgs, + Contains(StrEq("-mno-incremental-linker-compatible"))); + ASSERT_THAT(GeneratedArgs, + Not(Contains(StrEq("-mincremental-linker-compatible")))); +} + // Boolean option that gets the CC1Option flag from a let statement (which // is applied **after** the record is defined): // >From 2583cc7822c717252e3fe2532d4d84cc1adf4488 Mon Sep 17 00:00:00 2001 From: prabhukr <[email protected]> Date: Tue, 8 Sep 2026 11:43:16 -0700 Subject: [PATCH 2/3] Add UEFI triple to tests --- clang/test/CodeGen/coff-default-timestamp.c | 8 ++++++++ clang/test/Misc/cc1as-coff-timestamp.s | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/clang/test/CodeGen/coff-default-timestamp.c b/clang/test/CodeGen/coff-default-timestamp.c index 82d5bdf5b7fb4..ea3125bfd9f9b 100644 --- a/clang/test/CodeGen/coff-default-timestamp.c +++ b/clang/test/CodeGen/coff-default-timestamp.c @@ -15,6 +15,14 @@ // MSVC-DEFAULT: TimeDateStamp: // MSVC-DEFAULT-NOT: 1970-01-01 00:00:00 (0x0) +// RUN: %clang_cc1 -triple x86_64-unknown-uefi -mno-incremental-linker-compatible -emit-obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=UEFI-NOINC +// UEFI-NOINC: TimeDateStamp: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang_cc1 -triple x86_64-unknown-uefi -emit-obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=UEFI-DEFAULT +// UEFI-DEFAULT: ImageFileHeader { +// UEFI-DEFAULT: TimeDateStamp: +// UEFI-DEFAULT-NOT: 1970-01-01 00:00:00 (0x0) + int main(void) { return 0; diff --git a/clang/test/Misc/cc1as-coff-timestamp.s b/clang/test/Misc/cc1as-coff-timestamp.s index 88b6981ed5ff8..9334e899e8b39 100644 --- a/clang/test/Misc/cc1as-coff-timestamp.s +++ b/clang/test/Misc/cc1as-coff-timestamp.s @@ -15,5 +15,13 @@ // MSVC-DEFAULT: TimeDateStamp: // MSVC-DEFAULT-NOT: 1970-01-01 00:00:00 (0x0) +// RUN: %clang -cc1as -triple x86_64-unknown-uefi -mno-incremental-linker-compatible -filetype obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=UEFI-NOINC +// UEFI-NOINC: TimeDateStamp: 1970-01-01 00:00:00 (0x0) + +// RUN: %clang -cc1as -triple x86_64-unknown-uefi -filetype obj %s -o - | llvm-readobj -h - | FileCheck %s --check-prefix=UEFI-DEFAULT +// UEFI-DEFAULT: ImageFileHeader { +// UEFI-DEFAULT: TimeDateStamp: +// UEFI-DEFAULT-NOT: 1970-01-01 00:00:00 (0x0) + .text ret >From a331d027664962892db1192676c3a96fc0042e4c Mon Sep 17 00:00:00 2001 From: prabhukr <[email protected]> Date: Tue, 8 Sep 2026 12:05:46 -0700 Subject: [PATCH 3/3] Fix help text --- clang/include/clang/Options/Options.td | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index b1354581a5fce..2844a3cb6799b 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -6279,9 +6279,9 @@ defm incremental_linker_compatible : BoolMOption<"incremental-linker-compatible" CodeGenOpts<"IncrementalLinkerCompatible">, Default<"T.isDefaultIncrementalLinkerCompatibleByDefault()">, PosFlag<SetTrue, [], [], - "Emit an object file which can be used with an incremental linker">, + "(integrated-as) Emit an object file which can be used with an incremental linker">, NegFlag<SetFalse, [], [], - "Emit an object file which cannot be used with an incremental linker">, + "(integrated-as) Emit an object file which cannot be used with an incremental linker">, BothFlags<[], [ClangOption, CC1Option, CC1AsOption]>>; def mrtd : Flag<["-"], "mrtd">, Group<m_Group>, Visibility<[ClangOption, CC1Option]>, _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
