On Sat, Mar 14, 2026 at 4:42 PM Andrew Pinski <[email protected]> wrote: > > On Mon, Feb 23, 2026 at 4:42 PM feedable <[email protected]> wrote: > > > > Add scan-weak function to testsuite, which would work like scan-hidden, > > and allow for format-specific regexes > > > LGTM; I think this is a good improvement to extract out how to scan > weak symbols; definitely reduces places were things needed to change.
Pushed as r16-8164 : https://gcc.gnu.org/pipermail/gcc-cvs/2026-March/451160.html . Thanks again for the contribution. I will try to review the rest this weekend. Thanks, Andrew > See below for future improvement. > > > > > > gcc/testsuite/ChangeLog: > > > > * gcc.dg/weak/weak-1.c: > > Use a function to scan for weak symbols instead of a regex. > > * gcc.dg/weak/weak-10.c: Likewise. > > * gcc.dg/weak/weak-11.c: Likewise. > > * gcc.dg/weak/weak-12.c: Likewise. > > * gcc.dg/weak/weak-15.c: Likewise. > > * gcc.dg/weak/weak-16.c: Likewise. > > * gcc.dg/weak/weak-2.c: Likewise. > > * gcc.dg/weak/weak-3.c: Likewise. > > * gcc.dg/weak/weak-4.c: Likewise. > > * gcc.dg/weak/weak-5.c: Likewise. > > * gcc.dg/weak/weak-9.c: Likewise. > > * lib/scanasm.exp: Implement the weak-scanning function. > > --- > > gcc/testsuite/gcc.dg/weak/weak-1.c | 16 +++++----- > > gcc/testsuite/gcc.dg/weak/weak-10.c | 2 +- > > gcc/testsuite/gcc.dg/weak/weak-11.c | 2 +- > > gcc/testsuite/gcc.dg/weak/weak-12.c | 2 +- > > gcc/testsuite/gcc.dg/weak/weak-15.c | 8 ++--- > > gcc/testsuite/gcc.dg/weak/weak-16.c | 4 +-- > > gcc/testsuite/gcc.dg/weak/weak-2.c | 10 +++--- > > gcc/testsuite/gcc.dg/weak/weak-3.c | 14 ++++----- > > gcc/testsuite/gcc.dg/weak/weak-4.c | 22 +++++++------- > > gcc/testsuite/gcc.dg/weak/weak-5.c | 24 +++++++-------- > > gcc/testsuite/gcc.dg/weak/weak-9.c | 8 ++--- > > gcc/testsuite/lib/scanasm.exp | 47 +++++++++++++++++++++++++++++ > > 12 files changed, 103 insertions(+), 56 deletions(-) > > > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-1.c > > b/gcc/testsuite/gcc.dg/weak/weak-1.c > > index 9566ee0c6f2..3734cc60750 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-1.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-1.c > > @@ -6,14 +6,14 @@ > > /* { dg-skip-if "" { nvptx-*-* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?b" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?d" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?e" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?g" } } */ > > -/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?i" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?j" } } */ > > +/* { dg-final { scan-weak "a" } } */ > > +/* { dg-final { scan-weak "b" } } */ > > +/* { dg-final { scan-weak "c" } } */ > > +/* { dg-final { scan-weak "d" } } */ > > +/* { dg-final { scan-weak "e" } } */ > > +/* { dg-final { scan-weak "g" } } */ > > +/* { dg-final { scan-not-weak "i" } } */ > > +/* { dg-final { scan-weak "j" } } */ > > > > #pragma weak a > > int a; > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-10.c > > b/gcc/testsuite/gcc.dg/weak/weak-10.c > > index f39fbc4bbce..7370e5b7239 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-10.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-10.c > > @@ -7,7 +7,7 @@ > > /* { dg-require-alias "" } */ > > /* { dg-options "-fno-common" } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?bar1" } } */ > > +/* { dg-final { scan-weak "bar1" } } */ > > > > #pragma weak bar1 = foo1 > > void foo1 (void) {} > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-11.c > > b/gcc/testsuite/gcc.dg/weak/weak-11.c > > index c20135a3aae..7f02772757c 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-11.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-11.c > > @@ -4,7 +4,7 @@ > > /* { dg-require-alias "" } */ > > /* { dg-options "-funit-at-a-time" } */ > > > > -/* { dg-final { scan-assembler "xyzzy" } } */ > > +/* { dg-final { scan-weak "xyzzy" } } */ > > > > static const int local = 1; > > #pragma weak xyzzy = local > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-12.c > > b/gcc/testsuite/gcc.dg/weak/weak-12.c > > index fd18e59a21e..2339d4e76b6 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-12.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-12.c > > @@ -6,7 +6,7 @@ > > /* { dg-skip-if "" { nvptx-*-* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?foo" } } */ > > +/* { dg-final { scan-weak "foo" } } */ > > > > #pragma weak foo > > > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-15.c > > b/gcc/testsuite/gcc.dg/weak/weak-15.c > > index 425a70046cc..90944c53fec 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-15.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-15.c > > @@ -6,10 +6,10 @@ > > /* { dg-skip-if "" { nvptx-*-* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?a" } } */ > > -/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?b" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?c" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?d" } } */ > > +/* { dg-final { scan-weak "a" } } */ > > +/* { dg-final { scan-not-weak "b" } } */ > > +/* { dg-final { scan-weak "c" } } */ > > +/* { dg-final { scan-weak "d" } } */ > > > > #pragma weak a > > extern char a[]; > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-16.c > > b/gcc/testsuite/gcc.dg/weak/weak-16.c > > index 44741c54c3d..345907367d6 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-16.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-16.c > > @@ -2,8 +2,8 @@ > > /* { dg-do compile } */ > > /* { dg-require-weak "" } */ > > /* { dg-options "-fno-common -Os" } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ > > \t\]_?kallsyms_token_index" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ > > \t\]_?kallsyms_token_table" } } */ > > +/* { dg-final { scan-weak "kallsyms_token_index" } } */ > > +/* { dg-final { scan-weak "kallsyms_token_table" } } */ > > /* { dg-skip-if "" { x86_64-*-mingw* } } */ > > /* NVPTX's weak is applied to the definition, not declaration. */ > > /* { dg-skip-if "" { nvptx-*-* } } */ > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-2.c > > b/gcc/testsuite/gcc.dg/weak/weak-2.c > > index f0f55f5360f..395e27876f6 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-2.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-2.c > > @@ -6,11 +6,11 @@ > > /* { dg-skip-if "" { nvptx-*-* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */ > > -/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?ffoo1d" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1e" } } */ > > +/* { dg-final { scan-weak "ffoo1a" } } */ > > +/* { dg-final { scan-weak "ffoo1b" } } */ > > +/* { dg-final { scan-weak "ffoo1c" } } */ > > +/* { dg-final { scan-not-weak "ffoo1d" } } */ > > +/* { dg-final { scan-weak "ffoo1e" } } */ > > > > /* test function addresses with #pragma weak */ > > > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-3.c > > b/gcc/testsuite/gcc.dg/weak/weak-3.c > > index 2046f1e4d0b..120d6bad75c 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-3.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-3.c > > @@ -5,13 +5,13 @@ > > /* { dg-skip-if "" { x86_64-*-mingw* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1a" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1b" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1c" } } */ > > -/* { dg-final { scan-assembler-not "weak\[^ \t\]*\[ \t\]_?ffoo1d" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1e" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1f" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?ffoo1g" } } */ > > +/* { dg-final { scan-weak "ffoo1a" } } */ > > +/* { dg-final { scan-weak "ffoo1b" } } */ > > +/* { dg-final { scan-weak "ffoo1c" } } */ > > +/* { dg-final { scan-not-weak "ffoo1d" } } */ > > +/* { dg-final { scan-weak "ffoo1e" } } */ > > +/* { dg-final { scan-weak "ffoo1f" } } */ > > +/* { dg-final { scan-weak "ffoo1g" } } */ > > > > /* test function addresses with __attribute__((weak)) */ > > > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-4.c > > b/gcc/testsuite/gcc.dg/weak/weak-4.c > > index 70e63d22901..47cd7c57ea2 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-4.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-4.c > > @@ -6,17 +6,17 @@ > > /* { dg-skip-if "" { nvptx-*-* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1d" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1e" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1f" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1g" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1h" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1i" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1j" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1k" } } */ > > +/* { dg-final { scan-weak "vfoo1a" } } */ > > +/* { dg-final { scan-weak "vfoo1b" } } */ > > +/* { dg-final { scan-weak "vfoo1c" } } */ > > +/* { dg-final { scan-weak "vfoo1d" } } */ > > +/* { dg-final { scan-weak "vfoo1e" } } */ > > +/* { dg-final { scan-weak "vfoo1f" } } */ > > +/* { dg-final { scan-weak "vfoo1g" } } */ > > +/* { dg-final { scan-weak "vfoo1h" } } */ > > +/* { dg-final { scan-weak "vfoo1i" } } */ > > +/* { dg-final { scan-weak "vfoo1j" } } */ > > +/* { dg-final { scan-weak "vfoo1k" } } */ > > > > /* test variable addresses with #pragma weak */ > > > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-5.c > > b/gcc/testsuite/gcc.dg/weak/weak-5.c > > index 3b239715e44..70ae7e3e710 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-5.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-5.c > > @@ -5,18 +5,18 @@ > > /* { dg-skip-if "" { x86_64-*-mingw* } } */ > > /* { dg-skip-if PR119369 { amdgcn-*-* } } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1a" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1b" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1c" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1d" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1e" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1f" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1g" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1h" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1i" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1j" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1k" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?vfoo1l" } } */ > > +/* { dg-final { scan-weak "vfoo1a" } } */ > > +/* { dg-final { scan-weak "vfoo1b" } } */ > > +/* { dg-final { scan-weak "vfoo1c" } } */ > > +/* { dg-final { scan-weak "vfoo1d" } } */ > > +/* { dg-final { scan-weak "vfoo1e" } } */ > > +/* { dg-final { scan-weak "vfoo1f" } } */ > > +/* { dg-final { scan-weak "vfoo1g" } } */ > > +/* { dg-final { scan-weak "vfoo1h" } } */ > > +/* { dg-final { scan-weak "vfoo1i" } } */ > > +/* { dg-final { scan-weak "vfoo1j" } } */ > > +/* { dg-final { scan-weak "vfoo1k" } } */ > > +/* { dg-final { scan-weak "vfoo1l" } } */ > > > > /* test variable addresses with __attribute__ ((weak)) */ > > > > diff --git a/gcc/testsuite/gcc.dg/weak/weak-9.c > > b/gcc/testsuite/gcc.dg/weak/weak-9.c > > index abbd0201c46..ddb0f210b8a 100644 > > --- a/gcc/testsuite/gcc.dg/weak/weak-9.c > > +++ b/gcc/testsuite/gcc.dg/weak/weak-9.c > > @@ -3,10 +3,10 @@ > > /* { dg-require-alias "" } */ > > /* { dg-options "-fno-common" } */ > > > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f1" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f2" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f3" } } */ > > -/* { dg-final { scan-assembler "weak\[^ \t\]*\[ \t\]_?f4" } } */ > > +/* { dg-final { scan-weak "f1" } } */ > > +/* { dg-final { scan-weak "f2" } } */ > > +/* { dg-final { scan-weak "f3" } } */ > > +/* { dg-final { scan-weak "f4" } } */ > > > > void notf1() { } > > void notf2() { } > > diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp > > index bcd22c2d7e4..85ba68ca761 100644 > > --- a/gcc/testsuite/lib/scanasm.exp > > +++ b/gcc/testsuite/lib/scanasm.exp > > @@ -153,6 +153,53 @@ proc hidden-scan-for { symbol } { > > > > } > > > > +proc weak-scan-for { symbol } { > > + > > + set objformat [gcc_target_object_format] > > + > > + switch $objformat { > > + default { return "weak\[^ \t\]*\[ \t\]_?$symbol" } > > Now this is seperated out, we might be able to do better for elf and > macho (CCing Iain just for the FYI). > But that can be in a seperate patch later on. > > Thanks, > Andrew Pinski > > > + } > > +} > > + > > +# Check that a symbol is defined as a weak symbol in the .s file > > +# produced by the compiler. > > + > > +proc scan-weak { args } { > > + set testcase [testname-for-summary] > > + # The name might include a list of options; extract the file name. > > + set filename [lindex $testcase 0] > > + set output_file "[file rootname [file tail $filename]].s" > > + > > + if { [llength $args] > 0 } { > > + set symbol [lindex $args 0] > > + > > + set weak_scan [weak-scan-for $symbol] > > + > > + set args [lreplace $args 0 0 "$weak_scan"] > > + } > > + > > + dg-scan "scan-weak" 1 $testcase $output_file $args > > +} > > + > > +# Check that a symbol is not defined as a weak symbol in the .s file > > +# produced by the compiler. > > + > > +proc scan-not-weak { args } { > > + set testcase [testname-for-summary] > > + # The name might include a list of options; extract the file name. > > + set filename [lindex $testcase 0] > > + set output_file "[file rootname [file tail $filename]].s" > > + > > + if { [llength $args] > 0 } { > > + set symbol [lindex $args 0] > > + set weak_scan [weak-scan-for $symbol] > > + > > + set args [lreplace $args 0 0 "$weak_scan"] > > + } > > + > > + dg-scan "scan-not-weak" 0 $testcase $output_file $args > > +} > > > > # Check that a symbol is defined as a hidden symbol in the .s file > > # produced by the compiler. > > -- > > 2.53.0 > >
