Hi Rainer,

thanks for looking at this, I was trying to see how to fix the failing Darwin
tests last week, and concluded that the absence of target selectors/xfail
meant skipping some tests - this is a much better solution.

Rainer Orth <r...@cebitec.uni-bielefeld.de> wrote:

I recently started looking into scan-assembler-symbol-section since all
tests using it were FAILing on Solaris/SPARC.  Unfortuntely, the more I
looked the more issues I found, both with the implementation and the
interface.  This patch addresses some of those, but there are quite a
number of open questions.

* The first issue was that on Solaris/SPARC, section names are
 double-quoted, both with as and gas:

       .section        ".text"

 When using as, the section flag and type syntax is completely
 different from other ELF targets:

       .section        "my_named_section",#alloc,#execinstr,#progbits

 This patch fixes this by stripping double quotes from section names.

* However, this didn't work initially (only the leading quote was
 stripped), which is due to David's recent AIX patch: with the
 introduction of the new capturing group to handle both .section (ELF)
 and .csect (XCOFF), $full_section_directive would never be empty on
 ELF and Mach-O targets, so the extraction of the section name didn't
 work any longer.  This had also broken the Darwin tests completely.

* Wondering why this hadn't been captured by the framework tests led me
 to

skipping test framework tests, CHECK_TEST_FRAMEWORK is not defined

 so this issue was all too easy to miss.  I'll get back to the
 framework tests later: there's a whole lot of problems there even if
 run.

* With working double quote stripping, all but one of the tests PASSed
 on Solaris/SPARC, the exception being:

FAIL: gcc.dg/20021029-1.c scan-assembler-symbol-section symbol ar (found __sparc_get_pc_thunk.l7) has section ^\\\\.(const|rodata)|\\\\[RO\\\\] (found .text.__sparc_get_pc_thunk.l7%__sparc_get_pc_thunk.l7)

 This is due to the symbol name (ar) not being anchored in the test and
 unexpectedly matchting __sparc_get_pc_thunk.l7.  Easily fixed, but it
 left me wondering about the interface: currently, every user of
 scan-assembler-symbol-section has to deal with anchoring and handling
 USER_LABEL_PREFIX herself.  It seems to me that this were better
 handled in the framework instead.  However, in the case at hand the
 actual symbol name is "ar.0" and I wonder if this can change in the
 future, i.e. we might need the generality of regexps for the symbol
 name here.

* Next, I ran the tests on Darwin 11 and found two failing tests:

FAIL: gcc.dg/darwin-sections.c scan-assembler-symbol-section symbol ^_a\$ (symbol not found) has section \\\\.data FAIL: gcc.dg/darwin-sections.c scan-assembler-symbol-section symbol ^_b\$ (symbol not found) has section \\\\.data

 is due to Iain's recent "Darwin : Begin rework of zero-fill sections."
 patch which emits

       .globl _a
       .zerofill __DATA,__common,_a,1,0

 This is already scanned for, so the two scans above can just go.

 The other failing test is

FAIL: g++.dg/gomp/tls-5.C -std=c++14 scan-assembler-symbol-section symbol ^_?_ZGR2ir_\$ (symbol not found) has section ^\\\\.tdata|\\\\[TL\\\\] FAIL: g++.dg/gomp/tls-5.C -std=c++14 scan-assembler-symbol-section symbol ^_?ir\$ (symbol not found) has section ^\\\\.tbss|\\\\[TL\\\\]

 Other scans are guarded by target tls_native, and indeed the assembler
 output has

___emutls_v._ZGR2ir_:
___emutls_t._ZGR2ir_:

___emutls_v.ir:

I was half in mind to test for those symbols for emulated TLS (since they indicate the moral equivalent of placing the data in the special sections) - but this wasn’t
possible absent the selector / xfail.

 Unfortunately scan-assembler-symbol-section doesn't support selects
 yet, which this test implements both for the benefit of this test and
 for symmetry.

… so now we ought to be able to make the test meaningful on emulated TLS
otherwise, it’s just consuming cpu - and we might as well have :

+// { dg-require-effective-target tls_native }

at the top…

With those changes, test results are clean now on sparc-sun-solaris2.11,
i386-pc-solaris2.11, i386-apple-darwin11.4.2, and
powerpc-ibm-aix7.2.4.0.

On AIX 7.2, there are changes like

-PASS: g++.dg/gomp/tls-5.C -std=c++2a scan-assembler-symbol-section symbol ^_?ir$ (found ir) has section ^\\.tbss|\\[TL\\] (found _tls5.tls_[TL],4) +PASS: g++.dg/gomp/tls-5.C -std=c++2a scan-assembler-symbol-section symbol ^_?ir$ (found ir) has section ^\\.tbss|\\[TL\\] (found _tls5.tls_[TL])

i.e. the ",4" after (?) the section name is now stripped.  I believe
this is benign: David?

Besides, I've documented scan-assembler-symbol-section and
scan-symbol-section in sourcebuild.texi as should have been done from
the beginning.

That's not the end of things, unfortunately:

* I find my selector handling code in dg-scan-symbol-section
 particularly ugly since it has to deal with the different argument
 indices in

 scan-assembler-symbol-section func section [selector]
 scan-symbol-section filename func section [selector]

 which made me wonder about the need for scan-symbol-section in
 general.  Right now, it's only used in the framework tests, and no
 other scan-* function (beside scan-file and scan-file-not, of course)
 has an explicit filename argument.

 Matthew, did you have any use in mind outside of the framework tests
 that justifies keeping it?

 Trying to get rid of it in the framework tests opened a can of worms,
 unfortunately: running

 gcc -S test.S -o test.s

 (equivalent to what the testsuite does) yields

# 1 "test.S"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "test.S"

.text

 I have no idea what point there is in duplicating the output on
 stdout, but this weird behaviour dates back to at least GCC 3.4, so
 I've kept scan-symbol-section for now.

* Then there's a general issue with the framework tests: you get several
 FAILs when you run them, which is a no-no:

FAIL: gcc.test-framework/dg-scan-symbol-section-1-exp-F.S scan-symbol-section symbol ^_test_symbol_.*$ (found _test_symbol_1) has section nomatch (found .text) FAIL: gcc.test-framework/dg-scan-symbol-section-1-exp-F.S scan-symbol-section symbol ^_test_symbol_.*$ (found _test_symbol_2) has section nomatch (found .data)

 Those are expected according to the comment, and should be xfail'ed
 accordingly (which is now possible).

FAIL: gcc.test-framework/dg-scan-symbol-section-2-exp-F.S scan-symbol-section symbol ^_test_symbol$ (found _test_symbol) has section ^\\.text$ (no section detected)

 The comment states the test should be UNSUPPORTED, but later documents
 it as FAIL.

FAIL: gcc.test-framework/dg-scan-symbol-section-3-exp-F.S scan-symbol-section symbol ^_test_symbol$ (symbol not found) has section ^\\.text$

 Same, with the added complication that the comment claims "(no symbol
 detected)" which doesn't match the actual output.

 I don't believe those outcomes should be made UNSUPPORTED, though: no
 other scan does so and when we scan for a symbol in a particular
 section and don't find it, something is just wrong.

* Last but no least, I have an issue with the section argument to
 scan-assembler-symbol-section: right now the test developer needs to
 know about all possible formats of section names on a wide range of
 targets (just as he needs to take USER_LABEL_PREFIX etc. into account
 for the symbol name).  This feels like a bad abstraction to me,
 although I'm uncertain what a better one would be.  One vague idea is
 to use the ELF section name as a token.  The framework can then
 translate it into the name appropriate for the current target.  This
 way the knowledge would at least be centralized in one place and the
 task would only come up once per section name/type.  Thoughts?

I think this is very hard to get right generically - I don’t see an algorithmic
mapping between .xxxx or per-function ELF section naming semantics and,
for example, MACH-O section names.  I fear that it would end up being a
look-up table and therefore probably better overt in the individual tests.

I guess this patch could go in now as is since it addresses all current
failures on all targets I could test, with room for later improvement?

Sorry for this long and winded mail, but the issue is messy beyond belief.

indeed it is - so much so that I punted on trying to fix it (very happy you
picked it up).

thanks
Iain


        Rainer

--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University


2020-12-03  Rainer Orth  <r...@cebitec.uni-bielefeld.de>

        gcc:
        * doc/sourcebuild.texi (Commands for use in dg-final, Scan the
        assembly output, scan-assembler-symbol-section): Document.
        (scan-symbol-section): Document.

        gcc/testsuite:
        * lib/scanasm.exp (scan-symbol-section): Pass args to
        dg-scan-symbol-section.
        (scan-assembler-symbol-section): Likewise.
        (dg-scan-symbol-section): Handle selector from orig_args.
        Get patterns from orig_args.
        (parse_section_of_symbols): Fix section_pattern.
        Strip double quotes from section name.

        * g++.dg/gomp/tls-5.C: Restrict ir, _ZGR2ir_ scans to tls_native.
        * gcc.dg/20021029-1.c: Anchor ar symbol.
        * gcc.dg/darwin-sections.c: Remove obsolete scans for _a, _b in
        .data.

# HG changeset patch
# Parent  60bd760a57db271eb2da2cb17156deca98faf14b
testsuite: Fix various scan-assembler-symbol-section issues

diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -2925,6 +2925,14 @@ Passes if @var{regex} matches text in th
 Passes if @var{regex} does not match text in the test's demangled assembler
 output.

+@item scan-assembler-symbol-section @var{functions} @var{section} [@{ target/xfail @var{selector} @}]
+Passes if @var{functions} are all in @var{section}.  The caller needs to
+allow for @code{USER_LABEL_PREFIX} and different section name conventions.
+
+@item scan-symbol-section @var{filename} @var{functions} @var{section} [@{ target/xfail @var{selector} @}]
+Passes if @var{functions} are all in @var{section}in @var{filename}.
+The same caveats as for @code{scan-assembler-symbol-section} apply.
+
 @item scan-hidden @var{symbol} [@{ target/xfail @var{selector} @}]
 Passes if @var{symbol} is defined as a hidden symbol in the test's
 assembly output.
diff --git a/gcc/testsuite/g++.dg/gomp/tls-5.C b/gcc/testsuite/g++.dg/gomp/tls-5.C
--- a/gcc/testsuite/g++.dg/gomp/tls-5.C
+++ b/gcc/testsuite/g++.dg/gomp/tls-5.C
@@ -1,8 +1,8 @@
 // The reference temp should be TLS, not normal data.
 // { dg-require-effective-target c++11 }
 // { dg-final { scan-assembler-not "\\.data" { target tls_native xfail 
powerpc-*-aix* } } }
-// { dg-final { scan-assembler-symbol-section {^_?ir$} {^\.tbss|\[TL\]} } } -// { dg-final { scan-assembler-symbol-section {^_?_ZGR2ir_$} {^\.tdata|\[TL\]} } } +// { dg-final { scan-assembler-symbol-section {^_?ir$} {^\.tbss|\[TL\]} { target tls_native } } } +// { dg-final { scan-assembler-symbol-section {^_?_ZGR2ir_$} {^\.tdata|\[TL\]} { target tls_native } } }

 extern int&& ir;
 #pragma omp threadprivate (ir)
diff --git a/gcc/testsuite/gcc.dg/20021029-1.c b/gcc/testsuite/gcc.dg/20021029-1.c
--- a/gcc/testsuite/gcc.dg/20021029-1.c
+++ b/gcc/testsuite/gcc.dg/20021029-1.c
@@ -3,7 +3,7 @@
 /* { dg-do compile { target fpic } } */
 /* { dg-options "-O2 -fpic" } */
 /* { dg-final { scan-assembler-not ".data.rel.ro.local" } } */
-/* { dg-final { scan-assembler-symbol-section {ar} {^\.(const|rodata)|\[RO\]} } } */ +/* { dg-final { scan-assembler-symbol-section {^_?ar} {^\.(const|rodata)|\[RO\]} } } */
 /* { dg-require-effective-target label_values } */
 /* { dg-require-effective-target indirect_jumps } */

diff --git a/gcc/testsuite/gcc.dg/darwin-sections.c b/gcc/testsuite/gcc.dg/darwin-sections.c
--- a/gcc/testsuite/gcc.dg/darwin-sections.c
+++ b/gcc/testsuite/gcc.dg/darwin-sections.c
@@ -10,9 +10,7 @@ typedef struct _empty {} e_s;
 /* These should go in .comm */
 char ub;
 e_s ea;
-/* { dg-final { scan-assembler-symbol-section {^_a$} {\.data} } } */
 /* { dg-final { scan-assembler ".comm\[\t \]_ub,1" } } */
-/* { dg-final { scan-assembler-symbol-section {^_b$} {\.data} } } */
 /* { dg-final { scan-assembler ".comm\[\t \]_ea,1" } } */

 /* These should go into __DATA,__common */
diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp
--- a/gcc/testsuite/lib/scanasm.exp
+++ b/gcc/testsuite/lib/scanasm.exp
@@ -173,14 +173,8 @@ proc scan-assembler-symbol-section { arg
     set testcase [testname-for-summary]
     set filename [lindex $testcase 0]
     set output_file "[file rootname [file tail $filename]].s"
-    set symbol_pattern [lindex $args 0]
-    set expected_section_pattern [lindex $args 1]
     dg-scan-symbol-section \
-    "scan-assembler-symbol-section" \
-    $testcase \
-    $output_file \
-    $symbol_pattern \
-    $expected_section_pattern
+       "scan-assembler-symbol-section" $testcase $output_file $args
 }

 # Check that symbols are emitted in the desired section.
@@ -227,22 +221,44 @@ proc scan-assembler-symbol-section { arg
 proc scan-symbol-section { args } {
     set testcase [testname-for-summary]
     set output_file [lindex $args 0]
-    set symbol_pattern [lindex $args 1]
-    set expected_section_pattern [lindex $args 2]
     dg-scan-symbol-section \
-    "scan-symbol-section" \
-    $testcase \
-    $output_file \
-    $symbol_pattern \
-    $expected_section_pattern
+       "scan-symbol-section" $testcase $output_file $args
 }

-# Check that symbols are emitted in the desired section.
+# Check that symbols are emitted in the desired section.  The ORIG_ARGS is
+# the list of arguments provided by dg-final to scan-symbol-section or
+# scan-assembler-symbol-section.  The first element in ORIG_ARGS is the
+# regular expression to look for in the file.  The second element, if
+# present, is a DejaGNU target selector.
 #
-# Avoid calling this function directly. In tests, use scan-symbol-section,
+# Avoid calling this function directly. In tests, use scan-symbol-section,
 # scan-assembler-symbol-section, or scan-lto-assembler-symbol-section instead.

-proc dg-scan-symbol-section { name testcase output_file symbol_pattern expected_section_pattern } {
+proc dg-scan-symbol-section { name testcase output_file orig_args } {
+    if { [llength $orig_args] < 2 } {
+       error "$name: too few arguments"
+        return
+    }
+    if { [llength $orig_args] > 4 } {
+       error "$name: too many arguments"
+       return
+    }
+    switch $name {
+       "scan-symbol-section" { set arg_incr 1 }
+       default { set arg_incr 0 }
+    }
+    if { [llength $orig_args] >= 3 } {
+       switch [dg-process-target [lindex $orig_args [expr 2 + $arg_incr]]] {
+           "S" { }
+           "N" { return }
+           "F" { setup_xfail "*-*-*" }
+           "P" { }
+       }
+    }
+
+    set symbol_pattern [lindex $orig_args [expr 0 + $arg_incr]]
+    set expected_section_pattern [lindex $orig_args [expr 1 + $arg_incr]]
+
     set printable_symbol_pattern [make_pattern_printable $symbol_pattern]
     set printable_expected_section_pattern [make_pattern_printable 
$expected_section_pattern]

@@ -303,7 +319,7 @@ proc dg-scan-symbol-section { name testc
 proc parse_section_of_symbols { filename result } {
     upvar $result up_result

- set section_pattern {^\s*(?:(\.section|\.csect)\s+(.*)|(\.const|\.data|\.text)\s*)$} + set section_pattern {^\s*(?:(?:\.section|\.csect)\s+(.*)|(\.const|\.data|\.text)\s*)$}
     set label_pattern {^(\S+):$}

     set fd [open $filename r]
@@ -314,9 +330,11 @@ proc parse_section_of_symbols { filename
         } elseif { [regexp -- $section_pattern $line dummy 
section_directive_arguments full_section_directive] } {
             if { $full_section_directive eq "" } {
                 # Example: .section .text,"ax",progbits
+                # Example: .section ".text",#alloc,#execinstr,#progbits
                 # Example: .section __TEXT,__text
                 set arguments [split $section_directive_arguments ","]
                 set current_section [string trim [lindex $arguments 0]]
+                set current_section [string trim $current_section {"}]
                 set arg_1 [string trim [lindex $arguments 1]]
                 if { [regexp {^_} $arg_1] } {
                     # The second argument looks like a Mach-O section name.


Reply via email to