commit: 7839f4bfafb5241ffa4dac16d088572965626173 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Wed Aug 20 14:10:04 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Wed Aug 20 14:10:04 2025 +0000 URL: https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=7839f4bf
16.0.0: fix TLS ICE Bug: https://gcc.gnu.org/PR121607 Signed-off-by: Sam James <sam <AT> gentoo.org> 16.0.0/gentoo/88_all_PR121607-TLS-ICE.patch | 173 ++++++++++++++++++++++++++++ 16.0.0/gentoo/README.history | 1 + 2 files changed, 174 insertions(+) diff --git a/16.0.0/gentoo/88_all_PR121607-TLS-ICE.patch b/16.0.0/gentoo/88_all_PR121607-TLS-ICE.patch new file mode 100644 index 0000000..a156cb1 --- /dev/null +++ b/16.0.0/gentoo/88_all_PR121607-TLS-ICE.patch @@ -0,0 +1,173 @@ +From e22c8a8cd7aef8938722e0ea6719dd1298d48812 Mon Sep 17 00:00:00 2001 +From: "H.J. Lu" <[email protected]> +Date: Wed, 20 Aug 2025 06:59:48 -0700 +Subject: [PATCH] x86-64: Emit the TLS call after NOTE_INSN_BASIC_BLOCK +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +For a basic block with only a label: + +(code_label 78 11 77 3 14 (nil) [1 uses]) +(note 77 78 54 3 [bb 3] NOTE_INSN_BASIC_BLOCK) + +emit the TLS call after NOTE_INSN_BASIC_BLOCK, instead of before +NOTE_INSN_BASIC_BLOCK, to avoid + +x.c: In function ‘aout_16_write_syms’: +x.c:54:1: error: NOTE_INSN_BASIC_BLOCK is missing for block 3 + 54 | } + | ^ +x.c:54:1: error: NOTE_INSN_BASIC_BLOCK 77 in middle of basic block 3 +during RTL pass: x86_cse +x.c:54:1: internal compiler error: verify_flow_info failed + +gcc/ + + PR target/121607 + * config/i386/i386-features.cc (ix86_emit_tls_call): Emit the + TLS call after NOTE_INSN_BASIC_BLOCK in a basic block with only + a label. + +gcc/testsuite/ + + PR target/121607 + * gcc.target/i386/pr121607-1a.c: New test. + * gcc.target/i386/pr121607-1b.c: Likewise. + +Signed-off-by: H.J. Lu <[email protected]> +--- + gcc/config/i386/i386-features.cc | 24 +++++++-- + gcc/testsuite/gcc.target/i386/pr121607-1a.c | 59 +++++++++++++++++++++ + gcc/testsuite/gcc.target/i386/pr121607-1b.c | 6 +++ + 3 files changed, 86 insertions(+), 3 deletions(-) + create mode 100644 gcc/testsuite/gcc.target/i386/pr121607-1a.c + create mode 100644 gcc/testsuite/gcc.target/i386/pr121607-1b.c + +diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc +index 7869ee22b67..514d2a5d378 100644 +--- a/gcc/config/i386/i386-features.cc ++++ b/gcc/config/i386/i386-features.cc +@@ -3795,7 +3795,18 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, basic_block bb, + while (insn && !NONDEBUG_INSN_P (insn)) + { + if (insn == BB_END (bb)) +- break; ++ { ++ /* This must be a basic block with only a label: ++ ++ (code_label 78 11 77 3 14 (nil) [1 uses]) ++ (note 77 78 54 3 [bb 3] NOTE_INSN_BASIC_BLOCK) ++ ++ */ ++ gcc_assert (NOTE_P (insn) ++ && NOTE_KIND (insn) == NOTE_INSN_BASIC_BLOCK); ++ insn = NULL; ++ break; ++ } + insn = NEXT_INSN (insn); + } + +@@ -3824,14 +3835,21 @@ ix86_emit_tls_call (rtx tls_set, x86_cse_kind kind, basic_block bb, + + if (bitmap_empty_p (live_caller_saved_regs)) + { +- if (insn == BB_HEAD (bb) || insn == BB_END (bb)) ++ if (insn == BB_HEAD (bb)) + { + *before_p = insn; + tls_insn = emit_insn_before (tls_set, insn); + } + else + { +- insn = PREV_INSN (insn); ++ /* Emit the TLS call after NOTE_INSN_BASIC_BLOCK in a ++ basic block with only a label: ++ ++ (code_label 78 11 77 3 14 (nil) [1 uses]) ++ (note 77 78 54 3 [bb 3] NOTE_INSN_BASIC_BLOCK) ++ ++ */ ++ insn = insn ? PREV_INSN (insn) : BB_END (bb); + *after_p = insn; + tls_insn = emit_insn_after (tls_set, insn); + } +diff --git a/gcc/testsuite/gcc.target/i386/pr121607-1a.c b/gcc/testsuite/gcc.target/i386/pr121607-1a.c +new file mode 100644 +index 00000000000..4c047068e3a +--- /dev/null ++++ b/gcc/testsuite/gcc.target/i386/pr121607-1a.c +@@ -0,0 +1,59 @@ ++/* { dg-do compile { target *-*-linux* } } */ ++/* { dg-options "-O2 -fpic -fplt -mtls-dialect=gnu -fno-semantic-interposition -fstack-protector" } */ ++ ++typedef enum ++{ ++ bfd_error_invalid_error_code ++} bfd_error_type; ++thread_local bfd_error_type bfd_error; ++int aout_16_write_syms___trans_tmp_1; ++short aout_16_write_syms_g_0_0; ++void xvec_0 (long, void *); ++ ++typedef struct ++{ ++ int output_section; ++} asection; ++ ++void bfd_asymbol_section (); ++ ++struct pdp11_external_nlist ++{ ++ char e_desc[2]; ++ char e_type[1]; ++ char e_ovly[10]; ++} translate_to_native_sym_flags (struct pdp11_external_nlist *sym_pointer) ++{ ++ asection *sec; ++ sym_pointer->e_type[0] &= 5; ++ bfd_asymbol_section (); ++ if (sec == 0) ++ { ++ bfd_error_type error_tag; ++ bfd_error = error_tag; ++ } ++ if (sec->output_section) ++ { ++ bfd_error_type error_tag; ++ bfd_error = error_tag; ++ } ++} ++ ++bool ++aout_16_write_syms (void *abfd) ++{ ++ for (; aout_16_write_syms___trans_tmp_1;) ++ { ++ struct pdp11_external_nlist nsp; ++ if (abfd) ++ { ++ xvec_0 (aout_16_write_syms_g_0_0, nsp.e_desc); ++ nsp.e_ovly[0] = 0; ++ } ++ else ++ nsp.e_type[0] = 0; ++ translate_to_native_sym_flags (&nsp); ++ } ++} ++ ++/* { dg-final { scan-assembler-times "call\[ \t\]__tls_get_addr@PLT" 2 { target { ! ia32 } } } } */ +diff --git a/gcc/testsuite/gcc.target/i386/pr121607-1b.c b/gcc/testsuite/gcc.target/i386/pr121607-1b.c +new file mode 100644 +index 00000000000..366306702c7 +--- /dev/null ++++ b/gcc/testsuite/gcc.target/i386/pr121607-1b.c +@@ -0,0 +1,6 @@ ++/* { dg-do compile { target *-*-linux* } } */ ++/* { dg-options "-O2 -fpic -fplt -mtls-dialect=gnu2 -fno-semantic-interposition -fstack-protector" } */ ++ ++#include "pr121607-1a.c" ++ ++/* { dg-final { scan-assembler-times "call\[ \t\]\\*bfd_error@TLSCALL\\(%(?:r|e)ax\\)" 2 { target { ! ia32 } } } } */ +-- +2.50.1 diff --git a/16.0.0/gentoo/README.history b/16.0.0/gentoo/README.history index 45143c9..ff3cbb8 100644 --- a/16.0.0/gentoo/README.history +++ b/16.0.0/gentoo/README.history @@ -1,6 +1,7 @@ 12 ???? - 86_all_PR121572_x86-Place-the-TLS-call-before-all-FLAGS_REG-setting-.patch + + 88_all_PR121607-TLS-ICE.patch 11 20 August 2025
