diff mbox series

[walnascar] gcc: Upgrade to GCC 14.3

Message ID 20250610090018.746363-1-Deepesh.Varatharajan@windriver.com
State New
Headers show
Series [walnascar] gcc: Upgrade to GCC 14.3 | expand

Commit Message

Deepesh Varatharajan June 10, 2025, 9 a.m. UTC
From: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>

GCC 14.3 is a bug-fix release from the GCC 14 branch
containing important fixes for regressions and serious bugs in
GCC 14.2 with more than 211 bugs fixed since the previous release.

https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=14.3

Dropped the below patches:
0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
https://github.com/gcc-mirror/gcc/commit/a9f88741a99ba09b29cc0021499c63ca445393f0

0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
https://github.com/gcc-mirror/gcc/commit/aa4cd614456de65ee3417acb83c6cff0640144e9

0028-fix-incorrect-preprocessor-line-numbers.patch
https://github.com/gcc-mirror/gcc/commit/8cbe033a8a88fe6437cc5d343ae0ddf8dd3455c8

0001-arm-Fix-LDRD-register-overlap-PR117675.patch
https://github.com/gcc-mirror/gcc/commit/9366c328518766d896155388726055624716c0af

gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
https://github.com/gcc-mirror/gcc/commit/ab884fffe3fc82a710bea66ad651720d71c938b8

Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
---
 .../gcc/{gcc-14.2.inc => gcc-14.3.inc}        |  11 +-
 ...ian_14.2.bb => gcc-cross-canadian_14.3.bb} |   0
 .../{gcc-cross_14.2.bb => gcc-cross_14.3.bb}  |   0
 ...-crosssdk_14.2.bb => gcc-crosssdk_14.3.bb} |   0
 ...cc-runtime_14.2.bb => gcc-runtime_14.3.bb} |   0
 ...itizers_14.2.bb => gcc-sanitizers_14.3.bb} |   0
 ...{gcc-source_14.2.bb => gcc-source_14.3.bb} |   0
 ...m-Fix-LDRD-register-overlap-PR117675.patch | 148 -----
 ...ix-c-tweak-for-Wrange-loop-construct.patch | 114 ----
 ...ch-to-fix-data-relocation-to-ENDBR-s.patch | 447 --------------
 ...-incorrect-preprocessor-line-numbers.patch | 475 ---------------
 ...4fffe3fc82a710bea66ad651720d71c938b8.patch | 549 ------------------
 .../gcc/{gcc_14.2.bb => gcc_14.3.bb}          |   0
 ...initial_14.2.bb => libgcc-initial_14.3.bb} |   0
 .../gcc/{libgcc_14.2.bb => libgcc_14.3.bb}    |   0
 ...ibgfortran_14.2.bb => libgfortran_14.3.bb} |   0
 16 files changed, 3 insertions(+), 1741 deletions(-)
 rename meta/recipes-devtools/gcc/{gcc-14.2.inc => gcc-14.3.inc} (90%)
 rename meta/recipes-devtools/gcc/{gcc-cross-canadian_14.2.bb => gcc-cross-canadian_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{gcc-cross_14.2.bb => gcc-cross_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{gcc-crosssdk_14.2.bb => gcc-crosssdk_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{gcc-runtime_14.2.bb => gcc-runtime_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{gcc-sanitizers_14.2.bb => gcc-sanitizers_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{gcc-source_14.2.bb => gcc-source_14.3.bb} (100%)
 delete mode 100644 meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch
 delete mode 100644 meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
 delete mode 100644 meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
 delete mode 100644 meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch
 delete mode 100644 meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
 rename meta/recipes-devtools/gcc/{gcc_14.2.bb => gcc_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{libgcc-initial_14.2.bb => libgcc-initial_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{libgcc_14.2.bb => libgcc_14.3.bb} (100%)
 rename meta/recipes-devtools/gcc/{libgfortran_14.2.bb => libgfortran_14.3.bb} (100%)

Comments

Deepesh Varatharajan June 10, 2025, 9:07 a.m. UTC | #1
Hi All,

Tested the following :

bitbake gcc, core-image-minimal, world
oe-selftest -r gcc

Oe-selftest results are as follows :

GCC
Status                       14.2           14.3 Difference
PASS                      167,857     191,722       +23,865
FAIL                       58               124               +66
XFAIL                     1,450         1,441            -9
UNRESOLVED      18,406       4                    -18,402
UNSUPPORTED   3,192         2,628            -564

G++
Status                      14.2           14.3 Difference
PASS                      256,224     257,484      +1,260
FAIL                       20               20                0
XFAIL                     2,756         2,793          +37
UNSUPPORTED   11,048       11,330        +282

libatomic
Status        14.2       14.3      Difference
PASS             54          54             0

libitm
Status                         14.2          14.3       Difference
PASS                              24             24 0
FAIL                               19             19 0
XFAIL                             3 3                 0
UNSUPPORTED           2               2                 0

libstdc++
Status                          14.2         14.3     Difference
PASS                          16,373    17,657     +1,284
FAIL                           17            18             +1
XFAIL                         126          127           +1
UNRESOLVED          1,037        27            -1,010
UNSUPPORTED       827           777          -50

Key changes in test results:

-> GCC shows a substantial improvement with ~24K additional passing 
tests and a near-elimination of unresolved cases (99.9% reduction).
-> G++ reports a modest increase of 1,260 passing tests.
-> libstdc++ mirrors GCC's progress with ~1.3K more passing tests and a 
97.4% reduction in unresolved cases.
-> libatomic and libitm remain stable with no significant changes.

Regards,
Deepesh

On 10-06-2025 14:30, Deepesh.Varatharajan@windriver.com wrote:
> From: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
>
> GCC 14.3 is a bug-fix release from the GCC 14 branch
> containing important fixes for regressions and serious bugs in
> GCC 14.2 with more than 211 bugs fixed since the previous release.
>
> https://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&resolution=FIXED&target_milestone=14.3
>
> Dropped the below patches:
> 0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
> https://github.com/gcc-mirror/gcc/commit/a9f88741a99ba09b29cc0021499c63ca445393f0
>
> 0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
> https://github.com/gcc-mirror/gcc/commit/aa4cd614456de65ee3417acb83c6cff0640144e9
>
> 0028-fix-incorrect-preprocessor-line-numbers.patch
> https://github.com/gcc-mirror/gcc/commit/8cbe033a8a88fe6437cc5d343ae0ddf8dd3455c8
>
> 0001-arm-Fix-LDRD-register-overlap-PR117675.patch
> https://github.com/gcc-mirror/gcc/commit/9366c328518766d896155388726055624716c0af
>
> gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
> https://github.com/gcc-mirror/gcc/commit/ab884fffe3fc82a710bea66ad651720d71c938b8
>
> Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> ---
>   .../gcc/{gcc-14.2.inc => gcc-14.3.inc}        |  11 +-
>   ...ian_14.2.bb => gcc-cross-canadian_14.3.bb} |   0
>   .../{gcc-cross_14.2.bb => gcc-cross_14.3.bb}  |   0
>   ...-crosssdk_14.2.bb => gcc-crosssdk_14.3.bb} |   0
>   ...cc-runtime_14.2.bb => gcc-runtime_14.3.bb} |   0
>   ...itizers_14.2.bb => gcc-sanitizers_14.3.bb} |   0
>   ...{gcc-source_14.2.bb => gcc-source_14.3.bb} |   0
>   ...m-Fix-LDRD-register-overlap-PR117675.patch | 148 -----
>   ...ix-c-tweak-for-Wrange-loop-construct.patch | 114 ----
>   ...ch-to-fix-data-relocation-to-ENDBR-s.patch | 447 --------------
>   ...-incorrect-preprocessor-line-numbers.patch | 475 ---------------
>   ...4fffe3fc82a710bea66ad651720d71c938b8.patch | 549 ------------------
>   .../gcc/{gcc_14.2.bb => gcc_14.3.bb}          |   0
>   ...initial_14.2.bb => libgcc-initial_14.3.bb} |   0
>   .../gcc/{libgcc_14.2.bb => libgcc_14.3.bb}    |   0
>   ...ibgfortran_14.2.bb => libgfortran_14.3.bb} |   0
>   16 files changed, 3 insertions(+), 1741 deletions(-)
>   rename meta/recipes-devtools/gcc/{gcc-14.2.inc => gcc-14.3.inc} (90%)
>   rename meta/recipes-devtools/gcc/{gcc-cross-canadian_14.2.bb => gcc-cross-canadian_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{gcc-cross_14.2.bb => gcc-cross_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{gcc-crosssdk_14.2.bb => gcc-crosssdk_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{gcc-runtime_14.2.bb => gcc-runtime_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{gcc-sanitizers_14.2.bb => gcc-sanitizers_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{gcc-source_14.2.bb => gcc-source_14.3.bb} (100%)
>   delete mode 100644 meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch
>   delete mode 100644 meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
>   delete mode 100644 meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
>   delete mode 100644 meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch
>   delete mode 100644 meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
>   rename meta/recipes-devtools/gcc/{gcc_14.2.bb => gcc_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{libgcc-initial_14.2.bb => libgcc-initial_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{libgcc_14.2.bb => libgcc_14.3.bb} (100%)
>   rename meta/recipes-devtools/gcc/{libgfortran_14.2.bb => libgfortran_14.3.bb} (100%)
>
> diff --git a/meta/recipes-devtools/gcc/gcc-14.2.inc b/meta/recipes-devtools/gcc/gcc-14.3.inc
> similarity index 90%
> rename from meta/recipes-devtools/gcc/gcc-14.2.inc
> rename to meta/recipes-devtools/gcc/gcc-14.3.inc
> index fa9003f604..ca2f2e2a13 100644
> --- a/meta/recipes-devtools/gcc/gcc-14.2.inc
> +++ b/meta/recipes-devtools/gcc/gcc-14.3.inc
> @@ -2,11 +2,11 @@ require gcc-common.inc
>   
>   # Third digit in PV should be incremented after a minor release
>   
> -PV = "14.2.0"
> +PV = "14.3.0"
>   
>   # BINV should be incremented to a revision after a minor gcc release
>   
> -BINV = "14.2.0"
> +BINV = "14.3.0"
>   
>   FILESEXTRAPATHS =. "${FILE_DIRNAME}/gcc:${FILE_DIRNAME}/gcc/backport:"
>   
> @@ -40,7 +40,7 @@ LIC_FILES_CHKSUM = "\
>   RELEASE ?= "${PV}"
>   BASEURI ?= "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.xz"
>   SOURCEDIR ?= "gcc-${PV}"
> -SRC_URI[sha256sum] = "a7b39bc69cbf9e25826c5a60ab26477001f7c08d85cec04bc0e29cabed6f3cc9"
> +SRC_URI[sha256sum] = "e0dc77297625631ac8e50fa92fffefe899a4eb702592da5c32ef04e2293aca3a"
>   
>   SRC_URI = "${BASEURI} \
>              file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \
> @@ -68,11 +68,6 @@ SRC_URI = "${BASEURI} \
>              file://0023-Fix-install-path-of-linux64.h.patch \
>              file://0024-Avoid-hardcoded-build-paths-into-ppc-libgcc.patch \
>              file://0025-gcc-testsuite-tweaks-for-mips-OE.patch \
> -	   file://0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch \
> -           file://0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch \
> -           file://gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch \
> -           file://0001-arm-Fix-LDRD-register-overlap-PR117675.patch \
> -           file://0028-fix-incorrect-preprocessor-line-numbers.patch \
>   "
>   
>   S = "${TMPDIR}/work-shared/gcc-${PV}-${PR}/${SOURCEDIR}"
> diff --git a/meta/recipes-devtools/gcc/gcc-cross-canadian_14.2.bb b/meta/recipes-devtools/gcc/gcc-cross-canadian_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc-cross-canadian_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc-cross-canadian_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/gcc-cross_14.2.bb b/meta/recipes-devtools/gcc/gcc-cross_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc-cross_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc-cross_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/gcc-crosssdk_14.2.bb b/meta/recipes-devtools/gcc/gcc-crosssdk_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc-crosssdk_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc-crosssdk_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/gcc-runtime_14.2.bb b/meta/recipes-devtools/gcc/gcc-runtime_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc-runtime_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc-runtime_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/gcc-sanitizers_14.2.bb b/meta/recipes-devtools/gcc/gcc-sanitizers_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc-sanitizers_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc-sanitizers_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/gcc-source_14.2.bb b/meta/recipes-devtools/gcc/gcc-source_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc-source_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc-source_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch b/meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch
> deleted file mode 100644
> index e3d887a135..0000000000
> --- a/meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch
> +++ /dev/null
> @@ -1,148 +0,0 @@
> -From 9366c328518766d896155388726055624716c0af Mon Sep 17 00:00:00 2001
> -From: Wilco Dijkstra <wilco.dijkstra@arm.com>
> -Date: Tue, 10 Dec 2024 14:22:48 +0000
> -Subject: [PATCH] arm: Fix LDRD register overlap [PR117675]
> -
> -The register indexed variants of LDRD have complex register overlap constraints
> -which makes them hard to use without using output_move_double (which can't be
> -used for atomics as it doesn't guarantee to emit atomic LDRD/STRD when required).
> -Add a new predicate and constraint for plain LDRD/STRD with base or base+imm.
> -This blocks register indexing and fixes PR117675.
> -
> -gcc:
> -	PR target/117675
> -	* config/arm/arm.cc (arm_ldrd_legitimate_address): New function.
> -	* config/arm/arm-protos.h (arm_ldrd_legitimate_address): New prototype.
> -	* config/arm/constraints.md: Add new Uo constraint.
> -	* config/arm/predicates.md (arm_ldrd_memory_operand): Add new predicate.
> -	* config/arm/sync.md (arm_atomic_loaddi2_ldrd): Use
> -	arm_ldrd_memory_operand and Uo.
> -
> -gcc/testsuite:
> -	PR target/117675
> -	* gcc.target/arm/pr117675.c: Add new test.
> -
> -(cherry picked from commit 21fbfae2e55e1a153820acc6fbd922e66f67e65b)
> -
> -Upstream-Status: Backport [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117675]
> ----
> - gcc/config/arm/arm-protos.h             |  1 +
> - gcc/config/arm/arm.cc                   | 24 ++++++++++++++++++++++++
> - gcc/config/arm/constraints.md           |  8 +++++++-
> - gcc/config/arm/predicates.md            |  4 ++++
> - gcc/config/arm/sync.md                  |  2 +-
> - gcc/testsuite/gcc.target/arm/pr117675.c | 17 +++++++++++++++++
> - 6 files changed, 54 insertions(+), 2 deletions(-)
> - create mode 100644 gcc/testsuite/gcc.target/arm/pr117675.c
> -
> ---- a/gcc/config/arm/arm-protos.h
> -+++ b/gcc/config/arm/arm-protos.h
> -@@ -202,6 +202,7 @@ extern rtx arm_load_tp (rtx);
> - extern bool arm_coproc_builtin_available (enum unspecv);
> - extern bool arm_coproc_ldc_stc_legitimate_address (rtx);
> - extern rtx arm_stack_protect_tls_canary_mem (bool);
> -+extern bool arm_ldrd_legitimate_address (rtx);
> -
> -
> - #if defined TREE_CODE
> ---- a/gcc/config/arm/arm.cc
> -+++ b/gcc/config/arm/arm.cc
> -@@ -34523,6 +34523,30 @@ arm_coproc_ldc_stc_legitimate_address (r
> -   return false;
> - }
> -
> -+/* Return true if OP is a valid memory operand for LDRD/STRD without any
> -+   register overlap restrictions.  Allow [base] and [base, imm] for now.  */
> -+bool
> -+arm_ldrd_legitimate_address (rtx op)
> -+{
> -+  if (!MEM_P (op))
> -+    return false;
> -+
> -+  op = XEXP (op, 0);
> -+  if (REG_P (op))
> -+    return true;
> -+
> -+  if (GET_CODE (op) != PLUS)
> -+    return false;
> -+  if (!REG_P (XEXP (op, 0)) || !CONST_INT_P (XEXP (op, 1)))
> -+    return false;
> -+
> -+  HOST_WIDE_INT val = INTVAL (XEXP (op, 1));
> -+
> -+  if (TARGET_ARM)
> -+    return IN_RANGE (val, -255, 255);
> -+  return IN_RANGE (val, -1020, 1020) && (val & 3) == 0;
> -+}
> -+
> - /* Return the diagnostic message string if conversion from FROMTYPE to
> -    TOTYPE is not allowed, NULL otherwise.  */
> -
> ---- a/gcc/config/arm/constraints.md
> -+++ b/gcc/config/arm/constraints.md
> -@@ -39,7 +39,7 @@
> - ;; in all states: Pg
> -
> - ;; The following memory constraints have been used:
> --;; in ARM/Thumb-2 state: Uh, Ut, Uv, Uy, Un, Um, Us, Up, Uf, Ux, Ul
> -+;; in ARM/Thumb-2 state: Uh, Ut, Uv, Uy, Un, Um, Us, Uo, Up, Uf, Ux, Ul, Uz
> - ;; in ARM state: Uq
> - ;; in Thumb state: Uu, Uw
> - ;; in all states: Q
> -@@ -585,6 +585,12 @@
> -  (and (match_code "mem")
> -       (match_test "arm_coproc_ldc_stc_legitimate_address (op)")))
> -
> -+(define_memory_constraint "Uo"
> -+ "@internal
> -+  A memory operand for Arm/Thumb-2 LDRD/STRD"
> -+ (and (match_code "mem")
> -+      (match_test "arm_ldrd_legitimate_address (op)")))
> -+
> - ;; We used to have constraint letters for S and R in ARM state, but
> - ;; all uses of these now appear to have been removed.
> -
> ---- a/gcc/config/arm/predicates.md
> -+++ b/gcc/config/arm/predicates.md
> -@@ -849,6 +849,10 @@
> -   (and (match_operand 0 "memory_operand")
> -        (match_code "reg" "0")))
> -
> -+;; True if the operand is memory reference suitable for a ldrd/strd.
> -+(define_predicate "arm_ldrd_memory_operand"
> -+  (match_test "arm_ldrd_legitimate_address (op)"))
> -+
> - ;; Predicates for parallel expanders based on mode.
> - (define_special_predicate "vect_par_constant_high"
> -   (match_code "parallel")
> ---- a/gcc/config/arm/sync.md
> -+++ b/gcc/config/arm/sync.md
> -@@ -161,7 +161,7 @@
> - (define_insn "arm_atomic_loaddi2_ldrd"
> -   [(set (match_operand:DI 0 "register_operand" "=r")
> - 	(unspec_volatile:DI
> --	  [(match_operand:DI 1 "memory_operand" "m")]
> -+	  [(match_operand:DI 1 "arm_ldrd_memory_operand" "Uo")]
> - 	    VUNSPEC_LDRD_ATOMIC))]
> -   "ARM_DOUBLEWORD_ALIGN && TARGET_HAVE_LPAE"
> -   "ldrd\t%0, %H0, %1"
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.target/arm/pr117675.c
> -@@ -0,0 +1,17 @@
> -+/* { dg-do compile } */
> -+/* { dg-options "-O2 -marm" } */
> -+/* { dg-require-effective-target arm_arch_v7ve_neon_ok } */
> -+/* { dg-add-options arm_arch_v7ve_neon } */
> -+/* { dg-final { check-function-bodies "**" "" "" } } */
> -+
> -+/*
> -+** f1:
> -+**	add	r0, r0, r1
> -+**	ldrd	r0, r1, \[r0\]
> -+**	bx	lr
> -+*/
> -+long long f1 (char *p, int i)
> -+{
> -+  return __atomic_load_n ((long long *)(p + i), __ATOMIC_RELAXED);
> -+}
> -+
> diff --git a/meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch b/meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
> deleted file mode 100644
> index c9bc863eea..0000000000
> --- a/meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
> +++ /dev/null
> @@ -1,114 +0,0 @@
> -From 05106fea707f010779369c5d6e89787953d2976f Mon Sep 17 00:00:00 2001
> -From: Sunil Dora <sunilkumar.dora@windriver.com>
> -Date: Wed, 11 Dec 2024 10:04:56 -0800
> -Subject: [PATCH] gcc: Fix c++: tweak for Wrange-loop-construct
> -
> -This commit updates the warning to use a check for "trivially constructible" instead of
> -"trivially copyable." The original check was incorrect, as "trivially copyable" only applies
> -to types that can be copied trivially, whereas "trivially constructible" is the correct check
> -for types that can be trivially default-constructed.
> -
> -This change ensures the warning is more accurate and aligns with the proper type traits.
> -
> -LLVM accepted a similar fix:
> -https://github.com/llvm/llvm-project/issues/47355
> -
> -PR c++/116731 [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116731]
> -
> -Upstream-Status: Backport [https://gcc.gnu.org/g:6ac4e2f4b2ca9980670e7d3815a9140730df1005]
> -
> -Signed-off-by: Marek Polacek <polacek@redhat.com>
> -Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
> ----
> - gcc/cp/parser.cc                              |  8 ++-
> - .../g++.dg/warn/Wrange-loop-construct3.C      | 57 +++++++++++++++++++
> - 2 files changed, 62 insertions(+), 3 deletions(-)
> - create mode 100644 gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C
> -
> -diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> -index 7e81c1010..8206489a2 100644
> ---- a/gcc/cp/parser.cc
> -+++ b/gcc/cp/parser.cc
> -@@ -14301,11 +14301,13 @@ warn_for_range_copy (tree decl, tree expr)
> -   else if (!CP_TYPE_CONST_P (type))
> -     return;
> -
> --  /* Since small trivially copyable types are cheap to copy, we suppress the
> --     warning for them.  64B is a common size of a cache line.  */
> -+  /* Since small trivially constructible types are cheap to construct, we
> -+     suppress the warning for them.  64B is a common size of a cache line.  */
> -+  tree vec = make_tree_vec (1);
> -+  TREE_VEC_ELT (vec, 0) = TREE_TYPE (expr);
> -   if (TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
> -       || (tree_to_uhwi (TYPE_SIZE_UNIT (type)) <= 64
> --	  && trivially_copyable_p (type)))
> -+	  && is_trivially_xible (INIT_EXPR, type, vec)))
> -     return;
> -
> -   /* If we can initialize a reference directly, suggest that to avoid the
> -diff --git a/gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C b/gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C
> -new file mode 100644
> -index 000000000..3d9d0c908
> ---- /dev/null
> -+++ b/gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C
> -@@ -0,0 +1,57 @@
> -+// PR c++/116731
> -+// { dg-do compile { target c++11 } }
> -+// { dg-options "-Wrange-loop-construct" }
> -+
> -+void
> -+f0 ()
> -+{
> -+  struct S {
> -+    char a[64];
> -+    S& operator=(const S&) { return *this; };
> -+  };
> -+
> -+  S arr[8];
> -+  for (const auto r : arr)
> -+    (void) r;
> -+}
> -+
> -+void
> -+f1 ()
> -+{
> -+  struct S {
> -+    char a[65];
> -+    S& operator=(const S&) { return *this; };
> -+  };
> -+
> -+  S arr[8];
> -+  for (const auto r : arr) // { dg-warning "creates a copy" }
> -+    (void) r;
> -+}
> -+
> -+void
> -+f2 ()
> -+{
> -+  struct S {
> -+    char a[64];
> -+    S& operator=(const S&) { return *this; };
> -+    ~S() { }
> -+  };
> -+
> -+  S arr[8];
> -+  for (const auto r : arr) // { dg-warning "creates a copy" }
> -+    (void) r;
> -+}
> -+
> -+void
> -+f3 ()
> -+{
> -+  struct S {
> -+    char a[65];
> -+    S& operator=(const S&) { return *this; };
> -+    ~S() { }
> -+  };
> -+
> -+  S arr[8];
> -+  for (const auto r : arr) // { dg-warning "creates a copy" }
> -+    (void) r;
> -+}
> ---
> -2.43.0
> -
> diff --git a/meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch b/meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
> deleted file mode 100644
> index 5bede60816..0000000000
> --- a/meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
> +++ /dev/null
> @@ -1,447 +0,0 @@
> -From 4e7735a8d87559bbddfe3a985786996e22241f8d Mon Sep 17 00:00:00 2001
> -From: liuhongt <hongtao.liu@intel.com>
> -Date: Mon, 12 Aug 2024 14:35:31 +0800
> -Subject: [PATCH] Move ix86_align_loops into a separate pass and insert the
> - pass after pass_endbr_and_patchable_area.
> -
> -gcc/ChangeLog:
> -
> -	PR target/116174
> -	* config/i386/i386.cc (ix86_align_loops): Move this to ..
> -	* config/i386/i386-features.cc (ix86_align_loops): .. here.
> -	(class pass_align_tight_loops): New class.
> -	(make_pass_align_tight_loops): New function.
> -	* config/i386/i386-passes.def: Insert pass_align_tight_loops
> -	after pass_insert_endbr_and_patchable_area.
> -	* config/i386/i386-protos.h (make_pass_align_tight_loops): New
> -	declare.
> -
> -gcc/testsuite/ChangeLog:
> -
> -	* gcc.target/i386/pr116174.c: New test.
> -
> -(cherry picked from commit c3c83d22d212a35cb1bfb8727477819463f0dcd8)
> -
> -Upstream-Status: Backport [https://gcc.gnu.org/git/?p=gcc.git;a=patch;h=4e7735a8d87559bbddfe3a985786996e22241f8d]
> -
> -Signed-off-by: Bin Lan <bin.lan.cn@windriver.com>
> ----
> - gcc/config/i386/i386-features.cc         | 191 +++++++++++++++++++++++
> - gcc/config/i386/i386-passes.def          |   3 +
> - gcc/config/i386/i386-protos.h            |   1 +
> - gcc/config/i386/i386.cc                  | 146 -----------------
> - gcc/testsuite/gcc.target/i386/pr116174.c |  12 ++
> - 5 files changed, 207 insertions(+), 146 deletions(-)
> - create mode 100644 gcc/testsuite/gcc.target/i386/pr116174.c
> -
> -diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
> -index e3e004d55267..7de19d423637 100644
> ---- a/gcc/config/i386/i386-features.cc
> -+++ b/gcc/config/i386/i386-features.cc
> -@@ -3253,6 +3253,197 @@ make_pass_remove_partial_avx_dependency (gcc::context *ctxt)
> -   return new pass_remove_partial_avx_dependency (ctxt);
> - }
> -
> -+/* When a hot loop can be fit into one cacheline,
> -+   force align the loop without considering the max skip.  */
> -+static void
> -+ix86_align_loops ()
> -+{
> -+  basic_block bb;
> -+
> -+  /* Don't do this when we don't know cache line size.  */
> -+  if (ix86_cost->prefetch_block == 0)
> -+    return;
> -+
> -+  loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
> -+  profile_count count_threshold = cfun->cfg->count_max / param_align_threshold;
> -+  FOR_EACH_BB_FN (bb, cfun)
> -+    {
> -+      rtx_insn *label = BB_HEAD (bb);
> -+      bool has_fallthru = 0;
> -+      edge e;
> -+      edge_iterator ei;
> -+
> -+      if (!LABEL_P (label))
> -+	continue;
> -+
> -+      profile_count fallthru_count = profile_count::zero ();
> -+      profile_count branch_count = profile_count::zero ();
> -+
> -+      FOR_EACH_EDGE (e, ei, bb->preds)
> -+	{
> -+	  if (e->flags & EDGE_FALLTHRU)
> -+	    has_fallthru = 1, fallthru_count += e->count ();
> -+	  else
> -+	    branch_count += e->count ();
> -+	}
> -+
> -+      if (!fallthru_count.initialized_p () || !branch_count.initialized_p ())
> -+	continue;
> -+
> -+      if (bb->loop_father
> -+	  && bb->loop_father->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
> -+	  && (has_fallthru
> -+	      ? (!(single_succ_p (bb)
> -+		   && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun))
> -+		 && optimize_bb_for_speed_p (bb)
> -+		 && branch_count + fallthru_count > count_threshold
> -+		 && (branch_count > fallthru_count * param_align_loop_iterations))
> -+	      /* In case there'no fallthru for the loop.
> -+		 Nops inserted won't be executed.  */
> -+	      : (branch_count > count_threshold
> -+		 || (bb->count > bb->prev_bb->count * 10
> -+		     && (bb->prev_bb->count
> -+			 <= ENTRY_BLOCK_PTR_FOR_FN (cfun)->count / 2)))))
> -+	{
> -+	  rtx_insn* insn, *end_insn;
> -+	  HOST_WIDE_INT size = 0;
> -+	  bool padding_p = true;
> -+	  basic_block tbb = bb;
> -+	  unsigned cond_branch_num = 0;
> -+	  bool detect_tight_loop_p = false;
> -+
> -+	  for (unsigned int i = 0; i != bb->loop_father->num_nodes;
> -+	       i++, tbb = tbb->next_bb)
> -+	    {
> -+	      /* Only handle continuous cfg layout. */
> -+	      if (bb->loop_father != tbb->loop_father)
> -+		{
> -+		  padding_p = false;
> -+		  break;
> -+		}
> -+
> -+	      FOR_BB_INSNS (tbb, insn)
> -+		{
> -+		  if (!NONDEBUG_INSN_P (insn))
> -+		    continue;
> -+		  size += ix86_min_insn_size (insn);
> -+
> -+		  /* We don't know size of inline asm.
> -+		     Don't align loop for call.  */
> -+		  if (asm_noperands (PATTERN (insn)) >= 0
> -+		      || CALL_P (insn))
> -+		    {
> -+		      size = -1;
> -+		      break;
> -+		    }
> -+		}
> -+
> -+	      if (size == -1 || size > ix86_cost->prefetch_block)
> -+		{
> -+		  padding_p = false;
> -+		  break;
> -+		}
> -+
> -+	      FOR_EACH_EDGE (e, ei, tbb->succs)
> -+		{
> -+		  /* It could be part of the loop.  */
> -+		  if (e->dest == bb)
> -+		    {
> -+		      detect_tight_loop_p = true;
> -+		      break;
> -+		    }
> -+		}
> -+
> -+	      if (detect_tight_loop_p)
> -+		break;
> -+
> -+	      end_insn = BB_END (tbb);
> -+	      if (JUMP_P (end_insn))
> -+		{
> -+		  /* For decoded icache:
> -+		     1. Up to two branches are allowed per Way.
> -+		     2. A non-conditional branch is the last micro-op in a Way.
> -+		  */
> -+		  if (onlyjump_p (end_insn)
> -+		      && (any_uncondjump_p (end_insn)
> -+			  || single_succ_p (tbb)))
> -+		    {
> -+		      padding_p = false;
> -+		      break;
> -+		    }
> -+		  else if (++cond_branch_num >= 2)
> -+		    {
> -+		      padding_p = false;
> -+		      break;
> -+		    }
> -+		}
> -+
> -+	    }
> -+
> -+	  if (padding_p && detect_tight_loop_p)
> -+	    {
> -+	      emit_insn_before (gen_max_skip_align (GEN_INT (ceil_log2 (size)),
> -+						    GEN_INT (0)), label);
> -+	      /* End of function.  */
> -+	      if (!tbb || tbb == EXIT_BLOCK_PTR_FOR_FN (cfun))
> -+		break;
> -+	      /* Skip bb which already fits into one cacheline.  */
> -+	      bb = tbb;
> -+	    }
> -+	}
> -+    }
> -+
> -+  loop_optimizer_finalize ();
> -+  free_dominance_info (CDI_DOMINATORS);
> -+}
> -+
> -+namespace {
> -+
> -+const pass_data pass_data_align_tight_loops =
> -+{
> -+  RTL_PASS, /* type */
> -+  "align_tight_loops", /* name */
> -+  OPTGROUP_NONE, /* optinfo_flags */
> -+  TV_MACH_DEP, /* tv_id */
> -+  0, /* properties_required */
> -+  0, /* properties_provided */
> -+  0, /* properties_destroyed */
> -+  0, /* todo_flags_start */
> -+  0, /* todo_flags_finish */
> -+};
> -+
> -+class pass_align_tight_loops : public rtl_opt_pass
> -+{
> -+public:
> -+  pass_align_tight_loops (gcc::context *ctxt)
> -+    : rtl_opt_pass (pass_data_align_tight_loops, ctxt)
> -+  {}
> -+
> -+  /* opt_pass methods: */
> -+  bool gate (function *) final override
> -+    {
> -+      return optimize && optimize_function_for_speed_p (cfun);
> -+    }
> -+
> -+  unsigned int execute (function *) final override
> -+    {
> -+      timevar_push (TV_MACH_DEP);
> -+#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
> -+      ix86_align_loops ();
> -+#endif
> -+      timevar_pop (TV_MACH_DEP);
> -+      return 0;
> -+    }
> -+}; // class pass_align_tight_loops
> -+
> -+} // anon namespace
> -+
> -+rtl_opt_pass *
> -+make_pass_align_tight_loops (gcc::context *ctxt)
> -+{
> -+  return new pass_align_tight_loops (ctxt);
> -+}
> -+
> - /* This compares the priority of target features in function DECL1
> -    and DECL2.  It returns positive value if DECL1 is higher priority,
> -    negative value if DECL2 is higher priority and 0 if they are the
> -diff --git a/gcc/config/i386/i386-passes.def b/gcc/config/i386/i386-passes.def
> -index 7d96766f7b96..e500f15c9971 100644
> ---- a/gcc/config/i386/i386-passes.def
> -+++ b/gcc/config/i386/i386-passes.def
> -@@ -31,5 +31,8 @@ along with GCC; see the file COPYING3.  If not see
> -   INSERT_PASS_BEFORE (pass_cse2, 1, pass_stv, true /* timode_p */);
> -
> -   INSERT_PASS_BEFORE (pass_shorten_branches, 1, pass_insert_endbr_and_patchable_area);
> -+  /* pass_align_tight_loops must be after pass_insert_endbr_and_patchable_area.
> -+     PR116174.  */
> -+  INSERT_PASS_BEFORE (pass_shorten_branches, 1, pass_align_tight_loops);
> -
> -   INSERT_PASS_AFTER (pass_combine, 1, pass_remove_partial_avx_dependency);
> -diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
> -index 46214a63974d..36c7b1aed42b 100644
> ---- a/gcc/config/i386/i386-protos.h
> -+++ b/gcc/config/i386/i386-protos.h
> -@@ -419,6 +419,7 @@ extern rtl_opt_pass *make_pass_insert_endbr_and_patchable_area
> -   (gcc::context *);
> - extern rtl_opt_pass *make_pass_remove_partial_avx_dependency
> -   (gcc::context *);
> -+extern rtl_opt_pass *make_pass_align_tight_loops (gcc::context *);
> -
> - extern bool ix86_has_no_direct_extern_access;
> -
> -diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
> -index 6f89891d3cb5..288c69467d62 100644
> ---- a/gcc/config/i386/i386.cc
> -+++ b/gcc/config/i386/i386.cc
> -@@ -23444,150 +23444,6 @@ ix86_split_stlf_stall_load ()
> -     }
> - }
> -
> --/* When a hot loop can be fit into one cacheline,
> --   force align the loop without considering the max skip.  */
> --static void
> --ix86_align_loops ()
> --{
> --  basic_block bb;
> --
> --  /* Don't do this when we don't know cache line size.  */
> --  if (ix86_cost->prefetch_block == 0)
> --    return;
> --
> --  loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
> --  profile_count count_threshold = cfun->cfg->count_max / param_align_threshold;
> --  FOR_EACH_BB_FN (bb, cfun)
> --    {
> --      rtx_insn *label = BB_HEAD (bb);
> --      bool has_fallthru = 0;
> --      edge e;
> --      edge_iterator ei;
> --
> --      if (!LABEL_P (label))
> --	continue;
> --
> --      profile_count fallthru_count = profile_count::zero ();
> --      profile_count branch_count = profile_count::zero ();
> --
> --      FOR_EACH_EDGE (e, ei, bb->preds)
> --	{
> --	  if (e->flags & EDGE_FALLTHRU)
> --	    has_fallthru = 1, fallthru_count += e->count ();
> --	  else
> --	    branch_count += e->count ();
> --	}
> --
> --      if (!fallthru_count.initialized_p () || !branch_count.initialized_p ())
> --	continue;
> --
> --      if (bb->loop_father
> --	  && bb->loop_father->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
> --	  && (has_fallthru
> --	      ? (!(single_succ_p (bb)
> --		   && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun))
> --		 && optimize_bb_for_speed_p (bb)
> --		 && branch_count + fallthru_count > count_threshold
> --		 && (branch_count > fallthru_count * param_align_loop_iterations))
> --	      /* In case there'no fallthru for the loop.
> --		 Nops inserted won't be executed.  */
> --	      : (branch_count > count_threshold
> --		 || (bb->count > bb->prev_bb->count * 10
> --		     && (bb->prev_bb->count
> --			 <= ENTRY_BLOCK_PTR_FOR_FN (cfun)->count / 2)))))
> --	{
> --	  rtx_insn* insn, *end_insn;
> --	  HOST_WIDE_INT size = 0;
> --	  bool padding_p = true;
> --	  basic_block tbb = bb;
> --	  unsigned cond_branch_num = 0;
> --	  bool detect_tight_loop_p = false;
> --
> --	  for (unsigned int i = 0; i != bb->loop_father->num_nodes;
> --	       i++, tbb = tbb->next_bb)
> --	    {
> --	      /* Only handle continuous cfg layout. */
> --	      if (bb->loop_father != tbb->loop_father)
> --		{
> --		  padding_p = false;
> --		  break;
> --		}
> --
> --	      FOR_BB_INSNS (tbb, insn)
> --		{
> --		  if (!NONDEBUG_INSN_P (insn))
> --		    continue;
> --		  size += ix86_min_insn_size (insn);
> --
> --		  /* We don't know size of inline asm.
> --		     Don't align loop for call.  */
> --		  if (asm_noperands (PATTERN (insn)) >= 0
> --		      || CALL_P (insn))
> --		    {
> --		      size = -1;
> --		      break;
> --		    }
> --		}
> --
> --	      if (size == -1 || size > ix86_cost->prefetch_block)
> --		{
> --		  padding_p = false;
> --		  break;
> --		}
> --
> --	      FOR_EACH_EDGE (e, ei, tbb->succs)
> --		{
> --		  /* It could be part of the loop.  */
> --		  if (e->dest == bb)
> --		    {
> --		      detect_tight_loop_p = true;
> --		      break;
> --		    }
> --		}
> --
> --	      if (detect_tight_loop_p)
> --		break;
> --
> --	      end_insn = BB_END (tbb);
> --	      if (JUMP_P (end_insn))
> --		{
> --		  /* For decoded icache:
> --		     1. Up to two branches are allowed per Way.
> --		     2. A non-conditional branch is the last micro-op in a Way.
> --		  */
> --		  if (onlyjump_p (end_insn)
> --		      && (any_uncondjump_p (end_insn)
> --			  || single_succ_p (tbb)))
> --		    {
> --		      padding_p = false;
> --		      break;
> --		    }
> --		  else if (++cond_branch_num >= 2)
> --		    {
> --		      padding_p = false;
> --		      break;
> --		    }
> --		}
> --
> --	    }
> --
> --	  if (padding_p && detect_tight_loop_p)
> --	    {
> --	      emit_insn_before (gen_max_skip_align (GEN_INT (ceil_log2 (size)),
> --						    GEN_INT (0)), label);
> --	      /* End of function.  */
> --	      if (!tbb || tbb == EXIT_BLOCK_PTR_FOR_FN (cfun))
> --		break;
> --	      /* Skip bb which already fits into one cacheline.  */
> --	      bb = tbb;
> --	    }
> --	}
> --    }
> --
> --  loop_optimizer_finalize ();
> --  free_dominance_info (CDI_DOMINATORS);
> --}
> --
> - /* Implement machine specific optimizations.  We implement padding of returns
> -    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
> - static void
> -@@ -23611,8 +23467,6 @@ ix86_reorg (void)
> - #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
> -       if (TARGET_FOUR_JUMP_LIMIT)
> - 	ix86_avoid_jump_mispredicts ();
> --
> --      ix86_align_loops ();
> - #endif
> -     }
> - }
> -diff --git a/gcc/testsuite/gcc.target/i386/pr116174.c b/gcc/testsuite/gcc.target/i386/pr116174.c
> -new file mode 100644
> -index 000000000000..8877d0b51af1
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.target/i386/pr116174.c
> -@@ -0,0 +1,12 @@
> -+/* { dg-do compile { target *-*-linux* } } */
> -+/* { dg-options "-O2 -fcf-protection=branch" } */
> -+
> -+char *
> -+foo (char *dest, const char *src)
> -+{
> -+  while ((*dest++ = *src++) != '\0')
> -+    /* nothing */;
> -+  return --dest;
> -+}
> -+
> -+/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n" } } */
> ---
> -2.43.5
> diff --git a/meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch b/meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch
> deleted file mode 100644
> index 5185236a3d..0000000000
> --- a/meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch
> +++ /dev/null
> @@ -1,475 +0,0 @@
> -From 8cbe033a8a88fe6437cc5d343ae0ddf8dd3455c8 Mon Sep 17 00:00:00 2001
> -From: Jakub Jelinek <jakub@redhat.com>
> -Date: Thu, 8 May 2025 11:14:24 +0200
> -Subject: libcpp: Further fixes for incorrect line numbers in large files
> - [PR120061]
> -MIME-Version: 1.0
> -Content-Type: text/plain; charset=UTF-8
> -Content-Transfer-Encoding: 8bit
> -
> -The backport of the PR108900 fix to 14 branch broke building chromium
> -because static_assert (__LINE__ == expected_line_number, ""); now triggers
> -as the __LINE__ values are off by one.
> -This isn't the case on the trunk and 15 branch because we've switched
> -to 64-bit location_t and so one actually needs far longer header files
> -to trigger it.
> -https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c11
> -https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c12
> -contain (large) testcases in patch form which show on the 14 branch
> -that the first one used to fail before the PR108900 backport and now
> -works correctly, while the second one attempts to match the chromium
> -behavior and it used to pass before the PR108900 backport and now it
> -FAILs.
> -The two testcases show rare problematic cases, because
> -do_include_common -> parse_include -> check_eol -> check_eol_1 ->
> -cpp_get_token_1 -> _cpp_lex_token -> _cpp_lex_direct -> linemap_line_start
> -triggers there
> -      /* Allocate the new line_map.  However, if the current map only has a
> -         single line we can sometimes just increase its column_bits instead. */
> -      if (line_delta < 0
> -          || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
> -          || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
> -          || ( /* We can't reuse the map if the line offset is sufficiently
> -                  large to cause overflow when computing location_t values.  */
> -              (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
> -              >= (((uint64_t) 1)
> -                  << (CHAR_BIT * sizeof (linenum_type) - column_bits)))
> -          || range_bits < map->m_range_bits)
> -        map = linemap_check_ordinary
> -                (const_cast <line_map *>
> -                  (linemap_add (set, LC_RENAME,
> -                                ORDINARY_MAP_IN_SYSTEM_HEADER_P (map),
> -                                ORDINARY_MAP_FILE_NAME (map),
> -                                to_line)));
> -and so creates a new ordinary map on the line right after the
> -(problematic) #include line.
> -Now, in the spot that r14-11679-g8a884140c2bcb7 patched,
> -pfile->line_table->highest_location in all 3 tests (also
> -https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c13
> -) is before the decrement the start of the line after the #include line and so
> -the decrement is really desirable in that case to put highest_location
> -[jakub@tucnak gcc-15]$ git log -1 --format=%B r15-9638-gbfcb5da69a41f7a5e41faab39b763d9d7c8bd2ea | cat
> -libcpp: Further fixes for incorrect line numbers in large files [PR120061]
> -
> -The backport of the PR108900 fix to 14 branch broke building chromium
> -because static_assert (__LINE__ == expected_line_number, ""); now triggers
> -as the __LINE__ values are off by one.
> -This isn't the case on the trunk and 15 branch because we've switched
> -to 64-bit location_t and so one actually needs far longer header files
> -to trigger it.
> -https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c11
> -https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c12
> -contain (large) testcases in patch form which show on the 14 branch
> -that the first one used to fail before the PR108900 backport and now
> -works correctly, while the second one attempts to match the chromium
> -behavior and it used to pass before the PR108900 backport and now it
> -FAILs.
> -The two testcases show rare problematic cases, because
> -do_include_common -> parse_include -> check_eol -> check_eol_1 ->
> -cpp_get_token_1 -> _cpp_lex_token -> _cpp_lex_direct -> linemap_line_start
> -triggers there
> -      /* Allocate the new line_map.  However, if the current map only has a
> -         single line we can sometimes just increase its column_bits instead. */
> -      if (line_delta < 0
> -          || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
> -          || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
> -          || ( /* We can't reuse the map if the line offset is sufficiently
> -                  large to cause overflow when computing location_t values.  */
> -              (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
> -              >= (((uint64_t) 1)
> -                  << (CHAR_BIT * sizeof (linenum_type) - column_bits)))
> -          || range_bits < map->m_range_bits)
> -        map = linemap_check_ordinary
> -                (const_cast <line_map *>
> -                  (linemap_add (set, LC_RENAME,
> -                                ORDINARY_MAP_IN_SYSTEM_HEADER_P (map),
> -                                ORDINARY_MAP_FILE_NAME (map),
> -                                to_line)));
> -and so creates a new ordinary map on the line right after the
> -(problematic) #include line.
> -Now, in the spot that r14-11679-g8a884140c2bcb7 patched,
> -pfile->line_table->highest_location in all 3 tests (also
> -https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c13
> -) is before the decrement the start of the line after the #include line and so
> -the decrement is really desirable in that case to put highest_location
> -somewhere on the line where the #include actually is.
> -But at the same time it is also undesirable, because if we do decrement it,
> -then linemap_add LC_ENTER called from _cpp_do_file_change will then
> -  /* Generate a start_location above the current highest_location.
> -     If possible, make the low range bits be zero.  */
> -  location_t start_location = set->highest_location + 1;
> -  unsigned range_bits = 0;
> -  if (start_location < LINE_MAP_MAX_LOCATION_WITH_COLS)
> -    range_bits = set->default_range_bits;
> -  start_location += (1 << range_bits) - 1;
> -  start_location &=  ~((1 << range_bits) - 1);
> -
> -  linemap_assert (!LINEMAPS_ORDINARY_USED (set)
> -                  || (start_location
> -                      >= MAP_START_LOCATION (LINEMAPS_LAST_ORDINARY_MAP (set))));
> -and we can end up with the new LC_ENTER ordinary map having the same
> -start_location as the preceding LC_RENAME one.
> -Next thing that happens is computation of included_from:
> -  if (reason == LC_ENTER)
> -    {
> -      if (set->depth == 0)
> -        map->included_from = 0;
> -      else
> -        /* The location of the end of the just-closed map.  */
> -        map->included_from
> -          = (((map[0].start_location - 1 - map[-1].start_location)
> -              & ~((1 << map[-1].m_column_and_range_bits) - 1))
> -             + map[-1].start_location);
> -The normal case (e.g. with the testcase included at the start of this comment) is
> -that map[-1] starts somewhere earlier and so map->included_from computation above
> -nicely computes location_t which expands to the start of the #include line.
> -With r14-11679 reverted, for #c11 as well as #c12
> -map[0].start_location == map[-1].start_location above, and so it is
> -((location_t) -1 & ~((1 << map[-1].m_column_and_range_bits) - 1)))
> -+ map[-1].start_location,
> -which happens to be start of the #include line.
> -For #c11 map[0].start_location is 0x500003a0 and map[-1] has
> -m_column_and_range_bits 7 and map[-2] has m_column_and_range_bits 12 and
> -map[0].included_from is set to 0x50000320.
> -For #c12 map[0].start_location is 0x606c0402 and map[-2].start_location is
> -0x606c0400 and m_column_and_range_bits is 0 for all 3 maps.
> -map[0].included_from is set to 0x606c0401.
> -The last important part is again in linemap_add when doing LC_LEAVE:
> -      /* (MAP - 1) points to the map we are leaving. The
> -         map from which (MAP - 1) got included should be the map
> -         that comes right before MAP in the same file.  */
> -      from = linemap_included_from_linemap (set, map - 1);
> -
> -      /* A TO_FILE of NULL is special - we use the natural values.  */
> -      if (to_file == NULL)
> -        {
> -          to_file = ORDINARY_MAP_FILE_NAME (from);
> -          to_line = SOURCE_LINE (from, from[1].start_location);
> -          sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
> -        }
> -Here it wants to compute the right to_line which ought to be the line after
> -the #include directive.
> -On the #c11 testcase that doesn't work correctly though, because
> -map[-1].included_from is 0x50000320, from[0] for that is LC_ENTER with
> -start_location 0x4080 and m_column_and_range_bits 12 but note that we've
> -earlier computed map[-1].start_location + (-1 & 0xffffff80) and so only
> -decreased by 7 bits, so to_line is still on the line with #include and not
> -after it.  In the #c12 that doesn't happen, all the ordinary maps involved
> -there had 0 m_column_and_range_bits and so this computes correct line.
> -
> -Below is a fix for the trunk including testcases using the
> -location_overflow_plugin hack to simulate the bugs without needing huge
> -files (in the 14 case it is just 330KB and almost 10MB, but in the 15
> -case it would need to be far bigger).
> -The pre- r15-9018 trunk has
> -FAIL: gcc.dg/plugin/location-overflow-test-pr116047.c -fplugin=./location_overflow_plugin.so  scan-file static_assert[^\n\r]*6[^\n\r]*== 6
> -and current trunk
> -FAIL: gcc.dg/plugin/location-overflow-test-pr116047.c -fplugin=./location_overflow_plugin.so  scan-file static_assert[^\n\r]*6[^\n\r]*== 6
> -FAIL: gcc.dg/plugin/location-overflow-test-pr120061.c -fplugin=./location_overflow_plugin.so  scan-file static_assert[^\n\r]*5[^\n\r]*== 5
> -and with the patch everything PASSes.
> -
> -The patch reverts the r14-11679 change, because it is incorrect,
> -we really need to decrement it even when crossing ordinary map
> -boundaries, so that the location is not on the line after the #include
> -line but somewhere on the #include line.  It also patches two spots
> -in linemap_add mentioned above to make sure we get correct locations
> -both in the included_from location_t when doing LC_ENTER (second
> -line-map.cc hunk) and when doing LC_LEAVE to compute the right to_line
> -(first line-map.cc hunk), both in presence of an added LC_RENAME
> -with the same start_location as the following LC_ENTER (i.e. the
> -problematic cases).
> -The LC_ENTER hunk is mostly to ensure included_form location_t is
> -at the start of the #include line (column 0), without it we can
> -decrease include_from not enough and end up at some random column
> -in the middle of the line, because it is masking away
> -map[-1].m_column_and_range_bits bits even when in the end the resulting
> -include_from location_t will be found in map[-2] map with perhaps
> -different m_column_and_range_bits.  That alone doesn't fix the bug
> -though.
> -The more important is the LC_LEAVE hunk and the problem there is
> -caused by linemap_line_start not actually doing
> -    r = set->highest_line + (line_delta << map->m_column_and_range_bits);
> -when adding a new map (the LC_RENAME one because we need to switch to
> -different number of directly encoded ranges, or columns, etc.).
> -So, in the original PR108900 case that
> -  to_line = SOURCE_LINE (from, from[1].start_location);
> -doesn't do the right thing, from there is the last < 0x50000000 map
> -with m_column_and_range_bits 12, from[1] is the first one above it
> -and map[-1].included_from is the correct location of column 0 on
> -the #include line, but as the new LC_RENAME map has been created without
> -actually increasing highest_location to be on the new line (we've just
> -set to_line of the new LC_RENAME map to the correct line),
> -  to_line = SOURCE_LINE (from, from[1].start_location);
> -stays on the same source line.  I've tried to just replace that with
> -  to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
> -i.e. just find out the #include line from map[-1].included_from and
> -add 1 to it, unfortunately that breaks the
> -c-c++-common/cpp/line-4.c
> -test where we expect to stay on the same 0 line for LC_LEAVE from
> -<command line> and gcc.dg/cpp/trad/Wunused.c, gcc.dg/cpp/trad/builtins.c
> -and c-c++-common/analyzer/named-constants-via-macros-traditional.c tests
> -all with -traditional-cpp preprocessing where to_line is also off-by-one
> -from the expected one.
> -So, this patch instead conditionalizes it, uses the
> -  to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
> -way only if from[1] is a LC_RENAME map (rather than the usual
> -LC_ENTER one), that should limit it to the problematic cases of when
> -parse_include peeked after EOL and had to create LC_RENAME map with
> -the same start_location as the LC_ENTER after it.
> -
> -Some further justification for the LC_ENTER hunk, using the
> -https://gcc.gnu.org/pipermail/gcc-patches/2025-May/682774.html testcase
> -(old is 14 before r14-11679, vanilla current 14 and new with the 14 patch)
> -I get
> -$ /usr/src/gcc-14/obj/gcc/cc1.old -quiet -std=c23 pr116047.c -nostdinc
> -In file included from pr116047-1.h:327677:21,
> -                 from pr116047.c:4:
> -pr116047-2.h:1:1: error: unknown type name ‘a’
> -    1 | a b c;
> -      | ^
> -pr116047-2.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’
> -    1 | a b c;
> -      |     ^
> -pr116047-1.h:327677:1: error: static assertion failed: ""
> -327677 | #include "pr116047-2.h"
> -       | ^~~~~~~~~~~~~
> -$ /usr/src/gcc-14/obj/gcc/cc1.vanilla -quiet -std=c23 pr116047.c -nostdinc
> -In file included from pr116047-1.h:327678,
> -                 from pr116047.c:4:
> -pr116047-2.h:1:1: error: unknown type name ‘a’
> -    1 | a b c;
> -      | ^
> -pr116047-2.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’
> -    1 | a b c;
> -      |     ^
> -$ /usr/src/gcc-14/obj/gcc/cc1.new -quiet -std=c23 pr116047.c -nostdinc
> -In file included from pr116047-1.h:327677,
> -                 from pr116047.c:4:
> -pr116047-2.h:1:1: error: unknown type name ‘a’
> -    1 | a b c;
> -      | ^
> -pr116047-2.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’
> -    1 | a b c;
> -      |     ^
> -
> -pr116047-1.h has on lines 327677+327678:
> - #include "pr116047-2.h"
> - static_assert (__LINE__ == 327678, "");
> -so the static_assert failure is something that was dealt mainly in the
> -LC_LEAVE hunk and files.cc reversion, but please have a look at the
> -In file included from lines.
> -14.2 emits correct line (#include "pr116047-2.h" is indeed on line
> -327677) but some random column in there (which is not normally printed
> -for smaller headers; 21 is the . before extension in the filename).
> -Current trunk emits incorrect line (327678 instead of 327677, clearly
> -it didn't decrement).
> -And the patched compiler emits the right line with no column, as would
> -be printed if I remove e.g. 300000 newlines from the file.
> -
> -2025-05-08  Jakub Jelinek  <jakub@redhat.com>
> -
> -	PR preprocessor/108900
> -	PR preprocessor/116047
> -	PR preprocessor/120061
> -	* files.cc (_cpp_stack_file): Revert 2025-03-28 change.
> -	* line-map.cc (linemap_add): Use
> -	SOURCE_LINE (from, linemap_included_from (map - 1)) + 1; instead of
> -	SOURCE_LINE (from, from[1].start_location); to compute to_line
> -	for LC_LEAVE if from[1].reason is LC_RENAME.  For LC_ENTER
> -	included_from computation, look at map[-2] or even lower if map[-1]
> -	has the same start_location as map[0].
> -
> -	* gcc.dg/plugin/plugin.exp: Add location-overflow-test-pr116047.c
> -	and location-overflow-test-pr120061.c.
> -	* gcc.dg/plugin/location_overflow_plugin.c (plugin_init): Don't error
> -	on unknown values, instead just break.
> -	* gcc.dg/plugin/location-overflow-test-pr116047.c: New test.
> -	* gcc.dg/plugin/location-overflow-test-pr116047-1.h: New test.
> -	* gcc.dg/plugin/location-overflow-test-pr116047-2.h: New test.
> -	* gcc.dg/plugin/location-overflow-test-pr120061.c: New test.
> -	* gcc.dg/plugin/location-overflow-test-pr120061-1.h: New test.
> -	* gcc.dg/plugin/location-overflow-test-pr120061-2.h: New test.
> -
> -Upstream-Status: Backport [https://gcc.gnu.org/cgit/gcc/commit/?id=edf745dc519ddbfef127e2789bf11bfbacd300b7]
> -Signed-off-by: Yash Shinde <Yash.Shinde@windriver.com>
> ----
> - .../plugin/location-overflow-test-pr116047-1.h     |  6 +++
> - .../plugin/location-overflow-test-pr116047-2.h     |  1 +
> - .../plugin/location-overflow-test-pr116047.c       |  5 +++
> - .../plugin/location-overflow-test-pr120061-1.h     |  6 +++
> - .../plugin/location-overflow-test-pr120061-2.h     |  1 +
> - .../plugin/location-overflow-test-pr120061.c       |  6 +++
> - .../gcc.dg/plugin/location_overflow_plugin.c       |  2 +-
> - gcc/testsuite/gcc.dg/plugin/plugin.exp             |  4 +-
> - libcpp/line-map.cc                                 | 48 ++++++++++++++++++----
> - 10 files changed, 69 insertions(+), 18 deletions(-)
> - create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
> - create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
> - create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
> - create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
> - create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
> - create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
> -
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
> -new file mode 100644
> -index 000000000000..3dd6434a938b
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
> -@@ -0,0 +1,6 @@
> -+
> -+
> -+
> -+
> -+#include "location-overflow-test-pr116047-2.h"
> -+static_assert (__LINE__ == 6, "");
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
> -new file mode 100644
> -index 000000000000..048f715b4656
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
> -@@ -0,0 +1 @@
> -+int i;
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
> -new file mode 100644
> -index 000000000000..33f2c4ce8def
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
> -@@ -0,0 +1,5 @@
> -+/* PR preprocessor/116047 */
> -+/* { dg-do preprocess } */
> -+/* { dg-options "-nostdinc -std=c23 -fplugin-arg-location_overflow_plugin-value=0x4fff8080" } */
> -+#include "location-overflow-test-pr116047-1.h"
> -+/* { dg-final { scan-file location-overflow-test-pr116047.i "static_assert\[^\n\r]\*6\[^\n\r]\*== 6" } } */
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
> -new file mode 100644
> -index 000000000000..ebf7704f568e
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
> -@@ -0,0 +1,6 @@
> -+
> -+
> -+
> -+
> -+#include "location-overflow-test-pr120061-2.h"
> -+
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
> -new file mode 100644
> -index 000000000000..048f715b4656
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
> -@@ -0,0 +1 @@
> -+int i;
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
> -new file mode 100644
> -index 000000000000..e8e803898da3
> ---- /dev/null
> -+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
> -@@ -0,0 +1,6 @@
> -+/* PR preprocessor/120061 */
> -+/* { dg-do preprocess } */
> -+/* { dg-options "-nostdinc -std=c23 -fplugin-arg-location_overflow_plugin-value=0x61000000" } */
> -+#include "location-overflow-test-pr120061-1.h"
> -+static_assert (__LINE__ == 5, "");
> -+/* { dg-final { scan-file location-overflow-test-pr120061.i "static_assert\[^\n\r]\*5\[^\n\r]\*== 5" } } */
> -diff --git a/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c b/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
> -index d0a6b0755648..6f4497a1cb16 100644
> ---- a/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
> -+++ b/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
> -@@ -101,7 +101,7 @@ plugin_init (struct plugin_name_args *plugin_info,
> -       break;
> -
> -     default:
> --      error_at (UNKNOWN_LOCATION, "unrecognized value for plugin argument");
> -+      break;
> -     }
> -
> -   return 0;
> -diff --git a/gcc/testsuite/gcc.dg/plugin/plugin.exp b/gcc/testsuite/gcc.dg/plugin/plugin.exp
> -index 933f9a5850bc..438c6d87aad9 100644
> ---- a/gcc/testsuite/gcc.dg/plugin/plugin.exp
> -+++ b/gcc/testsuite/gcc.dg/plugin/plugin.exp
> -@@ -126,7 +126,9 @@ set plugin_test_list [list \
> -     { location_overflow_plugin.c \
> - 	  location-overflow-test-1.c \
> - 	  location-overflow-test-2.c \
> --	  location-overflow-test-pr83173.c } \
> -+	  location-overflow-test-pr83173.c \
> -+	  location-overflow-test-pr116047.c \
> -+	  location-overflow-test-pr120061.c } \
> -     { must_tail_call_plugin.c \
> - 	  must-tail-call-1.c \
> - 	  must-tail-call-2.c } \
> -diff --git a/libcpp/line-map.cc b/libcpp/line-map.cc
> -index d5200b317eee..1e659638d9f7 100644
> ---- a/libcpp/line-map.cc
> -+++ b/libcpp/line-map.cc
> -@@ -618,8 +618,8 @@ linemap_add (line_maps *set, enum lc_reason reason,
> - 	 #include "included", inside the same "includer" file.  */
> -
> -       linemap_assert (!MAIN_FILE_P (map - 1));
> --      /* (MAP - 1) points to the map we are leaving. The
> --	 map from which (MAP - 1) got included should be the map
> -+      /* (MAP - 1) points to the map we are leaving.  The
> -+	 map from which (MAP - 1) got included should be usually the map
> - 	 that comes right before MAP in the same file.  */
> -       from = linemap_included_from_linemap (set, map - 1);
> -
> -@@ -627,7 +627,24 @@ linemap_add (line_maps *set, enum lc_reason reason,
> -       if (to_file == NULL)
> - 	{
> - 	  to_file = ORDINARY_MAP_FILE_NAME (from);
> --	  to_line = SOURCE_LINE (from, from[1].start_location);
> -+	  /* Compute the line on which the map resumes, for #include this
> -+	     should be the line after the #include line.  Usually FROM is
> -+	     the map right before LC_ENTER map - the first map of the included
> -+	     file, and in that case SOURCE_LINE (from, from[1].start_location);
> -+	     computes the right line (and does handle even some special cases
> -+	     (e.g. where for returning from <command line> we still want to
> -+	     be at line 0 or some -traditional-cpp cases).  In rare cases
> -+	     FROM can be followed by LC_RENAME created by linemap_line_start
> -+	     for line right after #include line.  If that happens,
> -+	     start_location of the FROM[1] map will be the same as
> -+	     start_location of FROM[2] LC_ENTER, but FROM[1] start_location
> -+	     might not have advance enough for moving to a full next line.
> -+	     In that case compute the line of #include line and add 1 to it
> -+	     to advance to the next line.  See PR120061.  */
> -+	  if (from[1].reason == LC_RENAME)
> -+	    to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
> -+	  else
> -+	    to_line = SOURCE_LINE (from, from[1].start_location);
> - 	  sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
> - 	}
> -       else
> -@@ -657,11 +674,26 @@ linemap_add (line_maps *set, enum lc_reason reason,
> -       if (set->depth == 0)
> - 	map->included_from = 0;
> -       else
> --	/* The location of the end of the just-closed map.  */
> --	map->included_from
> --	  = (((map[0].start_location - 1 - map[-1].start_location)
> --	      & ~((1 << map[-1].m_column_and_range_bits) - 1))
> --	     + map[-1].start_location);
> -+	{
> -+	  /* Compute location from whence this line map was included.
> -+	     For #include this should be preferrably column 0 of the
> -+	     line on which #include directive appears.
> -+	     map[-1] is the just closed map and usually included_from
> -+	     falls within that map.  In rare cases linemap_line_start
> -+	     can insert a new LC_RENAME map for the line immediately
> -+	     after #include line, in that case map[-1] will have the
> -+	     same start_location as the new one and so included_from
> -+	     would not be from map[-1] but likely map[-2].  If that
> -+	     happens, mask off map[-2] m_column_and_range_bits bits
> -+	     instead of map[-1].  See PR120061.  */
> -+	  int i = -1;
> -+	  while (map[i].start_location == map[0].start_location)
> -+	    --i;
> -+	  map->included_from
> -+	    = (((map[0].start_location - 1 - map[i].start_location)
> -+		& ~((1 << map[i].m_column_and_range_bits) - 1))
> -+	       + map[i].start_location);
> -+	}
> -       set->depth++;
> -       if (set->trace_includes)
> - 	trace_include (set, map);
> ---
> diff --git a/meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch b/meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
> deleted file mode 100644
> index e5abdcc703..0000000000
> --- a/meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
> +++ /dev/null
> @@ -1,549 +0,0 @@
> -From ab884fffe3fc82a710bea66ad651720d71c938b8 Mon Sep 17 00:00:00 2001
> -From: Jonathan Wakely <jwakely@redhat.com>
> -Date: Tue, 30 Apr 2024 09:52:13 +0100
> -Subject: [PATCH] libstdc++: Fix std::chrono::tzdb to work with vanguard format
> -
> -I found some issues in the std::chrono::tzdb parser by testing the
> -tzdata "vanguard" format, which uses new features that aren't enabled in
> -the "main" and "rearguard" data formats.
> -
> -Since 2024a the keyword "minimum" is no longer valid for the FROM and TO
> -fields in a Rule line, which means that "m" is now a valid abbreviation
> -for "maximum". Previously we expected either "mi" or "ma". For backwards
> -compatibility, a FROM field beginning with "mi" is still supported and
> -is treated as 1900. The "maximum" keyword is only allowed in TO now,
> -because it makes no sense in FROM. To support these changes the
> -minmax_year and minmax_year2 classes for parsing FROM and TO are
> -replaced with a single years_from_to class that reads both fields.
> -
> -The vanguard format makes use of %z in Zone FORMAT fields, which caused
> -an exception to be thrown from ZoneInfo::set_abbrev because no % or /
> -characters were expected when a Zone doesn't use a named Rule. The
> -ZoneInfo::to(sys_info&) function now uses format_abbrev_str to replace
> -any %z with the current offset. Although format_abbrev_str also checks
> -for %s and STD/DST formats, those only make sense when a named Rule is
> -in effect, so won't occur when ZoneInfo::to(sys_info&) is used.
> -
> -Since making this change on trunk, the tzdata-2024b release started
> -using %z in the main format, not just vanguard. This makes a backport to
> -release branches necessary (see PR 116657).
> -
> -This change also implements a feature that has always been missing from
> -time_zone::_M_get_sys_info: finding the Rule that is active before the
> -specified time point, so that we can correctly handle %s in the FORMAT
> -for the first new sys_info that gets created. This requires implementing
> -a poorly documented feature of zic, to get the LETTERS field from a
> -later transition, as described at
> -https://mm.icann.org/pipermail/tz/2024-April/058891.html
> -In order for this to work we need to be able to distinguish an empty
> -letters field (as used by CE%sT where the variable part is either empty
> -or "S") from "the letters field is not known for this transition". The
> -tzdata file uses "-" for an empty letters field, which libstdc++ was
> -previously replacing with "" when the Rule was parsed. Instead, we now
> -preserve the "-" in the Rule object, so that "" can be used for the case
> -where we don't know the letters (and so need to decide it).
> -
> -(cherry picked from commit 0ca8d56f2085715f27ee536c6c344bc47af49cdd)
> -
> -Upstream-Status: Backport [https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=5ceea2ac106d6dd1aa8175670b15a801316cf1c9]
> -
> -Signed-off-by: Markus Volk <f_l_k@t-online.de>
> ----
> - libstdc++-v3/src/c++20/tzdb.cc                | 265 +++++++++++-------
> - .../std/time/time_zone/sys_info_abbrev.cc     | 106 +++++++
> - libstdc++-v3/testsuite/std/time/tzdb/1.cc     |   6 +-
> - 3 files changed, 274 insertions(+), 103 deletions(-)
> - create mode 100644 libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
> -
> -diff --git a/libstdc++-v3/src/c++20/tzdb.cc b/libstdc++-v3/src/c++20/tzdb.cc
> -index c7c7cc9deee6..7e8cce7ce8cf 100644
> ---- a/libstdc++-v3/src/c++20/tzdb.cc
> -+++ b/libstdc++-v3/src/c++20/tzdb.cc
> -@@ -342,51 +342,103 @@ namespace std::chrono
> -       friend istream& operator>>(istream&, on_day&);
> -     };
> -
> --    // Wrapper for chrono::year that reads a year, or one of the keywords
> --    // "minimum" or "maximum", or an unambiguous prefix of a keyword.
> --    struct minmax_year
> -+    // Wrapper for two chrono::year values, which reads the FROM and TO
> -+    // fields of a Rule line. The FROM field is a year and TO is a year or
> -+    // one of the keywords "maximum" or "only" (or an abbreviation of those).
> -+    // For backwards compatibility, the keyword "minimum" is recognized
> -+    // for FROM and interpreted as 1900.
> -+    struct years_from_to
> -     {
> --      year& y;
> -+      year& from;
> -+      year& to;
> -
> --      friend istream& operator>>(istream& in, minmax_year&& y)
> -+      friend istream& operator>>(istream& in, years_from_to&& yy)
> -       {
> --	if (ws(in).peek() == 'm') // keywords "minimum" or "maximum"
> -+	string s;
> -+	auto c = ws(in).peek();
> -+	if (c == 'm') [[unlikely]] // keyword "minimum"
> - 	  {
> --	    string s;
> --	    in >> s; // extract the rest of the word, but only look at s[1]
> --	    if (s[1] == 'a')
> --	      y.y = year::max();
> --	    else if (s[1] == 'i')
> --	      y.y = year::min();
> --	    else
> --	      in.setstate(ios::failbit);
> -+	    in >> s; // extract the rest of the word
> -+	    yy.from = year(1900);
> -+	  }
> -+	else if (int num = 0; in >> num) [[likely]]
> -+	  yy.from = year{num};
> -+
> -+	c = ws(in).peek();
> -+	if (c == 'm') // keyword "maximum"
> -+	  {
> -+	    in >> s; // extract the rest of the word
> -+	    yy.to = year::max();
> -+	  }
> -+	else if (c == 'o') // keyword "only"
> -+	  {
> -+	    in >> s; // extract the rest of the word
> -+	    yy.to = yy.from;
> - 	  }
> - 	else if (int num = 0; in >> num)
> --	  y.y = year{num};
> -+	  yy.to = year{num};
> -+
> - 	return in;
> -       }
> -     };
> -
> --    // As above for minmax_year, but also supports the keyword "only",
> --    // meaning that the TO year is the same as the FROM year.
> --    struct minmax_year2
> -+    bool
> -+    select_std_or_dst_abbrev(string& abbrev, minutes save)
> -     {
> --      minmax_year to;
> --      year from;
> -+      if (size_t pos = abbrev.find('/'); pos != string::npos)
> -+	{
> -+	  // Select one of "STD/DST" for standard or daylight.
> -+	  if (save == 0min)
> -+	    abbrev.erase(pos);
> -+	  else
> -+	    abbrev.erase(0, pos + 1);
> -+	  return true;
> -+	}
> -+      return false;
> -+    }
> -
> --      friend istream& operator>>(istream& in, minmax_year2&& y)
> --      {
> --	if (ws(in).peek() == 'o') // keyword "only"
> --	  {
> --	    string s;
> --	    in >> s; // extract the whole keyword
> --	    y.to.y = y.from;
> --	  }
> --	else
> --	  in >> std::move(y.to);
> --	return in;
> --      }
> --    };
> -+    // Set the sys_info::abbrev string by expanding any placeholders.
> -+    void
> -+    format_abbrev_str(sys_info& info, string_view letters = {})
> -+    {
> -+      if (size_t pos = info.abbrev.find('%'); pos != string::npos)
> -+	{
> -+	  if (info.abbrev[pos + 1] == 's')
> -+	    {
> -+	      // Expand "%s" to the variable part, given by Rule::letters.
> -+	      if (letters == "-")
> -+		info.abbrev.erase(pos, 2);
> -+	      else
> -+		info.abbrev.replace(pos, 2, letters);
> -+	    }
> -+	  else if (info.abbrev[pos + 1] == 'z')
> -+	    {
> -+	      // Expand "%z" to the UT offset as +/-hh, +/-hhmm, or +/-hhmmss.
> -+	      hh_mm_ss<seconds> t(info.offset);
> -+	      string z(1, "+-"[t.is_negative()]);
> -+	      long val = t.hours().count();
> -+	      int digits = 2;
> -+	      if (int m = t.minutes().count())
> -+		{
> -+		  digits = 4;
> -+		  val *= 100;
> -+		  val += m;
> -+		  if (int s = t.seconds().count())
> -+		    {
> -+		      digits = 6;
> -+		      val *= 100;
> -+		      val += s;
> -+		    }
> -+		}
> -+	      auto sval = std::to_string(val);
> -+	      z += string(digits - sval.size(), '0');
> -+	      z += sval;
> -+	      info.abbrev.replace(pos, 2, z);
> -+	    }
> -+	}
> -+      else
> -+	select_std_or_dst_abbrev(info.abbrev, info.save);
> -+    }
> -
> -     // A time zone information record.
> -     // Zone  NAME        STDOFF  RULES   FORMAT  [UNTIL]
> -@@ -462,6 +514,7 @@ namespace std::chrono
> - 	info.offset = offset();
> - 	info.save = minutes(m_save);
> - 	info.abbrev = format();
> -+	format_abbrev_str(info); // expand %z
> - 	return true;
> -       }
> -
> -@@ -469,12 +522,9 @@ namespace std::chrono
> -       friend class time_zone;
> -
> -       void
> --      set_abbrev(const string& abbrev)
> -+      set_abbrev(string abbrev)
> -       {
> --	// In practice, the FORMAT field never needs expanding here.
> --	if (abbrev.find_first_of("/%") != abbrev.npos)
> --	  __throw_runtime_error("std::chrono::time_zone: invalid data");
> --	m_buf = abbrev;
> -+	m_buf = std::move(abbrev);
> - 	m_pos = 0;
> - 	m_expanded = true;
> -       }
> -@@ -544,9 +594,7 @@ namespace std::chrono
> -
> - 	// Rule  NAME  FROM  TO  TYPE  IN  ON  AT  SAVE  LETTER/S
> -
> --	in >> quoted(rule.name)
> --	   >> minmax_year{rule.from}
> --	   >> minmax_year2{rule.to, rule.from};
> -+	in >> quoted(rule.name) >> years_from_to{rule.from, rule.to};
> -
> - 	if (char type; in >> type && type != '-')
> - 	  in.setstate(ios::failbit);
> -@@ -557,7 +605,7 @@ namespace std::chrono
> - 	if (save_time.indicator != at_time::Wall)
> - 	  {
> - 	    // We don't actually store the save_time.indicator, because we
> --	    // assume that it's always deducable from the actual offset value.
> -+	    // assume that it's always deducible from the offset value.
> - 	    auto expected = save_time.time == 0s
> - 			      ? at_time::Standard
> - 			      : at_time::Daylight;
> -@@ -567,8 +615,6 @@ namespace std::chrono
> - 	rule.save = save_time.time;
> -
> - 	in >> rule.letters;
> --	if (rule.letters == "-")
> --	  rule.letters.clear();
> - 	return in;
> -       }
> -
> -@@ -719,58 +765,6 @@ namespace std::chrono
> - #endif // TZDB_DISABLED
> -   };
> -
> --#ifndef TZDB_DISABLED
> --  namespace
> --  {
> --    bool
> --    select_std_or_dst_abbrev(string& abbrev, minutes save)
> --    {
> --      if (size_t pos = abbrev.find('/'); pos != string::npos)
> --	{
> --	  // Select one of "STD/DST" for standard or daylight.
> --	  if (save == 0min)
> --	    abbrev.erase(pos);
> --	  else
> --	    abbrev.erase(0, pos + 1);
> --	  return true;
> --	}
> --      return false;
> --    }
> --
> --    // Set the sys_info::abbrev string by expanding any placeholders.
> --    void
> --    format_abbrev_str(sys_info& info, string_view letters = {})
> --    {
> --      if (size_t pos = info.abbrev.find("%s"); pos != string::npos)
> --	{
> --	  // Expand "%s" to the variable part, given by Rule::letters.
> --	  info.abbrev.replace(pos, 2, letters);
> --	}
> --      else if (size_t pos = info.abbrev.find("%z"); pos != string::npos)
> --	{
> --	  // Expand "%z" to the UT offset as +/-hh, +/-hhmm, or +/-hhmmss.
> --	  hh_mm_ss<seconds> t(info.offset);
> --	  string z(1, "+-"[t.is_negative()]);
> --	  long val = t.hours().count();
> --	  if (minutes m = t.minutes(); m != m.zero())
> --	    {
> --	      val *= 100;
> --	      val += m.count();
> --	      if (seconds s = t.seconds(); s != s.zero())
> --		{
> --		  val *= 100;
> --		  val += s.count();
> --		}
> --	    }
> --	  z += std::to_string(val);
> --	  info.abbrev.replace(pos, 2, z);
> --	}
> --      else
> --	select_std_or_dst_abbrev(info.abbrev, info.save);
> --    }
> --  }
> --#endif // TZDB_DISABLED
> --
> -   // Implementation of std::chrono::time_zone::get_info(const sys_time<D>&)
> -   sys_info
> -   time_zone::_M_get_sys_info(sys_seconds tp) const
> -@@ -839,12 +833,72 @@ namespace std::chrono
> -     info.abbrev = ri.format();
> -
> -     string_view letters;
> --    if (i != infos.begin())
> -+    if (i != infos.begin() && i[-1].expanded())
> -+      letters = i[-1].next_letters();
> -+
> -+    if (letters.empty())
> -       {
> --	if (i[-1].expanded())
> --	  letters = i[-1].next_letters();
> --	// XXX else need to find Rule active before this time and use it
> --	// to know the initial offset, save, and letters.
> -+	sys_seconds t = info.begin - seconds(1);
> -+	const year_month_day date(chrono::floor<days>(t));
> -+
> -+	// Try to find a Rule active before this time, to get initial
> -+	// SAVE and LETTERS values. There may not be a Rule for the period
> -+	// before the first DST transition, so find the earliest DST->STD
> -+	// transition and use the LETTERS from that.
> -+	const Rule* active_rule = nullptr;
> -+	sys_seconds active_rule_start = sys_seconds::min();
> -+	const Rule* first_std = nullptr;
> -+	for (const auto& rule : rules)
> -+	  {
> -+	    if (rule.save == minutes(0))
> -+	      {
> -+		if (!first_std)
> -+		  first_std = &rule;
> -+		else if (rule.from < first_std->from)
> -+		  first_std = &rule;
> -+		else if (rule.from == first_std->from)
> -+		  {
> -+		    if (rule.start_time(rule.from, {})
> -+			  < first_std->start_time(first_std->from, {}))
> -+		      first_std = &rule;
> -+		  }
> -+	      }
> -+
> -+	    year y = date.year();
> -+
> -+	    if (y > rule.to) // rule no longer applies at time t
> -+	      continue;
> -+	    if (y < rule.from) // rule doesn't apply yet at time t
> -+	      continue;
> -+
> -+	    sys_seconds rule_start;
> -+
> -+	    seconds offset{}; // appropriate for at_time::Universal
> -+	    if (rule.when.indicator == at_time::Wall)
> -+	      offset = info.offset;
> -+	    else if (rule.when.indicator == at_time::Standard)
> -+	      offset = ri.offset();
> -+
> -+	    // Time the rule takes effect this year:
> -+	    rule_start = rule.start_time(y, offset);
> -+
> -+	    if (rule_start >= t && rule.from < y)
> -+	      {
> -+		// Try this rule in the previous year.
> -+		rule_start = rule.start_time(--y, offset);
> -+	      }
> -+
> -+	    if (active_rule_start < rule_start && rule_start < t)
> -+	      {
> -+		active_rule_start = rule_start;
> -+		active_rule = &rule;
> -+	      }
> -+	  }
> -+
> -+	if (active_rule)
> -+	  letters = active_rule->letters;
> -+	else if (first_std)
> -+	  letters = first_std->letters;
> -       }
> -
> -     const Rule* curr_rule = nullptr;
> -@@ -2069,9 +2123,11 @@ namespace std::chrono
> - 	      istringstream in2(std::move(rules));
> - 	      in2 >> rules_time;
> - 	      inf.m_save = duration_cast<minutes>(rules_time.time);
> -+	      // If the FORMAT is "STD/DST" then we can choose the right one
> -+	      // now, so that we store a shorter string.
> - 	      select_std_or_dst_abbrev(fmt, inf.m_save);
> - 	    }
> --	  inf.set_abbrev(fmt);
> -+	  inf.set_abbrev(std::move(fmt));
> - 	}
> -
> -       // YEAR [MONTH [DAY [TIME]]]
> -@@ -2082,7 +2138,12 @@ namespace std::chrono
> - 	  abbrev_month m{January};
> - 	  int d = 1;
> - 	  at_time t{};
> -+	  // XXX DAY should support ON format, e.g. lastSun or Sun>=8
> - 	  in >> m >> d >> t;
> -+	  // XXX UNTIL field should be interpreted
> -+	  // "using the rules in effect just before the transition"
> -+	  // so might need to store as year_month_day and hh_mm_ss and only
> -+	  // convert to a sys_time once we know the offset in effect.
> - 	  inf.m_until = sys_days(year(y)/m.m/day(d)) + seconds(t.time);
> - 	}
> -       else
> -diff --git a/libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc b/libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
> -new file mode 100644
> -index 000000000000..f1a8fff02f58
> ---- /dev/null
> -+++ b/libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
> -@@ -0,0 +1,106 @@
> -+// { dg-do run { target c++20 } }
> -+// { dg-require-effective-target tzdb }
> -+// { dg-require-effective-target cxx11_abi }
> -+// { dg-xfail-run-if "no weak override on AIX" { powerpc-ibm-aix* } }
> -+
> -+#include <chrono>
> -+#include <fstream>
> -+#include <testsuite_hooks.h>
> -+
> -+static bool override_used = false;
> -+
> -+namespace __gnu_cxx
> -+{
> -+  const char* zoneinfo_dir_override() {
> -+    override_used = true;
> -+    return "./";
> -+  }
> -+}
> -+
> -+using namespace std::chrono;
> -+
> -+void
> -+test_format()
> -+{
> -+  std::ofstream("tzdata.zi") << R"(# version test_1
> -+Zone Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u
> -+                   -1      - %z  1975
> -+                   0       - GMT
> -+Zon Some/Zone 1:2:3   - %z 1900
> -+              1:23:45 - %z 1950
> -+Zo Another/Zone 1:2:3 -     AZ0     1901
> -+                1     Roolz A%sZ    2000
> -+                1     Roolz SAZ/DAZ 2005
> -+                1     Roolz %z
> -+Rule Roolz 1950 max - April 1 2 1 D
> -+Rul  Roolz 1950 max - Oct   1 1 0 S
> -+Z Strange/Zone 1       - X%sX    1980
> -+               1       - FOO/BAR 1990
> -+               2:00    - %zzz    1995
> -+               0:9     - %zzz    1996
> -+               0:8:7   - %zzz    1997
> -+               0:6:5.5 - %zzz    1998
> -+)";
> -+
> -+  const auto& db = reload_tzdb();
> -+  VERIFY( override_used ); // If this fails then XFAIL for the target.
> -+  VERIFY( db.version == "test_1" );
> -+
> -+  // Test formatting %z as
> -+  auto tz = locate_zone("Africa/Bissau");
> -+  auto inf = tz->get_info(sys_days(1974y/1/1));
> -+  VERIFY( inf.abbrev == "-01" );
> -+
> -+  tz = locate_zone("Some/Zone");
> -+  inf = tz->get_info(sys_days(1899y/1/1));
> -+  VERIFY( inf.abbrev == "+010203" );
> -+  inf = tz->get_info(sys_days(1955y/1/1));
> -+  VERIFY( inf.abbrev == "+012345" );
> -+
> -+  tz = locate_zone("Another/Zone");
> -+  // Test formatting %s as the LETTER/S field from the active Rule.
> -+  inf = tz->get_info(sys_days(1910y/January/1));
> -+  VERIFY( inf.abbrev == "ASZ" );
> -+  inf = tz->get_info(sys_days(1950y/January/1));
> -+  VERIFY( inf.abbrev == "ASZ" );
> -+  inf = tz->get_info(sys_days(1950y/June/1));
> -+  VERIFY( inf.abbrev == "ADZ" );
> -+  inf = tz->get_info(sys_days(1999y/January/1));
> -+  VERIFY( inf.abbrev == "ASZ" );
> -+  inf = tz->get_info(sys_days(1999y/July/1));
> -+  VERIFY( inf.abbrev == "ADZ" );
> -+  // Test formatting STD/DST according to the active Rule.
> -+  inf = tz->get_info(sys_days(2000y/January/2));
> -+  VERIFY( inf.abbrev == "SAZ" );
> -+  inf = tz->get_info(sys_days(2001y/January/1));
> -+  VERIFY( inf.abbrev == "SAZ" );
> -+  inf = tz->get_info(sys_days(2001y/July/1));
> -+  VERIFY( inf.abbrev == "DAZ" );
> -+  // Test formatting %z as the offset determined by the active Rule.
> -+  inf = tz->get_info(sys_days(2005y/January/2));
> -+  VERIFY( inf.abbrev == "+01" );
> -+  inf = tz->get_info(sys_days(2006y/January/1));
> -+  VERIFY( inf.abbrev == "+01" );
> -+  inf = tz->get_info(sys_days(2006y/July/1));
> -+  VERIFY( inf.abbrev == "+02" );
> -+
> -+  // Test formatting %z, %s and S/D for a Zone with no associated Rules.
> -+  tz = locate_zone("Strange/Zone");
> -+  inf = tz->get_info(sys_days(1979y/January/1));
> -+  VERIFY( inf.abbrev == "XX" ); // No Rule means nothing to use for %s.
> -+  inf = tz->get_info(sys_days(1981y/July/1));
> -+  VERIFY( inf.abbrev == "FOO" ); // Always standard time means first string.
> -+  inf = tz->get_info(sys_days(1994y/July/1));
> -+  VERIFY( inf.abbrev == "+02zz" );
> -+  inf = tz->get_info(sys_days(1995y/July/1));
> -+  VERIFY( inf.abbrev == "+0009zz" );
> -+  inf = tz->get_info(sys_days(1996y/July/1));
> -+  VERIFY( inf.abbrev == "+000807zz" );
> -+  inf = tz->get_info(sys_days(1997y/July/1));
> -+  VERIFY( inf.abbrev == "+000606zz" );
> -+}
> -+
> -+int main()
> -+{
> -+  test_format();
> -+}
> -diff --git a/libstdc++-v3/testsuite/std/time/tzdb/1.cc b/libstdc++-v3/testsuite/std/time/tzdb/1.cc
> -index 796f3a8b4256..7a31c1c20ba7 100644
> ---- a/libstdc++-v3/testsuite/std/time/tzdb/1.cc
> -+++ b/libstdc++-v3/testsuite/std/time/tzdb/1.cc
> -@@ -39,11 +39,15 @@ test_locate()
> -   const tzdb& db = get_tzdb();
> -   const time_zone* tz = db.locate_zone("GMT");
> -   VERIFY( tz != nullptr );
> --  VERIFY( tz->name() == "Etc/GMT" );
> -   VERIFY( tz == std::chrono::locate_zone("GMT") );
> -   VERIFY( tz == db.locate_zone("Etc/GMT") );
> -   VERIFY( tz == db.locate_zone("Etc/GMT+0") );
> -
> -+  // Since 2022f GMT is now a Zone and Etc/GMT a link instead of vice versa,
> -+  // but only when using the vanguard format. As of 2024a, the main and
> -+  // rearguard formats still have Etc/GMT as a Zone and GMT as a link.
> -+  VERIFY( tz->name() == "GMT" || tz->name() == "Etc/GMT" );
> -+
> -   VERIFY( db.locate_zone(db.current_zone()->name()) == db.current_zone() );
> - }
> -
> ---
> -2.43.5
> -
> diff --git a/meta/recipes-devtools/gcc/gcc_14.2.bb b/meta/recipes-devtools/gcc/gcc_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/gcc_14.2.bb
> rename to meta/recipes-devtools/gcc/gcc_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/libgcc-initial_14.2.bb b/meta/recipes-devtools/gcc/libgcc-initial_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/libgcc-initial_14.2.bb
> rename to meta/recipes-devtools/gcc/libgcc-initial_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/libgcc_14.2.bb b/meta/recipes-devtools/gcc/libgcc_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/libgcc_14.2.bb
> rename to meta/recipes-devtools/gcc/libgcc_14.3.bb
> diff --git a/meta/recipes-devtools/gcc/libgfortran_14.2.bb b/meta/recipes-devtools/gcc/libgfortran_14.3.bb
> similarity index 100%
> rename from meta/recipes-devtools/gcc/libgfortran_14.2.bb
> rename to meta/recipes-devtools/gcc/libgfortran_14.3.bb
diff mbox series

Patch

diff --git a/meta/recipes-devtools/gcc/gcc-14.2.inc b/meta/recipes-devtools/gcc/gcc-14.3.inc
similarity index 90%
rename from meta/recipes-devtools/gcc/gcc-14.2.inc
rename to meta/recipes-devtools/gcc/gcc-14.3.inc
index fa9003f604..ca2f2e2a13 100644
--- a/meta/recipes-devtools/gcc/gcc-14.2.inc
+++ b/meta/recipes-devtools/gcc/gcc-14.3.inc
@@ -2,11 +2,11 @@  require gcc-common.inc
 
 # Third digit in PV should be incremented after a minor release
 
-PV = "14.2.0"
+PV = "14.3.0"
 
 # BINV should be incremented to a revision after a minor gcc release
 
-BINV = "14.2.0"
+BINV = "14.3.0"
 
 FILESEXTRAPATHS =. "${FILE_DIRNAME}/gcc:${FILE_DIRNAME}/gcc/backport:"
 
@@ -40,7 +40,7 @@  LIC_FILES_CHKSUM = "\
 RELEASE ?= "${PV}"
 BASEURI ?= "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.xz"
 SOURCEDIR ?= "gcc-${PV}"
-SRC_URI[sha256sum] = "a7b39bc69cbf9e25826c5a60ab26477001f7c08d85cec04bc0e29cabed6f3cc9"
+SRC_URI[sha256sum] = "e0dc77297625631ac8e50fa92fffefe899a4eb702592da5c32ef04e2293aca3a"
 
 SRC_URI = "${BASEURI} \
            file://0001-gcc-4.3.1-ARCH_FLAGS_FOR_TARGET.patch \
@@ -68,11 +68,6 @@  SRC_URI = "${BASEURI} \
            file://0023-Fix-install-path-of-linux64.h.patch \
            file://0024-Avoid-hardcoded-build-paths-into-ppc-libgcc.patch \
            file://0025-gcc-testsuite-tweaks-for-mips-OE.patch \
-	   file://0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch \
-           file://0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch \
-           file://gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch \
-           file://0001-arm-Fix-LDRD-register-overlap-PR117675.patch \
-           file://0028-fix-incorrect-preprocessor-line-numbers.patch \
 "
 
 S = "${TMPDIR}/work-shared/gcc-${PV}-${PR}/${SOURCEDIR}"
diff --git a/meta/recipes-devtools/gcc/gcc-cross-canadian_14.2.bb b/meta/recipes-devtools/gcc/gcc-cross-canadian_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc-cross-canadian_14.2.bb
rename to meta/recipes-devtools/gcc/gcc-cross-canadian_14.3.bb
diff --git a/meta/recipes-devtools/gcc/gcc-cross_14.2.bb b/meta/recipes-devtools/gcc/gcc-cross_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc-cross_14.2.bb
rename to meta/recipes-devtools/gcc/gcc-cross_14.3.bb
diff --git a/meta/recipes-devtools/gcc/gcc-crosssdk_14.2.bb b/meta/recipes-devtools/gcc/gcc-crosssdk_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc-crosssdk_14.2.bb
rename to meta/recipes-devtools/gcc/gcc-crosssdk_14.3.bb
diff --git a/meta/recipes-devtools/gcc/gcc-runtime_14.2.bb b/meta/recipes-devtools/gcc/gcc-runtime_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc-runtime_14.2.bb
rename to meta/recipes-devtools/gcc/gcc-runtime_14.3.bb
diff --git a/meta/recipes-devtools/gcc/gcc-sanitizers_14.2.bb b/meta/recipes-devtools/gcc/gcc-sanitizers_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc-sanitizers_14.2.bb
rename to meta/recipes-devtools/gcc/gcc-sanitizers_14.3.bb
diff --git a/meta/recipes-devtools/gcc/gcc-source_14.2.bb b/meta/recipes-devtools/gcc/gcc-source_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc-source_14.2.bb
rename to meta/recipes-devtools/gcc/gcc-source_14.3.bb
diff --git a/meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch b/meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch
deleted file mode 100644
index e3d887a135..0000000000
--- a/meta/recipes-devtools/gcc/gcc/0001-arm-Fix-LDRD-register-overlap-PR117675.patch
+++ /dev/null
@@ -1,148 +0,0 @@ 
-From 9366c328518766d896155388726055624716c0af Mon Sep 17 00:00:00 2001
-From: Wilco Dijkstra <wilco.dijkstra@arm.com>
-Date: Tue, 10 Dec 2024 14:22:48 +0000
-Subject: [PATCH] arm: Fix LDRD register overlap [PR117675]
-
-The register indexed variants of LDRD have complex register overlap constraints
-which makes them hard to use without using output_move_double (which can't be
-used for atomics as it doesn't guarantee to emit atomic LDRD/STRD when required).
-Add a new predicate and constraint for plain LDRD/STRD with base or base+imm.
-This blocks register indexing and fixes PR117675.
-
-gcc:
-	PR target/117675
-	* config/arm/arm.cc (arm_ldrd_legitimate_address): New function.
-	* config/arm/arm-protos.h (arm_ldrd_legitimate_address): New prototype.
-	* config/arm/constraints.md: Add new Uo constraint.
-	* config/arm/predicates.md (arm_ldrd_memory_operand): Add new predicate.
-	* config/arm/sync.md (arm_atomic_loaddi2_ldrd): Use
-	arm_ldrd_memory_operand and Uo.
-
-gcc/testsuite:
-	PR target/117675
-	* gcc.target/arm/pr117675.c: Add new test.
-
-(cherry picked from commit 21fbfae2e55e1a153820acc6fbd922e66f67e65b)
-
-Upstream-Status: Backport [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117675]
----
- gcc/config/arm/arm-protos.h             |  1 +
- gcc/config/arm/arm.cc                   | 24 ++++++++++++++++++++++++
- gcc/config/arm/constraints.md           |  8 +++++++-
- gcc/config/arm/predicates.md            |  4 ++++
- gcc/config/arm/sync.md                  |  2 +-
- gcc/testsuite/gcc.target/arm/pr117675.c | 17 +++++++++++++++++
- 6 files changed, 54 insertions(+), 2 deletions(-)
- create mode 100644 gcc/testsuite/gcc.target/arm/pr117675.c
-
---- a/gcc/config/arm/arm-protos.h
-+++ b/gcc/config/arm/arm-protos.h
-@@ -202,6 +202,7 @@ extern rtx arm_load_tp (rtx);
- extern bool arm_coproc_builtin_available (enum unspecv);
- extern bool arm_coproc_ldc_stc_legitimate_address (rtx);
- extern rtx arm_stack_protect_tls_canary_mem (bool);
-+extern bool arm_ldrd_legitimate_address (rtx);
- 
- 
- #if defined TREE_CODE
---- a/gcc/config/arm/arm.cc
-+++ b/gcc/config/arm/arm.cc
-@@ -34523,6 +34523,30 @@ arm_coproc_ldc_stc_legitimate_address (r
-   return false;
- }
- 
-+/* Return true if OP is a valid memory operand for LDRD/STRD without any
-+   register overlap restrictions.  Allow [base] and [base, imm] for now.  */
-+bool
-+arm_ldrd_legitimate_address (rtx op)
-+{
-+  if (!MEM_P (op))
-+    return false;
-+
-+  op = XEXP (op, 0);
-+  if (REG_P (op))
-+    return true;
-+
-+  if (GET_CODE (op) != PLUS)
-+    return false;
-+  if (!REG_P (XEXP (op, 0)) || !CONST_INT_P (XEXP (op, 1)))
-+    return false;
-+
-+  HOST_WIDE_INT val = INTVAL (XEXP (op, 1));
-+
-+  if (TARGET_ARM)
-+    return IN_RANGE (val, -255, 255);
-+  return IN_RANGE (val, -1020, 1020) && (val & 3) == 0;
-+}
-+
- /* Return the diagnostic message string if conversion from FROMTYPE to
-    TOTYPE is not allowed, NULL otherwise.  */
- 
---- a/gcc/config/arm/constraints.md
-+++ b/gcc/config/arm/constraints.md
-@@ -39,7 +39,7 @@
- ;; in all states: Pg
- 
- ;; The following memory constraints have been used:
--;; in ARM/Thumb-2 state: Uh, Ut, Uv, Uy, Un, Um, Us, Up, Uf, Ux, Ul
-+;; in ARM/Thumb-2 state: Uh, Ut, Uv, Uy, Un, Um, Us, Uo, Up, Uf, Ux, Ul, Uz
- ;; in ARM state: Uq
- ;; in Thumb state: Uu, Uw
- ;; in all states: Q
-@@ -585,6 +585,12 @@
-  (and (match_code "mem")
-       (match_test "arm_coproc_ldc_stc_legitimate_address (op)")))
- 
-+(define_memory_constraint "Uo"
-+ "@internal
-+  A memory operand for Arm/Thumb-2 LDRD/STRD"
-+ (and (match_code "mem")
-+      (match_test "arm_ldrd_legitimate_address (op)")))
-+
- ;; We used to have constraint letters for S and R in ARM state, but
- ;; all uses of these now appear to have been removed.
- 
---- a/gcc/config/arm/predicates.md
-+++ b/gcc/config/arm/predicates.md
-@@ -849,6 +849,10 @@
-   (and (match_operand 0 "memory_operand")
-        (match_code "reg" "0")))
- 
-+;; True if the operand is memory reference suitable for a ldrd/strd.
-+(define_predicate "arm_ldrd_memory_operand"
-+  (match_test "arm_ldrd_legitimate_address (op)"))
-+
- ;; Predicates for parallel expanders based on mode.
- (define_special_predicate "vect_par_constant_high" 
-   (match_code "parallel")
---- a/gcc/config/arm/sync.md
-+++ b/gcc/config/arm/sync.md
-@@ -161,7 +161,7 @@
- (define_insn "arm_atomic_loaddi2_ldrd"
-   [(set (match_operand:DI 0 "register_operand" "=r")
- 	(unspec_volatile:DI
--	  [(match_operand:DI 1 "memory_operand" "m")]
-+	  [(match_operand:DI 1 "arm_ldrd_memory_operand" "Uo")]
- 	    VUNSPEC_LDRD_ATOMIC))]
-   "ARM_DOUBLEWORD_ALIGN && TARGET_HAVE_LPAE"
-   "ldrd\t%0, %H0, %1"
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/arm/pr117675.c
-@@ -0,0 +1,17 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -marm" } */
-+/* { dg-require-effective-target arm_arch_v7ve_neon_ok } */
-+/* { dg-add-options arm_arch_v7ve_neon } */
-+/* { dg-final { check-function-bodies "**" "" "" } } */
-+
-+/*
-+** f1:
-+**	add	r0, r0, r1
-+**	ldrd	r0, r1, \[r0\]
-+**	bx	lr
-+*/
-+long long f1 (char *p, int i)
-+{
-+  return __atomic_load_n ((long long *)(p + i), __ATOMIC_RELAXED);
-+}
-+
diff --git a/meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch b/meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
deleted file mode 100644
index c9bc863eea..0000000000
--- a/meta/recipes-devtools/gcc/gcc/0026-gcc-Fix-c-tweak-for-Wrange-loop-construct.patch
+++ /dev/null
@@ -1,114 +0,0 @@ 
-From 05106fea707f010779369c5d6e89787953d2976f Mon Sep 17 00:00:00 2001
-From: Sunil Dora <sunilkumar.dora@windriver.com>
-Date: Wed, 11 Dec 2024 10:04:56 -0800
-Subject: [PATCH] gcc: Fix c++: tweak for Wrange-loop-construct
-
-This commit updates the warning to use a check for "trivially constructible" instead of
-"trivially copyable." The original check was incorrect, as "trivially copyable" only applies
-to types that can be copied trivially, whereas "trivially constructible" is the correct check
-for types that can be trivially default-constructed.
-
-This change ensures the warning is more accurate and aligns with the proper type traits.
-
-LLVM accepted a similar fix:
-https://github.com/llvm/llvm-project/issues/47355
-
-PR c++/116731 [https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116731]
-
-Upstream-Status: Backport [https://gcc.gnu.org/g:6ac4e2f4b2ca9980670e7d3815a9140730df1005]
-
-Signed-off-by: Marek Polacek <polacek@redhat.com>
-Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
----
- gcc/cp/parser.cc                              |  8 ++-
- .../g++.dg/warn/Wrange-loop-construct3.C      | 57 +++++++++++++++++++
- 2 files changed, 62 insertions(+), 3 deletions(-)
- create mode 100644 gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C
-
-diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
-index 7e81c1010..8206489a2 100644
---- a/gcc/cp/parser.cc
-+++ b/gcc/cp/parser.cc
-@@ -14301,11 +14301,13 @@ warn_for_range_copy (tree decl, tree expr)
-   else if (!CP_TYPE_CONST_P (type))
-     return;
- 
--  /* Since small trivially copyable types are cheap to copy, we suppress the
--     warning for them.  64B is a common size of a cache line.  */
-+  /* Since small trivially constructible types are cheap to construct, we 
-+     suppress the warning for them.  64B is a common size of a cache line.  */
-+  tree vec = make_tree_vec (1);
-+  TREE_VEC_ELT (vec, 0) = TREE_TYPE (expr);
-   if (TREE_CODE (TYPE_SIZE_UNIT (type)) != INTEGER_CST
-       || (tree_to_uhwi (TYPE_SIZE_UNIT (type)) <= 64
--	  && trivially_copyable_p (type)))
-+	  && is_trivially_xible (INIT_EXPR, type, vec)))
-     return;
- 
-   /* If we can initialize a reference directly, suggest that to avoid the
-diff --git a/gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C b/gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C
-new file mode 100644
-index 000000000..3d9d0c908
---- /dev/null
-+++ b/gcc/testsuite/g++.dg/warn/Wrange-loop-construct3.C
-@@ -0,0 +1,57 @@
-+// PR c++/116731
-+// { dg-do compile { target c++11 } }
-+// { dg-options "-Wrange-loop-construct" }
-+
-+void
-+f0 ()
-+{
-+  struct S {
-+    char a[64];
-+    S& operator=(const S&) { return *this; };
-+  };
-+
-+  S arr[8];
-+  for (const auto r : arr)
-+    (void) r;
-+}
-+
-+void
-+f1 ()
-+{
-+  struct S {
-+    char a[65];
-+    S& operator=(const S&) { return *this; };
-+  };
-+
-+  S arr[8];
-+  for (const auto r : arr) // { dg-warning "creates a copy" }
-+    (void) r;
-+}
-+
-+void
-+f2 ()
-+{
-+  struct S {
-+    char a[64];
-+    S& operator=(const S&) { return *this; };
-+    ~S() { }
-+  };
-+
-+  S arr[8];
-+  for (const auto r : arr) // { dg-warning "creates a copy" }
-+    (void) r;
-+}
-+
-+void
-+f3 ()
-+{
-+  struct S {
-+    char a[65];
-+    S& operator=(const S&) { return *this; };
-+    ~S() { }
-+  };
-+
-+  S arr[8];
-+  for (const auto r : arr) // { dg-warning "creates a copy" }
-+    (void) r;
-+}
--- 
-2.43.0
-
diff --git a/meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch b/meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
deleted file mode 100644
index 5bede60816..0000000000
--- a/meta/recipes-devtools/gcc/gcc/0027-gcc-backport-patch-to-fix-data-relocation-to-ENDBR-s.patch
+++ /dev/null
@@ -1,447 +0,0 @@ 
-From 4e7735a8d87559bbddfe3a985786996e22241f8d Mon Sep 17 00:00:00 2001
-From: liuhongt <hongtao.liu@intel.com>
-Date: Mon, 12 Aug 2024 14:35:31 +0800
-Subject: [PATCH] Move ix86_align_loops into a separate pass and insert the
- pass after pass_endbr_and_patchable_area.
-
-gcc/ChangeLog:
-
-	PR target/116174
-	* config/i386/i386.cc (ix86_align_loops): Move this to ..
-	* config/i386/i386-features.cc (ix86_align_loops): .. here.
-	(class pass_align_tight_loops): New class.
-	(make_pass_align_tight_loops): New function.
-	* config/i386/i386-passes.def: Insert pass_align_tight_loops
-	after pass_insert_endbr_and_patchable_area.
-	* config/i386/i386-protos.h (make_pass_align_tight_loops): New
-	declare.
-
-gcc/testsuite/ChangeLog:
-
-	* gcc.target/i386/pr116174.c: New test.
-
-(cherry picked from commit c3c83d22d212a35cb1bfb8727477819463f0dcd8)
-
-Upstream-Status: Backport [https://gcc.gnu.org/git/?p=gcc.git;a=patch;h=4e7735a8d87559bbddfe3a985786996e22241f8d]
-
-Signed-off-by: Bin Lan <bin.lan.cn@windriver.com>
----
- gcc/config/i386/i386-features.cc         | 191 +++++++++++++++++++++++
- gcc/config/i386/i386-passes.def          |   3 +
- gcc/config/i386/i386-protos.h            |   1 +
- gcc/config/i386/i386.cc                  | 146 -----------------
- gcc/testsuite/gcc.target/i386/pr116174.c |  12 ++
- 5 files changed, 207 insertions(+), 146 deletions(-)
- create mode 100644 gcc/testsuite/gcc.target/i386/pr116174.c
-
-diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
-index e3e004d55267..7de19d423637 100644
---- a/gcc/config/i386/i386-features.cc
-+++ b/gcc/config/i386/i386-features.cc
-@@ -3253,6 +3253,197 @@ make_pass_remove_partial_avx_dependency (gcc::context *ctxt)
-   return new pass_remove_partial_avx_dependency (ctxt);
- }
- 
-+/* When a hot loop can be fit into one cacheline,
-+   force align the loop without considering the max skip.  */
-+static void
-+ix86_align_loops ()
-+{
-+  basic_block bb;
-+
-+  /* Don't do this when we don't know cache line size.  */
-+  if (ix86_cost->prefetch_block == 0)
-+    return;
-+
-+  loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
-+  profile_count count_threshold = cfun->cfg->count_max / param_align_threshold;
-+  FOR_EACH_BB_FN (bb, cfun)
-+    {
-+      rtx_insn *label = BB_HEAD (bb);
-+      bool has_fallthru = 0;
-+      edge e;
-+      edge_iterator ei;
-+
-+      if (!LABEL_P (label))
-+	continue;
-+
-+      profile_count fallthru_count = profile_count::zero ();
-+      profile_count branch_count = profile_count::zero ();
-+
-+      FOR_EACH_EDGE (e, ei, bb->preds)
-+	{
-+	  if (e->flags & EDGE_FALLTHRU)
-+	    has_fallthru = 1, fallthru_count += e->count ();
-+	  else
-+	    branch_count += e->count ();
-+	}
-+
-+      if (!fallthru_count.initialized_p () || !branch_count.initialized_p ())
-+	continue;
-+
-+      if (bb->loop_father
-+	  && bb->loop_father->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
-+	  && (has_fallthru
-+	      ? (!(single_succ_p (bb)
-+		   && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun))
-+		 && optimize_bb_for_speed_p (bb)
-+		 && branch_count + fallthru_count > count_threshold
-+		 && (branch_count > fallthru_count * param_align_loop_iterations))
-+	      /* In case there'no fallthru for the loop.
-+		 Nops inserted won't be executed.  */
-+	      : (branch_count > count_threshold
-+		 || (bb->count > bb->prev_bb->count * 10
-+		     && (bb->prev_bb->count
-+			 <= ENTRY_BLOCK_PTR_FOR_FN (cfun)->count / 2)))))
-+	{
-+	  rtx_insn* insn, *end_insn;
-+	  HOST_WIDE_INT size = 0;
-+	  bool padding_p = true;
-+	  basic_block tbb = bb;
-+	  unsigned cond_branch_num = 0;
-+	  bool detect_tight_loop_p = false;
-+
-+	  for (unsigned int i = 0; i != bb->loop_father->num_nodes;
-+	       i++, tbb = tbb->next_bb)
-+	    {
-+	      /* Only handle continuous cfg layout. */
-+	      if (bb->loop_father != tbb->loop_father)
-+		{
-+		  padding_p = false;
-+		  break;
-+		}
-+
-+	      FOR_BB_INSNS (tbb, insn)
-+		{
-+		  if (!NONDEBUG_INSN_P (insn))
-+		    continue;
-+		  size += ix86_min_insn_size (insn);
-+
-+		  /* We don't know size of inline asm.
-+		     Don't align loop for call.  */
-+		  if (asm_noperands (PATTERN (insn)) >= 0
-+		      || CALL_P (insn))
-+		    {
-+		      size = -1;
-+		      break;
-+		    }
-+		}
-+
-+	      if (size == -1 || size > ix86_cost->prefetch_block)
-+		{
-+		  padding_p = false;
-+		  break;
-+		}
-+
-+	      FOR_EACH_EDGE (e, ei, tbb->succs)
-+		{
-+		  /* It could be part of the loop.  */
-+		  if (e->dest == bb)
-+		    {
-+		      detect_tight_loop_p = true;
-+		      break;
-+		    }
-+		}
-+
-+	      if (detect_tight_loop_p)
-+		break;
-+
-+	      end_insn = BB_END (tbb);
-+	      if (JUMP_P (end_insn))
-+		{
-+		  /* For decoded icache:
-+		     1. Up to two branches are allowed per Way.
-+		     2. A non-conditional branch is the last micro-op in a Way.
-+		  */
-+		  if (onlyjump_p (end_insn)
-+		      && (any_uncondjump_p (end_insn)
-+			  || single_succ_p (tbb)))
-+		    {
-+		      padding_p = false;
-+		      break;
-+		    }
-+		  else if (++cond_branch_num >= 2)
-+		    {
-+		      padding_p = false;
-+		      break;
-+		    }
-+		}
-+
-+	    }
-+
-+	  if (padding_p && detect_tight_loop_p)
-+	    {
-+	      emit_insn_before (gen_max_skip_align (GEN_INT (ceil_log2 (size)),
-+						    GEN_INT (0)), label);
-+	      /* End of function.  */
-+	      if (!tbb || tbb == EXIT_BLOCK_PTR_FOR_FN (cfun))
-+		break;
-+	      /* Skip bb which already fits into one cacheline.  */
-+	      bb = tbb;
-+	    }
-+	}
-+    }
-+
-+  loop_optimizer_finalize ();
-+  free_dominance_info (CDI_DOMINATORS);
-+}
-+
-+namespace {
-+
-+const pass_data pass_data_align_tight_loops =
-+{
-+  RTL_PASS, /* type */
-+  "align_tight_loops", /* name */
-+  OPTGROUP_NONE, /* optinfo_flags */
-+  TV_MACH_DEP, /* tv_id */
-+  0, /* properties_required */
-+  0, /* properties_provided */
-+  0, /* properties_destroyed */
-+  0, /* todo_flags_start */
-+  0, /* todo_flags_finish */
-+};
-+
-+class pass_align_tight_loops : public rtl_opt_pass
-+{
-+public:
-+  pass_align_tight_loops (gcc::context *ctxt)
-+    : rtl_opt_pass (pass_data_align_tight_loops, ctxt)
-+  {}
-+
-+  /* opt_pass methods: */
-+  bool gate (function *) final override
-+    {
-+      return optimize && optimize_function_for_speed_p (cfun);
-+    }
-+
-+  unsigned int execute (function *) final override
-+    {
-+      timevar_push (TV_MACH_DEP);
-+#ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
-+      ix86_align_loops ();
-+#endif
-+      timevar_pop (TV_MACH_DEP);
-+      return 0;
-+    }
-+}; // class pass_align_tight_loops
-+
-+} // anon namespace
-+
-+rtl_opt_pass *
-+make_pass_align_tight_loops (gcc::context *ctxt)
-+{
-+  return new pass_align_tight_loops (ctxt);
-+}
-+
- /* This compares the priority of target features in function DECL1
-    and DECL2.  It returns positive value if DECL1 is higher priority,
-    negative value if DECL2 is higher priority and 0 if they are the
-diff --git a/gcc/config/i386/i386-passes.def b/gcc/config/i386/i386-passes.def
-index 7d96766f7b96..e500f15c9971 100644
---- a/gcc/config/i386/i386-passes.def
-+++ b/gcc/config/i386/i386-passes.def
-@@ -31,5 +31,8 @@ along with GCC; see the file COPYING3.  If not see
-   INSERT_PASS_BEFORE (pass_cse2, 1, pass_stv, true /* timode_p */);
- 
-   INSERT_PASS_BEFORE (pass_shorten_branches, 1, pass_insert_endbr_and_patchable_area);
-+  /* pass_align_tight_loops must be after pass_insert_endbr_and_patchable_area.
-+     PR116174.  */
-+  INSERT_PASS_BEFORE (pass_shorten_branches, 1, pass_align_tight_loops);
- 
-   INSERT_PASS_AFTER (pass_combine, 1, pass_remove_partial_avx_dependency);
-diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
-index 46214a63974d..36c7b1aed42b 100644
---- a/gcc/config/i386/i386-protos.h
-+++ b/gcc/config/i386/i386-protos.h
-@@ -419,6 +419,7 @@ extern rtl_opt_pass *make_pass_insert_endbr_and_patchable_area
-   (gcc::context *);
- extern rtl_opt_pass *make_pass_remove_partial_avx_dependency
-   (gcc::context *);
-+extern rtl_opt_pass *make_pass_align_tight_loops (gcc::context *);
- 
- extern bool ix86_has_no_direct_extern_access;
- 
-diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
-index 6f89891d3cb5..288c69467d62 100644
---- a/gcc/config/i386/i386.cc
-+++ b/gcc/config/i386/i386.cc
-@@ -23444,150 +23444,6 @@ ix86_split_stlf_stall_load ()
-     }
- }
- 
--/* When a hot loop can be fit into one cacheline,
--   force align the loop without considering the max skip.  */
--static void
--ix86_align_loops ()
--{
--  basic_block bb;
--
--  /* Don't do this when we don't know cache line size.  */
--  if (ix86_cost->prefetch_block == 0)
--    return;
--
--  loop_optimizer_init (AVOID_CFG_MODIFICATIONS);
--  profile_count count_threshold = cfun->cfg->count_max / param_align_threshold;
--  FOR_EACH_BB_FN (bb, cfun)
--    {
--      rtx_insn *label = BB_HEAD (bb);
--      bool has_fallthru = 0;
--      edge e;
--      edge_iterator ei;
--
--      if (!LABEL_P (label))
--	continue;
--
--      profile_count fallthru_count = profile_count::zero ();
--      profile_count branch_count = profile_count::zero ();
--
--      FOR_EACH_EDGE (e, ei, bb->preds)
--	{
--	  if (e->flags & EDGE_FALLTHRU)
--	    has_fallthru = 1, fallthru_count += e->count ();
--	  else
--	    branch_count += e->count ();
--	}
--
--      if (!fallthru_count.initialized_p () || !branch_count.initialized_p ())
--	continue;
--
--      if (bb->loop_father
--	  && bb->loop_father->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
--	  && (has_fallthru
--	      ? (!(single_succ_p (bb)
--		   && single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun))
--		 && optimize_bb_for_speed_p (bb)
--		 && branch_count + fallthru_count > count_threshold
--		 && (branch_count > fallthru_count * param_align_loop_iterations))
--	      /* In case there'no fallthru for the loop.
--		 Nops inserted won't be executed.  */
--	      : (branch_count > count_threshold
--		 || (bb->count > bb->prev_bb->count * 10
--		     && (bb->prev_bb->count
--			 <= ENTRY_BLOCK_PTR_FOR_FN (cfun)->count / 2)))))
--	{
--	  rtx_insn* insn, *end_insn;
--	  HOST_WIDE_INT size = 0;
--	  bool padding_p = true;
--	  basic_block tbb = bb;
--	  unsigned cond_branch_num = 0;
--	  bool detect_tight_loop_p = false;
--
--	  for (unsigned int i = 0; i != bb->loop_father->num_nodes;
--	       i++, tbb = tbb->next_bb)
--	    {
--	      /* Only handle continuous cfg layout. */
--	      if (bb->loop_father != tbb->loop_father)
--		{
--		  padding_p = false;
--		  break;
--		}
--
--	      FOR_BB_INSNS (tbb, insn)
--		{
--		  if (!NONDEBUG_INSN_P (insn))
--		    continue;
--		  size += ix86_min_insn_size (insn);
--
--		  /* We don't know size of inline asm.
--		     Don't align loop for call.  */
--		  if (asm_noperands (PATTERN (insn)) >= 0
--		      || CALL_P (insn))
--		    {
--		      size = -1;
--		      break;
--		    }
--		}
--
--	      if (size == -1 || size > ix86_cost->prefetch_block)
--		{
--		  padding_p = false;
--		  break;
--		}
--
--	      FOR_EACH_EDGE (e, ei, tbb->succs)
--		{
--		  /* It could be part of the loop.  */
--		  if (e->dest == bb)
--		    {
--		      detect_tight_loop_p = true;
--		      break;
--		    }
--		}
--
--	      if (detect_tight_loop_p)
--		break;
--
--	      end_insn = BB_END (tbb);
--	      if (JUMP_P (end_insn))
--		{
--		  /* For decoded icache:
--		     1. Up to two branches are allowed per Way.
--		     2. A non-conditional branch is the last micro-op in a Way.
--		  */
--		  if (onlyjump_p (end_insn)
--		      && (any_uncondjump_p (end_insn)
--			  || single_succ_p (tbb)))
--		    {
--		      padding_p = false;
--		      break;
--		    }
--		  else if (++cond_branch_num >= 2)
--		    {
--		      padding_p = false;
--		      break;
--		    }
--		}
--
--	    }
--
--	  if (padding_p && detect_tight_loop_p)
--	    {
--	      emit_insn_before (gen_max_skip_align (GEN_INT (ceil_log2 (size)),
--						    GEN_INT (0)), label);
--	      /* End of function.  */
--	      if (!tbb || tbb == EXIT_BLOCK_PTR_FOR_FN (cfun))
--		break;
--	      /* Skip bb which already fits into one cacheline.  */
--	      bb = tbb;
--	    }
--	}
--    }
--
--  loop_optimizer_finalize ();
--  free_dominance_info (CDI_DOMINATORS);
--}
--
- /* Implement machine specific optimizations.  We implement padding of returns
-    for K8 CPUs and pass to avoid 4 jumps in the single 16 byte window.  */
- static void
-@@ -23611,8 +23467,6 @@ ix86_reorg (void)
- #ifdef ASM_OUTPUT_MAX_SKIP_ALIGN
-       if (TARGET_FOUR_JUMP_LIMIT)
- 	ix86_avoid_jump_mispredicts ();
--
--      ix86_align_loops ();
- #endif
-     }
- }
-diff --git a/gcc/testsuite/gcc.target/i386/pr116174.c b/gcc/testsuite/gcc.target/i386/pr116174.c
-new file mode 100644
-index 000000000000..8877d0b51af1
---- /dev/null
-+++ b/gcc/testsuite/gcc.target/i386/pr116174.c
-@@ -0,0 +1,12 @@
-+/* { dg-do compile { target *-*-linux* } } */
-+/* { dg-options "-O2 -fcf-protection=branch" } */
-+
-+char *
-+foo (char *dest, const char *src)
-+{
-+  while ((*dest++ = *src++) != '\0')
-+    /* nothing */;
-+  return --dest;
-+}
-+
-+/* { dg-final { scan-assembler "\t\.cfi_startproc\n\tendbr(32|64)\n" } } */
--- 
-2.43.5
diff --git a/meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch b/meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch
deleted file mode 100644
index 5185236a3d..0000000000
--- a/meta/recipes-devtools/gcc/gcc/0028-fix-incorrect-preprocessor-line-numbers.patch
+++ /dev/null
@@ -1,475 +0,0 @@ 
-From 8cbe033a8a88fe6437cc5d343ae0ddf8dd3455c8 Mon Sep 17 00:00:00 2001
-From: Jakub Jelinek <jakub@redhat.com>
-Date: Thu, 8 May 2025 11:14:24 +0200
-Subject: libcpp: Further fixes for incorrect line numbers in large files
- [PR120061]
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-The backport of the PR108900 fix to 14 branch broke building chromium
-because static_assert (__LINE__ == expected_line_number, ""); now triggers
-as the __LINE__ values are off by one.
-This isn't the case on the trunk and 15 branch because we've switched
-to 64-bit location_t and so one actually needs far longer header files
-to trigger it.
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c11
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c12
-contain (large) testcases in patch form which show on the 14 branch
-that the first one used to fail before the PR108900 backport and now
-works correctly, while the second one attempts to match the chromium
-behavior and it used to pass before the PR108900 backport and now it
-FAILs.
-The two testcases show rare problematic cases, because
-do_include_common -> parse_include -> check_eol -> check_eol_1 ->
-cpp_get_token_1 -> _cpp_lex_token -> _cpp_lex_direct -> linemap_line_start
-triggers there
-      /* Allocate the new line_map.  However, if the current map only has a
-         single line we can sometimes just increase its column_bits instead. */
-      if (line_delta < 0
-          || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
-          || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
-          || ( /* We can't reuse the map if the line offset is sufficiently
-                  large to cause overflow when computing location_t values.  */
-              (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
-              >= (((uint64_t) 1)
-                  << (CHAR_BIT * sizeof (linenum_type) - column_bits)))
-          || range_bits < map->m_range_bits)
-        map = linemap_check_ordinary
-                (const_cast <line_map *>
-                  (linemap_add (set, LC_RENAME,
-                                ORDINARY_MAP_IN_SYSTEM_HEADER_P (map),
-                                ORDINARY_MAP_FILE_NAME (map),
-                                to_line)));
-and so creates a new ordinary map on the line right after the
-(problematic) #include line.
-Now, in the spot that r14-11679-g8a884140c2bcb7 patched,
-pfile->line_table->highest_location in all 3 tests (also
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c13
-) is before the decrement the start of the line after the #include line and so
-the decrement is really desirable in that case to put highest_location
-[jakub@tucnak gcc-15]$ git log -1 --format=%B r15-9638-gbfcb5da69a41f7a5e41faab39b763d9d7c8bd2ea | cat
-libcpp: Further fixes for incorrect line numbers in large files [PR120061]
-
-The backport of the PR108900 fix to 14 branch broke building chromium
-because static_assert (__LINE__ == expected_line_number, ""); now triggers
-as the __LINE__ values are off by one.
-This isn't the case on the trunk and 15 branch because we've switched
-to 64-bit location_t and so one actually needs far longer header files
-to trigger it.
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c11
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c12
-contain (large) testcases in patch form which show on the 14 branch
-that the first one used to fail before the PR108900 backport and now
-works correctly, while the second one attempts to match the chromium
-behavior and it used to pass before the PR108900 backport and now it
-FAILs.
-The two testcases show rare problematic cases, because
-do_include_common -> parse_include -> check_eol -> check_eol_1 ->
-cpp_get_token_1 -> _cpp_lex_token -> _cpp_lex_direct -> linemap_line_start
-triggers there
-      /* Allocate the new line_map.  However, if the current map only has a
-         single line we can sometimes just increase its column_bits instead. */
-      if (line_delta < 0
-          || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
-          || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
-          || ( /* We can't reuse the map if the line offset is sufficiently
-                  large to cause overflow when computing location_t values.  */
-              (to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
-              >= (((uint64_t) 1)
-                  << (CHAR_BIT * sizeof (linenum_type) - column_bits)))
-          || range_bits < map->m_range_bits)
-        map = linemap_check_ordinary
-                (const_cast <line_map *>
-                  (linemap_add (set, LC_RENAME,
-                                ORDINARY_MAP_IN_SYSTEM_HEADER_P (map),
-                                ORDINARY_MAP_FILE_NAME (map),
-                                to_line)));
-and so creates a new ordinary map on the line right after the
-(problematic) #include line.
-Now, in the spot that r14-11679-g8a884140c2bcb7 patched,
-pfile->line_table->highest_location in all 3 tests (also
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120061#c13
-) is before the decrement the start of the line after the #include line and so
-the decrement is really desirable in that case to put highest_location
-somewhere on the line where the #include actually is.
-But at the same time it is also undesirable, because if we do decrement it,
-then linemap_add LC_ENTER called from _cpp_do_file_change will then
-  /* Generate a start_location above the current highest_location.
-     If possible, make the low range bits be zero.  */
-  location_t start_location = set->highest_location + 1;
-  unsigned range_bits = 0;
-  if (start_location < LINE_MAP_MAX_LOCATION_WITH_COLS)
-    range_bits = set->default_range_bits;
-  start_location += (1 << range_bits) - 1;
-  start_location &=  ~((1 << range_bits) - 1);
-
-  linemap_assert (!LINEMAPS_ORDINARY_USED (set)
-                  || (start_location
-                      >= MAP_START_LOCATION (LINEMAPS_LAST_ORDINARY_MAP (set))));
-and we can end up with the new LC_ENTER ordinary map having the same
-start_location as the preceding LC_RENAME one.
-Next thing that happens is computation of included_from:
-  if (reason == LC_ENTER)
-    {
-      if (set->depth == 0)
-        map->included_from = 0;
-      else
-        /* The location of the end of the just-closed map.  */
-        map->included_from
-          = (((map[0].start_location - 1 - map[-1].start_location)
-              & ~((1 << map[-1].m_column_and_range_bits) - 1))
-             + map[-1].start_location);
-The normal case (e.g. with the testcase included at the start of this comment) is
-that map[-1] starts somewhere earlier and so map->included_from computation above
-nicely computes location_t which expands to the start of the #include line.
-With r14-11679 reverted, for #c11 as well as #c12
-map[0].start_location == map[-1].start_location above, and so it is
-((location_t) -1 & ~((1 << map[-1].m_column_and_range_bits) - 1)))
-+ map[-1].start_location,
-which happens to be start of the #include line.
-For #c11 map[0].start_location is 0x500003a0 and map[-1] has
-m_column_and_range_bits 7 and map[-2] has m_column_and_range_bits 12 and
-map[0].included_from is set to 0x50000320.
-For #c12 map[0].start_location is 0x606c0402 and map[-2].start_location is
-0x606c0400 and m_column_and_range_bits is 0 for all 3 maps.
-map[0].included_from is set to 0x606c0401.
-The last important part is again in linemap_add when doing LC_LEAVE:
-      /* (MAP - 1) points to the map we are leaving. The
-         map from which (MAP - 1) got included should be the map
-         that comes right before MAP in the same file.  */
-      from = linemap_included_from_linemap (set, map - 1);
-
-      /* A TO_FILE of NULL is special - we use the natural values.  */
-      if (to_file == NULL)
-        {
-          to_file = ORDINARY_MAP_FILE_NAME (from);
-          to_line = SOURCE_LINE (from, from[1].start_location);
-          sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
-        }
-Here it wants to compute the right to_line which ought to be the line after
-the #include directive.
-On the #c11 testcase that doesn't work correctly though, because
-map[-1].included_from is 0x50000320, from[0] for that is LC_ENTER with
-start_location 0x4080 and m_column_and_range_bits 12 but note that we've
-earlier computed map[-1].start_location + (-1 & 0xffffff80) and so only
-decreased by 7 bits, so to_line is still on the line with #include and not
-after it.  In the #c12 that doesn't happen, all the ordinary maps involved
-there had 0 m_column_and_range_bits and so this computes correct line.
-
-Below is a fix for the trunk including testcases using the
-location_overflow_plugin hack to simulate the bugs without needing huge
-files (in the 14 case it is just 330KB and almost 10MB, but in the 15
-case it would need to be far bigger).
-The pre- r15-9018 trunk has
-FAIL: gcc.dg/plugin/location-overflow-test-pr116047.c -fplugin=./location_overflow_plugin.so  scan-file static_assert[^\n\r]*6[^\n\r]*== 6
-and current trunk
-FAIL: gcc.dg/plugin/location-overflow-test-pr116047.c -fplugin=./location_overflow_plugin.so  scan-file static_assert[^\n\r]*6[^\n\r]*== 6
-FAIL: gcc.dg/plugin/location-overflow-test-pr120061.c -fplugin=./location_overflow_plugin.so  scan-file static_assert[^\n\r]*5[^\n\r]*== 5
-and with the patch everything PASSes.
-
-The patch reverts the r14-11679 change, because it is incorrect,
-we really need to decrement it even when crossing ordinary map
-boundaries, so that the location is not on the line after the #include
-line but somewhere on the #include line.  It also patches two spots
-in linemap_add mentioned above to make sure we get correct locations
-both in the included_from location_t when doing LC_ENTER (second
-line-map.cc hunk) and when doing LC_LEAVE to compute the right to_line
-(first line-map.cc hunk), both in presence of an added LC_RENAME
-with the same start_location as the following LC_ENTER (i.e. the
-problematic cases).
-The LC_ENTER hunk is mostly to ensure included_form location_t is
-at the start of the #include line (column 0), without it we can
-decrease include_from not enough and end up at some random column
-in the middle of the line, because it is masking away
-map[-1].m_column_and_range_bits bits even when in the end the resulting
-include_from location_t will be found in map[-2] map with perhaps
-different m_column_and_range_bits.  That alone doesn't fix the bug
-though.
-The more important is the LC_LEAVE hunk and the problem there is
-caused by linemap_line_start not actually doing
-    r = set->highest_line + (line_delta << map->m_column_and_range_bits);
-when adding a new map (the LC_RENAME one because we need to switch to
-different number of directly encoded ranges, or columns, etc.).
-So, in the original PR108900 case that
-  to_line = SOURCE_LINE (from, from[1].start_location);
-doesn't do the right thing, from there is the last < 0x50000000 map
-with m_column_and_range_bits 12, from[1] is the first one above it
-and map[-1].included_from is the correct location of column 0 on
-the #include line, but as the new LC_RENAME map has been created without
-actually increasing highest_location to be on the new line (we've just
-set to_line of the new LC_RENAME map to the correct line),
-  to_line = SOURCE_LINE (from, from[1].start_location);
-stays on the same source line.  I've tried to just replace that with
-  to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
-i.e. just find out the #include line from map[-1].included_from and
-add 1 to it, unfortunately that breaks the
-c-c++-common/cpp/line-4.c
-test where we expect to stay on the same 0 line for LC_LEAVE from
-<command line> and gcc.dg/cpp/trad/Wunused.c, gcc.dg/cpp/trad/builtins.c
-and c-c++-common/analyzer/named-constants-via-macros-traditional.c tests
-all with -traditional-cpp preprocessing where to_line is also off-by-one
-from the expected one.
-So, this patch instead conditionalizes it, uses the
-  to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
-way only if from[1] is a LC_RENAME map (rather than the usual
-LC_ENTER one), that should limit it to the problematic cases of when
-parse_include peeked after EOL and had to create LC_RENAME map with
-the same start_location as the LC_ENTER after it.
-
-Some further justification for the LC_ENTER hunk, using the
-https://gcc.gnu.org/pipermail/gcc-patches/2025-May/682774.html testcase
-(old is 14 before r14-11679, vanilla current 14 and new with the 14 patch)
-I get
-$ /usr/src/gcc-14/obj/gcc/cc1.old -quiet -std=c23 pr116047.c -nostdinc
-In file included from pr116047-1.h:327677:21,
-                 from pr116047.c:4:
-pr116047-2.h:1:1: error: unknown type name ‘a’
-    1 | a b c;
-      | ^
-pr116047-2.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’
-    1 | a b c;
-      |     ^
-pr116047-1.h:327677:1: error: static assertion failed: ""
-327677 | #include "pr116047-2.h"
-       | ^~~~~~~~~~~~~
-$ /usr/src/gcc-14/obj/gcc/cc1.vanilla -quiet -std=c23 pr116047.c -nostdinc
-In file included from pr116047-1.h:327678,
-                 from pr116047.c:4:
-pr116047-2.h:1:1: error: unknown type name ‘a’
-    1 | a b c;
-      | ^
-pr116047-2.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’
-    1 | a b c;
-      |     ^
-$ /usr/src/gcc-14/obj/gcc/cc1.new -quiet -std=c23 pr116047.c -nostdinc
-In file included from pr116047-1.h:327677,
-                 from pr116047.c:4:
-pr116047-2.h:1:1: error: unknown type name ‘a’
-    1 | a b c;
-      | ^
-pr116047-2.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’
-    1 | a b c;
-      |     ^
-
-pr116047-1.h has on lines 327677+327678:
- #include "pr116047-2.h"
- static_assert (__LINE__ == 327678, "");
-so the static_assert failure is something that was dealt mainly in the
-LC_LEAVE hunk and files.cc reversion, but please have a look at the
-In file included from lines.
-14.2 emits correct line (#include "pr116047-2.h" is indeed on line
-327677) but some random column in there (which is not normally printed
-for smaller headers; 21 is the . before extension in the filename).
-Current trunk emits incorrect line (327678 instead of 327677, clearly
-it didn't decrement).
-And the patched compiler emits the right line with no column, as would
-be printed if I remove e.g. 300000 newlines from the file.
-
-2025-05-08  Jakub Jelinek  <jakub@redhat.com>
-
-	PR preprocessor/108900
-	PR preprocessor/116047
-	PR preprocessor/120061
-	* files.cc (_cpp_stack_file): Revert 2025-03-28 change.
-	* line-map.cc (linemap_add): Use
-	SOURCE_LINE (from, linemap_included_from (map - 1)) + 1; instead of
-	SOURCE_LINE (from, from[1].start_location); to compute to_line
-	for LC_LEAVE if from[1].reason is LC_RENAME.  For LC_ENTER
-	included_from computation, look at map[-2] or even lower if map[-1]
-	has the same start_location as map[0].
-
-	* gcc.dg/plugin/plugin.exp: Add location-overflow-test-pr116047.c
-	and location-overflow-test-pr120061.c.
-	* gcc.dg/plugin/location_overflow_plugin.c (plugin_init): Don't error
-	on unknown values, instead just break.
-	* gcc.dg/plugin/location-overflow-test-pr116047.c: New test.
-	* gcc.dg/plugin/location-overflow-test-pr116047-1.h: New test.
-	* gcc.dg/plugin/location-overflow-test-pr116047-2.h: New test.
-	* gcc.dg/plugin/location-overflow-test-pr120061.c: New test.
-	* gcc.dg/plugin/location-overflow-test-pr120061-1.h: New test.
-	* gcc.dg/plugin/location-overflow-test-pr120061-2.h: New test.
-
-Upstream-Status: Backport [https://gcc.gnu.org/cgit/gcc/commit/?id=edf745dc519ddbfef127e2789bf11bfbacd300b7]
-Signed-off-by: Yash Shinde <Yash.Shinde@windriver.com>
----
- .../plugin/location-overflow-test-pr116047-1.h     |  6 +++
- .../plugin/location-overflow-test-pr116047-2.h     |  1 +
- .../plugin/location-overflow-test-pr116047.c       |  5 +++
- .../plugin/location-overflow-test-pr120061-1.h     |  6 +++
- .../plugin/location-overflow-test-pr120061-2.h     |  1 +
- .../plugin/location-overflow-test-pr120061.c       |  6 +++
- .../gcc.dg/plugin/location_overflow_plugin.c       |  2 +-
- gcc/testsuite/gcc.dg/plugin/plugin.exp             |  4 +-
- libcpp/line-map.cc                                 | 48 ++++++++++++++++++----
- 10 files changed, 69 insertions(+), 18 deletions(-)
- create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
- create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
- create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
- create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
- create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
- create mode 100644 gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
-
-diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
-new file mode 100644
-index 000000000000..3dd6434a938b
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-1.h
-@@ -0,0 +1,6 @@
-+
-+
-+
-+
-+#include "location-overflow-test-pr116047-2.h"
-+static_assert (__LINE__ == 6, "");
-diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
-new file mode 100644
-index 000000000000..048f715b4656
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047-2.h
-@@ -0,0 +1 @@
-+int i;
-diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
-new file mode 100644
-index 000000000000..33f2c4ce8def
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr116047.c
-@@ -0,0 +1,5 @@
-+/* PR preprocessor/116047 */
-+/* { dg-do preprocess } */
-+/* { dg-options "-nostdinc -std=c23 -fplugin-arg-location_overflow_plugin-value=0x4fff8080" } */
-+#include "location-overflow-test-pr116047-1.h"
-+/* { dg-final { scan-file location-overflow-test-pr116047.i "static_assert\[^\n\r]\*6\[^\n\r]\*== 6" } } */
-diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
-new file mode 100644
-index 000000000000..ebf7704f568e
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-1.h
-@@ -0,0 +1,6 @@
-+
-+
-+
-+
-+#include "location-overflow-test-pr120061-2.h"
-+
-diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
-new file mode 100644
-index 000000000000..048f715b4656
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061-2.h
-@@ -0,0 +1 @@
-+int i;
-diff --git a/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
-new file mode 100644
-index 000000000000..e8e803898da3
---- /dev/null
-+++ b/gcc/testsuite/gcc.dg/plugin/location-overflow-test-pr120061.c
-@@ -0,0 +1,6 @@
-+/* PR preprocessor/120061 */
-+/* { dg-do preprocess } */
-+/* { dg-options "-nostdinc -std=c23 -fplugin-arg-location_overflow_plugin-value=0x61000000" } */
-+#include "location-overflow-test-pr120061-1.h"
-+static_assert (__LINE__ == 5, "");
-+/* { dg-final { scan-file location-overflow-test-pr120061.i "static_assert\[^\n\r]\*5\[^\n\r]\*== 5" } } */
-diff --git a/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c b/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
-index d0a6b0755648..6f4497a1cb16 100644
---- a/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
-+++ b/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.c
-@@ -101,7 +101,7 @@ plugin_init (struct plugin_name_args *plugin_info,
-       break;
- 
-     default:
--      error_at (UNKNOWN_LOCATION, "unrecognized value for plugin argument");
-+      break;
-     }
- 
-   return 0;
-diff --git a/gcc/testsuite/gcc.dg/plugin/plugin.exp b/gcc/testsuite/gcc.dg/plugin/plugin.exp
-index 933f9a5850bc..438c6d87aad9 100644
---- a/gcc/testsuite/gcc.dg/plugin/plugin.exp
-+++ b/gcc/testsuite/gcc.dg/plugin/plugin.exp
-@@ -126,7 +126,9 @@ set plugin_test_list [list \
-     { location_overflow_plugin.c \
- 	  location-overflow-test-1.c \
- 	  location-overflow-test-2.c \
--	  location-overflow-test-pr83173.c } \
-+	  location-overflow-test-pr83173.c \
-+	  location-overflow-test-pr116047.c \
-+	  location-overflow-test-pr120061.c } \
-     { must_tail_call_plugin.c \
- 	  must-tail-call-1.c \
- 	  must-tail-call-2.c } \
-diff --git a/libcpp/line-map.cc b/libcpp/line-map.cc
-index d5200b317eee..1e659638d9f7 100644
---- a/libcpp/line-map.cc
-+++ b/libcpp/line-map.cc
-@@ -618,8 +618,8 @@ linemap_add (line_maps *set, enum lc_reason reason,
- 	 #include "included", inside the same "includer" file.  */
- 
-       linemap_assert (!MAIN_FILE_P (map - 1));
--      /* (MAP - 1) points to the map we are leaving. The
--	 map from which (MAP - 1) got included should be the map
-+      /* (MAP - 1) points to the map we are leaving.  The
-+	 map from which (MAP - 1) got included should be usually the map
- 	 that comes right before MAP in the same file.  */
-       from = linemap_included_from_linemap (set, map - 1);
- 
-@@ -627,7 +627,24 @@ linemap_add (line_maps *set, enum lc_reason reason,
-       if (to_file == NULL)
- 	{
- 	  to_file = ORDINARY_MAP_FILE_NAME (from);
--	  to_line = SOURCE_LINE (from, from[1].start_location);
-+	  /* Compute the line on which the map resumes, for #include this
-+	     should be the line after the #include line.  Usually FROM is
-+	     the map right before LC_ENTER map - the first map of the included
-+	     file, and in that case SOURCE_LINE (from, from[1].start_location);
-+	     computes the right line (and does handle even some special cases
-+	     (e.g. where for returning from <command line> we still want to
-+	     be at line 0 or some -traditional-cpp cases).  In rare cases
-+	     FROM can be followed by LC_RENAME created by linemap_line_start
-+	     for line right after #include line.  If that happens,
-+	     start_location of the FROM[1] map will be the same as
-+	     start_location of FROM[2] LC_ENTER, but FROM[1] start_location
-+	     might not have advance enough for moving to a full next line.
-+	     In that case compute the line of #include line and add 1 to it
-+	     to advance to the next line.  See PR120061.  */
-+	  if (from[1].reason == LC_RENAME)
-+	    to_line = SOURCE_LINE (from, linemap_included_from (map - 1)) + 1;
-+	  else
-+	    to_line = SOURCE_LINE (from, from[1].start_location);
- 	  sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
- 	}
-       else
-@@ -657,11 +674,26 @@ linemap_add (line_maps *set, enum lc_reason reason,
-       if (set->depth == 0)
- 	map->included_from = 0;
-       else
--	/* The location of the end of the just-closed map.  */
--	map->included_from
--	  = (((map[0].start_location - 1 - map[-1].start_location)
--	      & ~((1 << map[-1].m_column_and_range_bits) - 1))
--	     + map[-1].start_location);
-+	{
-+	  /* Compute location from whence this line map was included.
-+	     For #include this should be preferrably column 0 of the
-+	     line on which #include directive appears.
-+	     map[-1] is the just closed map and usually included_from
-+	     falls within that map.  In rare cases linemap_line_start
-+	     can insert a new LC_RENAME map for the line immediately
-+	     after #include line, in that case map[-1] will have the
-+	     same start_location as the new one and so included_from
-+	     would not be from map[-1] but likely map[-2].  If that
-+	     happens, mask off map[-2] m_column_and_range_bits bits
-+	     instead of map[-1].  See PR120061.  */
-+	  int i = -1;
-+	  while (map[i].start_location == map[0].start_location)
-+	    --i;
-+	  map->included_from
-+	    = (((map[0].start_location - 1 - map[i].start_location)
-+		& ~((1 << map[i].m_column_and_range_bits) - 1))
-+	       + map[i].start_location);
-+	}
-       set->depth++;
-       if (set->trace_includes)
- 	trace_include (set, map);
--- 
diff --git a/meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch b/meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
deleted file mode 100644
index e5abdcc703..0000000000
--- a/meta/recipes-devtools/gcc/gcc/gcc.git-ab884fffe3fc82a710bea66ad651720d71c938b8.patch
+++ /dev/null
@@ -1,549 +0,0 @@ 
-From ab884fffe3fc82a710bea66ad651720d71c938b8 Mon Sep 17 00:00:00 2001
-From: Jonathan Wakely <jwakely@redhat.com>
-Date: Tue, 30 Apr 2024 09:52:13 +0100
-Subject: [PATCH] libstdc++: Fix std::chrono::tzdb to work with vanguard format
-
-I found some issues in the std::chrono::tzdb parser by testing the
-tzdata "vanguard" format, which uses new features that aren't enabled in
-the "main" and "rearguard" data formats.
-
-Since 2024a the keyword "minimum" is no longer valid for the FROM and TO
-fields in a Rule line, which means that "m" is now a valid abbreviation
-for "maximum". Previously we expected either "mi" or "ma". For backwards
-compatibility, a FROM field beginning with "mi" is still supported and
-is treated as 1900. The "maximum" keyword is only allowed in TO now,
-because it makes no sense in FROM. To support these changes the
-minmax_year and minmax_year2 classes for parsing FROM and TO are
-replaced with a single years_from_to class that reads both fields.
-
-The vanguard format makes use of %z in Zone FORMAT fields, which caused
-an exception to be thrown from ZoneInfo::set_abbrev because no % or /
-characters were expected when a Zone doesn't use a named Rule. The
-ZoneInfo::to(sys_info&) function now uses format_abbrev_str to replace
-any %z with the current offset. Although format_abbrev_str also checks
-for %s and STD/DST formats, those only make sense when a named Rule is
-in effect, so won't occur when ZoneInfo::to(sys_info&) is used.
-
-Since making this change on trunk, the tzdata-2024b release started
-using %z in the main format, not just vanguard. This makes a backport to
-release branches necessary (see PR 116657).
-
-This change also implements a feature that has always been missing from
-time_zone::_M_get_sys_info: finding the Rule that is active before the
-specified time point, so that we can correctly handle %s in the FORMAT
-for the first new sys_info that gets created. This requires implementing
-a poorly documented feature of zic, to get the LETTERS field from a
-later transition, as described at
-https://mm.icann.org/pipermail/tz/2024-April/058891.html
-In order for this to work we need to be able to distinguish an empty
-letters field (as used by CE%sT where the variable part is either empty
-or "S") from "the letters field is not known for this transition". The
-tzdata file uses "-" for an empty letters field, which libstdc++ was
-previously replacing with "" when the Rule was parsed. Instead, we now
-preserve the "-" in the Rule object, so that "" can be used for the case
-where we don't know the letters (and so need to decide it).
-
-(cherry picked from commit 0ca8d56f2085715f27ee536c6c344bc47af49cdd)
-
-Upstream-Status: Backport [https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=5ceea2ac106d6dd1aa8175670b15a801316cf1c9]
-
-Signed-off-by: Markus Volk <f_l_k@t-online.de>
----
- libstdc++-v3/src/c++20/tzdb.cc                | 265 +++++++++++-------
- .../std/time/time_zone/sys_info_abbrev.cc     | 106 +++++++
- libstdc++-v3/testsuite/std/time/tzdb/1.cc     |   6 +-
- 3 files changed, 274 insertions(+), 103 deletions(-)
- create mode 100644 libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
-
-diff --git a/libstdc++-v3/src/c++20/tzdb.cc b/libstdc++-v3/src/c++20/tzdb.cc
-index c7c7cc9deee6..7e8cce7ce8cf 100644
---- a/libstdc++-v3/src/c++20/tzdb.cc
-+++ b/libstdc++-v3/src/c++20/tzdb.cc
-@@ -342,51 +342,103 @@ namespace std::chrono
-       friend istream& operator>>(istream&, on_day&);
-     };
- 
--    // Wrapper for chrono::year that reads a year, or one of the keywords
--    // "minimum" or "maximum", or an unambiguous prefix of a keyword.
--    struct minmax_year
-+    // Wrapper for two chrono::year values, which reads the FROM and TO
-+    // fields of a Rule line. The FROM field is a year and TO is a year or
-+    // one of the keywords "maximum" or "only" (or an abbreviation of those).
-+    // For backwards compatibility, the keyword "minimum" is recognized
-+    // for FROM and interpreted as 1900.
-+    struct years_from_to
-     {
--      year& y;
-+      year& from;
-+      year& to;
- 
--      friend istream& operator>>(istream& in, minmax_year&& y)
-+      friend istream& operator>>(istream& in, years_from_to&& yy)
-       {
--	if (ws(in).peek() == 'm') // keywords "minimum" or "maximum"
-+	string s;
-+	auto c = ws(in).peek();
-+	if (c == 'm') [[unlikely]] // keyword "minimum"
- 	  {
--	    string s;
--	    in >> s; // extract the rest of the word, but only look at s[1]
--	    if (s[1] == 'a')
--	      y.y = year::max();
--	    else if (s[1] == 'i')
--	      y.y = year::min();
--	    else
--	      in.setstate(ios::failbit);
-+	    in >> s; // extract the rest of the word
-+	    yy.from = year(1900);
-+	  }
-+	else if (int num = 0; in >> num) [[likely]]
-+	  yy.from = year{num};
-+
-+	c = ws(in).peek();
-+	if (c == 'm') // keyword "maximum"
-+	  {
-+	    in >> s; // extract the rest of the word
-+	    yy.to = year::max();
-+	  }
-+	else if (c == 'o') // keyword "only"
-+	  {
-+	    in >> s; // extract the rest of the word
-+	    yy.to = yy.from;
- 	  }
- 	else if (int num = 0; in >> num)
--	  y.y = year{num};
-+	  yy.to = year{num};
-+
- 	return in;
-       }
-     };
- 
--    // As above for minmax_year, but also supports the keyword "only",
--    // meaning that the TO year is the same as the FROM year.
--    struct minmax_year2
-+    bool
-+    select_std_or_dst_abbrev(string& abbrev, minutes save)
-     {
--      minmax_year to;
--      year from;
-+      if (size_t pos = abbrev.find('/'); pos != string::npos)
-+	{
-+	  // Select one of "STD/DST" for standard or daylight.
-+	  if (save == 0min)
-+	    abbrev.erase(pos);
-+	  else
-+	    abbrev.erase(0, pos + 1);
-+	  return true;
-+	}
-+      return false;
-+    }
- 
--      friend istream& operator>>(istream& in, minmax_year2&& y)
--      {
--	if (ws(in).peek() == 'o') // keyword "only"
--	  {
--	    string s;
--	    in >> s; // extract the whole keyword
--	    y.to.y = y.from;
--	  }
--	else
--	  in >> std::move(y.to);
--	return in;
--      }
--    };
-+    // Set the sys_info::abbrev string by expanding any placeholders.
-+    void
-+    format_abbrev_str(sys_info& info, string_view letters = {})
-+    {
-+      if (size_t pos = info.abbrev.find('%'); pos != string::npos)
-+	{
-+	  if (info.abbrev[pos + 1] == 's')
-+	    {
-+	      // Expand "%s" to the variable part, given by Rule::letters.
-+	      if (letters == "-")
-+		info.abbrev.erase(pos, 2);
-+	      else
-+		info.abbrev.replace(pos, 2, letters);
-+	    }
-+	  else if (info.abbrev[pos + 1] == 'z')
-+	    {
-+	      // Expand "%z" to the UT offset as +/-hh, +/-hhmm, or +/-hhmmss.
-+	      hh_mm_ss<seconds> t(info.offset);
-+	      string z(1, "+-"[t.is_negative()]);
-+	      long val = t.hours().count();
-+	      int digits = 2;
-+	      if (int m = t.minutes().count())
-+		{
-+		  digits = 4;
-+		  val *= 100;
-+		  val += m;
-+		  if (int s = t.seconds().count())
-+		    {
-+		      digits = 6;
-+		      val *= 100;
-+		      val += s;
-+		    }
-+		}
-+	      auto sval = std::to_string(val);
-+	      z += string(digits - sval.size(), '0');
-+	      z += sval;
-+	      info.abbrev.replace(pos, 2, z);
-+	    }
-+	}
-+      else
-+	select_std_or_dst_abbrev(info.abbrev, info.save);
-+    }
- 
-     // A time zone information record.
-     // Zone  NAME        STDOFF  RULES   FORMAT  [UNTIL]
-@@ -462,6 +514,7 @@ namespace std::chrono
- 	info.offset = offset();
- 	info.save = minutes(m_save);
- 	info.abbrev = format();
-+	format_abbrev_str(info); // expand %z
- 	return true;
-       }
- 
-@@ -469,12 +522,9 @@ namespace std::chrono
-       friend class time_zone;
- 
-       void
--      set_abbrev(const string& abbrev)
-+      set_abbrev(string abbrev)
-       {
--	// In practice, the FORMAT field never needs expanding here.
--	if (abbrev.find_first_of("/%") != abbrev.npos)
--	  __throw_runtime_error("std::chrono::time_zone: invalid data");
--	m_buf = abbrev;
-+	m_buf = std::move(abbrev);
- 	m_pos = 0;
- 	m_expanded = true;
-       }
-@@ -544,9 +594,7 @@ namespace std::chrono
- 
- 	// Rule  NAME  FROM  TO  TYPE  IN  ON  AT  SAVE  LETTER/S
- 
--	in >> quoted(rule.name)
--	   >> minmax_year{rule.from}
--	   >> minmax_year2{rule.to, rule.from};
-+	in >> quoted(rule.name) >> years_from_to{rule.from, rule.to};
- 
- 	if (char type; in >> type && type != '-')
- 	  in.setstate(ios::failbit);
-@@ -557,7 +605,7 @@ namespace std::chrono
- 	if (save_time.indicator != at_time::Wall)
- 	  {
- 	    // We don't actually store the save_time.indicator, because we
--	    // assume that it's always deducable from the actual offset value.
-+	    // assume that it's always deducible from the offset value.
- 	    auto expected = save_time.time == 0s
- 			      ? at_time::Standard
- 			      : at_time::Daylight;
-@@ -567,8 +615,6 @@ namespace std::chrono
- 	rule.save = save_time.time;
- 
- 	in >> rule.letters;
--	if (rule.letters == "-")
--	  rule.letters.clear();
- 	return in;
-       }
- 
-@@ -719,58 +765,6 @@ namespace std::chrono
- #endif // TZDB_DISABLED
-   };
- 
--#ifndef TZDB_DISABLED
--  namespace
--  {
--    bool
--    select_std_or_dst_abbrev(string& abbrev, minutes save)
--    {
--      if (size_t pos = abbrev.find('/'); pos != string::npos)
--	{
--	  // Select one of "STD/DST" for standard or daylight.
--	  if (save == 0min)
--	    abbrev.erase(pos);
--	  else
--	    abbrev.erase(0, pos + 1);
--	  return true;
--	}
--      return false;
--    }
--
--    // Set the sys_info::abbrev string by expanding any placeholders.
--    void
--    format_abbrev_str(sys_info& info, string_view letters = {})
--    {
--      if (size_t pos = info.abbrev.find("%s"); pos != string::npos)
--	{
--	  // Expand "%s" to the variable part, given by Rule::letters.
--	  info.abbrev.replace(pos, 2, letters);
--	}
--      else if (size_t pos = info.abbrev.find("%z"); pos != string::npos)
--	{
--	  // Expand "%z" to the UT offset as +/-hh, +/-hhmm, or +/-hhmmss.
--	  hh_mm_ss<seconds> t(info.offset);
--	  string z(1, "+-"[t.is_negative()]);
--	  long val = t.hours().count();
--	  if (minutes m = t.minutes(); m != m.zero())
--	    {
--	      val *= 100;
--	      val += m.count();
--	      if (seconds s = t.seconds(); s != s.zero())
--		{
--		  val *= 100;
--		  val += s.count();
--		}
--	    }
--	  z += std::to_string(val);
--	  info.abbrev.replace(pos, 2, z);
--	}
--      else
--	select_std_or_dst_abbrev(info.abbrev, info.save);
--    }
--  }
--#endif // TZDB_DISABLED
--
-   // Implementation of std::chrono::time_zone::get_info(const sys_time<D>&)
-   sys_info
-   time_zone::_M_get_sys_info(sys_seconds tp) const
-@@ -839,12 +833,72 @@ namespace std::chrono
-     info.abbrev = ri.format();
- 
-     string_view letters;
--    if (i != infos.begin())
-+    if (i != infos.begin() && i[-1].expanded())
-+      letters = i[-1].next_letters();
-+
-+    if (letters.empty())
-       {
--	if (i[-1].expanded())
--	  letters = i[-1].next_letters();
--	// XXX else need to find Rule active before this time and use it
--	// to know the initial offset, save, and letters.
-+	sys_seconds t = info.begin - seconds(1);
-+	const year_month_day date(chrono::floor<days>(t));
-+
-+	// Try to find a Rule active before this time, to get initial
-+	// SAVE and LETTERS values. There may not be a Rule for the period
-+	// before the first DST transition, so find the earliest DST->STD
-+	// transition and use the LETTERS from that.
-+	const Rule* active_rule = nullptr;
-+	sys_seconds active_rule_start = sys_seconds::min();
-+	const Rule* first_std = nullptr;
-+	for (const auto& rule : rules)
-+	  {
-+	    if (rule.save == minutes(0))
-+	      {
-+		if (!first_std)
-+		  first_std = &rule;
-+		else if (rule.from < first_std->from)
-+		  first_std = &rule;
-+		else if (rule.from == first_std->from)
-+		  {
-+		    if (rule.start_time(rule.from, {})
-+			  < first_std->start_time(first_std->from, {}))
-+		      first_std = &rule;
-+		  }
-+	      }
-+
-+	    year y = date.year();
-+
-+	    if (y > rule.to) // rule no longer applies at time t
-+	      continue;
-+	    if (y < rule.from) // rule doesn't apply yet at time t
-+	      continue;
-+
-+	    sys_seconds rule_start;
-+
-+	    seconds offset{}; // appropriate for at_time::Universal
-+	    if (rule.when.indicator == at_time::Wall)
-+	      offset = info.offset;
-+	    else if (rule.when.indicator == at_time::Standard)
-+	      offset = ri.offset();
-+
-+	    // Time the rule takes effect this year:
-+	    rule_start = rule.start_time(y, offset);
-+
-+	    if (rule_start >= t && rule.from < y)
-+	      {
-+		// Try this rule in the previous year.
-+		rule_start = rule.start_time(--y, offset);
-+	      }
-+
-+	    if (active_rule_start < rule_start && rule_start < t)
-+	      {
-+		active_rule_start = rule_start;
-+		active_rule = &rule;
-+	      }
-+	  }
-+
-+	if (active_rule)
-+	  letters = active_rule->letters;
-+	else if (first_std)
-+	  letters = first_std->letters;
-       }
- 
-     const Rule* curr_rule = nullptr;
-@@ -2069,9 +2123,11 @@ namespace std::chrono
- 	      istringstream in2(std::move(rules));
- 	      in2 >> rules_time;
- 	      inf.m_save = duration_cast<minutes>(rules_time.time);
-+	      // If the FORMAT is "STD/DST" then we can choose the right one
-+	      // now, so that we store a shorter string.
- 	      select_std_or_dst_abbrev(fmt, inf.m_save);
- 	    }
--	  inf.set_abbrev(fmt);
-+	  inf.set_abbrev(std::move(fmt));
- 	}
- 
-       // YEAR [MONTH [DAY [TIME]]]
-@@ -2082,7 +2138,12 @@ namespace std::chrono
- 	  abbrev_month m{January};
- 	  int d = 1;
- 	  at_time t{};
-+	  // XXX DAY should support ON format, e.g. lastSun or Sun>=8
- 	  in >> m >> d >> t;
-+	  // XXX UNTIL field should be interpreted
-+	  // "using the rules in effect just before the transition"
-+	  // so might need to store as year_month_day and hh_mm_ss and only
-+	  // convert to a sys_time once we know the offset in effect.
- 	  inf.m_until = sys_days(year(y)/m.m/day(d)) + seconds(t.time);
- 	}
-       else
-diff --git a/libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc b/libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
-new file mode 100644
-index 000000000000..f1a8fff02f58
---- /dev/null
-+++ b/libstdc++-v3/testsuite/std/time/time_zone/sys_info_abbrev.cc
-@@ -0,0 +1,106 @@
-+// { dg-do run { target c++20 } }
-+// { dg-require-effective-target tzdb }
-+// { dg-require-effective-target cxx11_abi }
-+// { dg-xfail-run-if "no weak override on AIX" { powerpc-ibm-aix* } }
-+
-+#include <chrono>
-+#include <fstream>
-+#include <testsuite_hooks.h>
-+
-+static bool override_used = false;
-+
-+namespace __gnu_cxx
-+{
-+  const char* zoneinfo_dir_override() {
-+    override_used = true;
-+    return "./";
-+  }
-+}
-+
-+using namespace std::chrono;
-+
-+void
-+test_format()
-+{
-+  std::ofstream("tzdata.zi") << R"(# version test_1
-+Zone Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u
-+                   -1      - %z  1975
-+                   0       - GMT
-+Zon Some/Zone 1:2:3   - %z 1900
-+              1:23:45 - %z 1950
-+Zo Another/Zone 1:2:3 -     AZ0     1901
-+                1     Roolz A%sZ    2000
-+                1     Roolz SAZ/DAZ 2005
-+                1     Roolz %z
-+Rule Roolz 1950 max - April 1 2 1 D
-+Rul  Roolz 1950 max - Oct   1 1 0 S
-+Z Strange/Zone 1       - X%sX    1980
-+               1       - FOO/BAR 1990
-+               2:00    - %zzz    1995
-+               0:9     - %zzz    1996
-+               0:8:7   - %zzz    1997
-+               0:6:5.5 - %zzz    1998
-+)";
-+
-+  const auto& db = reload_tzdb();
-+  VERIFY( override_used ); // If this fails then XFAIL for the target.
-+  VERIFY( db.version == "test_1" );
-+
-+  // Test formatting %z as
-+  auto tz = locate_zone("Africa/Bissau");
-+  auto inf = tz->get_info(sys_days(1974y/1/1));
-+  VERIFY( inf.abbrev == "-01" );
-+
-+  tz = locate_zone("Some/Zone");
-+  inf = tz->get_info(sys_days(1899y/1/1));
-+  VERIFY( inf.abbrev == "+010203" );
-+  inf = tz->get_info(sys_days(1955y/1/1));
-+  VERIFY( inf.abbrev == "+012345" );
-+
-+  tz = locate_zone("Another/Zone");
-+  // Test formatting %s as the LETTER/S field from the active Rule.
-+  inf = tz->get_info(sys_days(1910y/January/1));
-+  VERIFY( inf.abbrev == "ASZ" );
-+  inf = tz->get_info(sys_days(1950y/January/1));
-+  VERIFY( inf.abbrev == "ASZ" );
-+  inf = tz->get_info(sys_days(1950y/June/1));
-+  VERIFY( inf.abbrev == "ADZ" );
-+  inf = tz->get_info(sys_days(1999y/January/1));
-+  VERIFY( inf.abbrev == "ASZ" );
-+  inf = tz->get_info(sys_days(1999y/July/1));
-+  VERIFY( inf.abbrev == "ADZ" );
-+  // Test formatting STD/DST according to the active Rule.
-+  inf = tz->get_info(sys_days(2000y/January/2));
-+  VERIFY( inf.abbrev == "SAZ" );
-+  inf = tz->get_info(sys_days(2001y/January/1));
-+  VERIFY( inf.abbrev == "SAZ" );
-+  inf = tz->get_info(sys_days(2001y/July/1));
-+  VERIFY( inf.abbrev == "DAZ" );
-+  // Test formatting %z as the offset determined by the active Rule.
-+  inf = tz->get_info(sys_days(2005y/January/2));
-+  VERIFY( inf.abbrev == "+01" );
-+  inf = tz->get_info(sys_days(2006y/January/1));
-+  VERIFY( inf.abbrev == "+01" );
-+  inf = tz->get_info(sys_days(2006y/July/1));
-+  VERIFY( inf.abbrev == "+02" );
-+
-+  // Test formatting %z, %s and S/D for a Zone with no associated Rules.
-+  tz = locate_zone("Strange/Zone");
-+  inf = tz->get_info(sys_days(1979y/January/1));
-+  VERIFY( inf.abbrev == "XX" ); // No Rule means nothing to use for %s.
-+  inf = tz->get_info(sys_days(1981y/July/1));
-+  VERIFY( inf.abbrev == "FOO" ); // Always standard time means first string.
-+  inf = tz->get_info(sys_days(1994y/July/1));
-+  VERIFY( inf.abbrev == "+02zz" );
-+  inf = tz->get_info(sys_days(1995y/July/1));
-+  VERIFY( inf.abbrev == "+0009zz" );
-+  inf = tz->get_info(sys_days(1996y/July/1));
-+  VERIFY( inf.abbrev == "+000807zz" );
-+  inf = tz->get_info(sys_days(1997y/July/1));
-+  VERIFY( inf.abbrev == "+000606zz" );
-+}
-+
-+int main()
-+{
-+  test_format();
-+}
-diff --git a/libstdc++-v3/testsuite/std/time/tzdb/1.cc b/libstdc++-v3/testsuite/std/time/tzdb/1.cc
-index 796f3a8b4256..7a31c1c20ba7 100644
---- a/libstdc++-v3/testsuite/std/time/tzdb/1.cc
-+++ b/libstdc++-v3/testsuite/std/time/tzdb/1.cc
-@@ -39,11 +39,15 @@ test_locate()
-   const tzdb& db = get_tzdb();
-   const time_zone* tz = db.locate_zone("GMT");
-   VERIFY( tz != nullptr );
--  VERIFY( tz->name() == "Etc/GMT" );
-   VERIFY( tz == std::chrono::locate_zone("GMT") );
-   VERIFY( tz == db.locate_zone("Etc/GMT") );
-   VERIFY( tz == db.locate_zone("Etc/GMT+0") );
- 
-+  // Since 2022f GMT is now a Zone and Etc/GMT a link instead of vice versa,
-+  // but only when using the vanguard format. As of 2024a, the main and
-+  // rearguard formats still have Etc/GMT as a Zone and GMT as a link.
-+  VERIFY( tz->name() == "GMT" || tz->name() == "Etc/GMT" );
-+
-   VERIFY( db.locate_zone(db.current_zone()->name()) == db.current_zone() );
- }
- 
--- 
-2.43.5
-
diff --git a/meta/recipes-devtools/gcc/gcc_14.2.bb b/meta/recipes-devtools/gcc/gcc_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/gcc_14.2.bb
rename to meta/recipes-devtools/gcc/gcc_14.3.bb
diff --git a/meta/recipes-devtools/gcc/libgcc-initial_14.2.bb b/meta/recipes-devtools/gcc/libgcc-initial_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/libgcc-initial_14.2.bb
rename to meta/recipes-devtools/gcc/libgcc-initial_14.3.bb
diff --git a/meta/recipes-devtools/gcc/libgcc_14.2.bb b/meta/recipes-devtools/gcc/libgcc_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/libgcc_14.2.bb
rename to meta/recipes-devtools/gcc/libgcc_14.3.bb
diff --git a/meta/recipes-devtools/gcc/libgfortran_14.2.bb b/meta/recipes-devtools/gcc/libgfortran_14.3.bb
similarity index 100%
rename from meta/recipes-devtools/gcc/libgfortran_14.2.bb
rename to meta/recipes-devtools/gcc/libgfortran_14.3.bb