testsuite: Fix various scan-assembler-symbol-section issues

This patch addresses some of the issues that I found when looking into the
failures of the scan-assembler-symbol-section tests on Solaris/SPARC.

* 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.

* 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.

* 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:

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

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.

2020-12-03  Rainer Orth  <ro@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.
This commit is contained in:
Rainer Orth 2020-12-13 12:48:26 +01:00
parent 1498b1a8fb
commit f1eeabc1fd
5 changed files with 47 additions and 23 deletions

View File

@ -2923,6 +2923,14 @@ Passes if @var{regex} matches text in the test's demangled assembler output.
Passes if @var{regex} does not match text in the test's demangled assembler Passes if @var{regex} does not match text in the test's demangled assembler
output. 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} @}] @item scan-hidden @var{symbol} [@{ target/xfail @var{selector} @}]
Passes if @var{symbol} is defined as a hidden symbol in the test's Passes if @var{symbol} is defined as a hidden symbol in the test's
assembly output. assembly output.

View File

@ -1,8 +1,8 @@
// The reference temp should be TLS, not normal data. // The reference temp should be TLS, not normal data.
// { dg-require-effective-target c++11 } // { dg-require-effective-target c++11 }
// { dg-final { scan-assembler-not "\\.data" { target tls_native xfail powerpc-*-aix* } } } // { 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 {^_?ir$} {^\.tbss|\[TL\]} { target tls_native } } }
// { dg-final { scan-assembler-symbol-section {^_?_ZGR2ir_$} {^\.tdata|\[TL\]} } } // { dg-final { scan-assembler-symbol-section {^_?_ZGR2ir_$} {^\.tdata|\[TL\]} { target tls_native } } }
extern int&& ir; extern int&& ir;
#pragma omp threadprivate (ir) #pragma omp threadprivate (ir)

View File

@ -3,7 +3,7 @@
/* { dg-do compile { target fpic } } */ /* { dg-do compile { target fpic } } */
/* { dg-options "-O2 -fpic" } */ /* { dg-options "-O2 -fpic" } */
/* { dg-final { scan-assembler-not ".data.rel.ro.local" } } */ /* { 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 label_values } */
/* { dg-require-effective-target indirect_jumps } */ /* { dg-require-effective-target indirect_jumps } */

View File

@ -10,9 +10,7 @@ typedef struct _empty {} e_s;
/* These should go in .comm */ /* These should go in .comm */
char ub; char ub;
e_s ea; e_s ea;
/* { dg-final { scan-assembler-symbol-section {^_a$} {\.data} } } */
/* { dg-final { scan-assembler ".comm\[\t \]_ub,1" } } */ /* { dg-final { scan-assembler ".comm\[\t \]_ub,1" } } */
/* { dg-final { scan-assembler-symbol-section {^_b$} {\.data} } } */
/* { dg-final { scan-assembler ".comm\[\t \]_ea,1" } } */ /* { dg-final { scan-assembler ".comm\[\t \]_ea,1" } } */
/* These should go into __DATA,__common */ /* These should go into __DATA,__common */

View File

@ -173,14 +173,8 @@ proc scan-assembler-symbol-section { args } {
set testcase [testname-for-summary] set testcase [testname-for-summary]
set filename [lindex $testcase 0] set filename [lindex $testcase 0]
set output_file "[file rootname [file tail $filename]].s" 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 \ dg-scan-symbol-section \
"scan-assembler-symbol-section" \ "scan-assembler-symbol-section" $testcase $output_file $args
$testcase \
$output_file \
$symbol_pattern \
$expected_section_pattern
} }
# Check that symbols are emitted in the desired section. # Check that symbols are emitted in the desired section.
@ -227,22 +221,44 @@ proc scan-assembler-symbol-section { args } {
proc scan-symbol-section { args } { proc scan-symbol-section { args } {
set testcase [testname-for-summary] set testcase [testname-for-summary]
set output_file [lindex $args 0] set output_file [lindex $args 0]
set symbol_pattern [lindex $args 1]
set expected_section_pattern [lindex $args 2]
dg-scan-symbol-section \ dg-scan-symbol-section \
"scan-symbol-section" \ "scan-symbol-section" $testcase $output_file $args
$testcase \
$output_file \
$symbol_pattern \
$expected_section_pattern
} }
# 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. # 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_symbol_pattern [make_pattern_printable $symbol_pattern]
set printable_expected_section_pattern [make_pattern_printable $expected_section_pattern] set printable_expected_section_pattern [make_pattern_printable $expected_section_pattern]
@ -303,7 +319,7 @@ proc dg-scan-symbol-section { name testcase output_file symbol_pattern expected_
proc parse_section_of_symbols { filename result } { proc parse_section_of_symbols { filename result } {
upvar $result up_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 label_pattern {^(\S+):$}
set fd [open $filename r] set fd [open $filename r]
@ -314,9 +330,11 @@ proc parse_section_of_symbols { filename result } {
} elseif { [regexp -- $section_pattern $line dummy section_directive_arguments full_section_directive] } { } elseif { [regexp -- $section_pattern $line dummy section_directive_arguments full_section_directive] } {
if { $full_section_directive eq "" } { if { $full_section_directive eq "" } {
# Example: .section .text,"ax",progbits # Example: .section .text,"ax",progbits
# Example: .section ".text",#alloc,#execinstr,#progbits
# Example: .section __TEXT,__text # Example: .section __TEXT,__text
set arguments [split $section_directive_arguments ","] set arguments [split $section_directive_arguments ","]
set current_section [string trim [lindex $arguments 0]] set current_section [string trim [lindex $arguments 0]]
set current_section [string trim $current_section {"}]
set arg_1 [string trim [lindex $arguments 1]] set arg_1 [string trim [lindex $arguments 1]]
if { [regexp {^_} $arg_1] } { if { [regexp {^_} $arg_1] } {
# The second argument looks like a Mach-O section name. # The second argument looks like a Mach-O section name.