]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
testsuite, Darwin: Add support for Mach-O function body scans.
authorIain Sandoe <iain@sandoe.co.uk>
Thu, 26 Oct 2023 08:52:04 +0000 (09:52 +0100)
committerIain Sandoe <iain@sandoe.co.uk>
Wed, 22 Nov 2023 14:50:04 +0000 (14:50 +0000)
We need to process the source slightly differently from ELF, especially
in that we have __USER_LABEL_PREFIX__ and there are no function start
and end assembler directives.  This means we cannot delineate functions
when frame output is switched off.

TODO: consider adding -mtest-markers or something similar to inject
assembler comments that can be scanned for.

gcc/testsuite/ChangeLog:

* lib/scanasm.exp: Initial handling for Mach-O function body scans.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
Co-authored-by: Richard Sandiford <richard.sandiford@arm.com>
gcc/testsuite/lib/scanasm.exp

index 16b5198d38ba2e072f986afea9447a373b94be56..85ee54ff9a8098541a1807c721d63f99fd04b31e 100644 (file)
@@ -804,23 +804,34 @@ proc configure_check-function-bodies { config } {
 
     # Regexp for the start of a function definition (name in \1).
     if { [istarget nvptx*-*-*] } {
-       set up_config(start) {^// BEGIN(?: GLOBAL|) FUNCTION DEF: ([a-zA-Z_]\S+)$}
+       set up_config(start) {
+           {^// BEGIN(?: GLOBAL|) FUNCTION DEF: ([a-zA-Z_]\S+)$}
+       }
+    } elseif { [istarget *-*-darwin*] } {
+       set up_config(start) {
+           {^_([a-zA-Z_]\S+):$}
+           {^LFB[0-9]+:}
+       }
     } else {
-       set up_config(start) {^([a-zA-Z_]\S+):$}
+       set up_config(start) {{^([a-zA-Z_]\S+):$}}
     }
 
     # Regexp for the end of a function definition.
     if { [istarget nvptx*-*-*] } {
        set up_config(end) {^\}$}
+    } elseif { [istarget *-*-darwin*] } {
+       set up_config(end) {^LFE[0-9]+}
     } else {
        set up_config(end) {^\s*\.size}
     }
+
     # Regexp for lines that aren't interesting.
     if { [istarget nvptx*-*-*] } {
        # Skip lines beginning with '//' comments ('-fverbose-asm', for
        # example).
        set up_config(fluff) {^\s*(?://)}
+    } elseif { [istarget *-*-darwin*] } {
+       set up_config(fluff) {^\s*(?:\.|//|@)|^L[0-9ACESV]}
     } else {
        # Skip lines beginning with labels ('.L[...]:') or other directives
        # ('.align', '.cfi_startproc', '.quad [...]', '.text', etc.), '//' or
@@ -852,9 +863,19 @@ proc parse_function_bodies { config filename result } {
     set fd [open $filename r]
     set in_function 0
     while { [gets $fd line] >= 0 } {
-       if { [regexp $up_config(start) $line dummy function_name] } {
-           set in_function 1
-           set function_body ""
+       if { $in_function == 0 } {
+           if { [regexp [lindex $up_config(start) 0] \
+                        $line dummy function_name] } {
+               set in_function 1
+               set function_body ""
+           }
+       } elseif { $in_function < [llength $up_config(start)] } {
+           if { [regexp [lindex $up_config(start) $in_function] $line] } {
+               incr in_function
+           } else {
+               verbose "parse_function_bodies: skipped $function_name"
+               set in_function 0
+           }
        } elseif { $in_function } {
            if { [regexp $up_config(end) $line] } {
                verbose "parse_function_bodies: $function_name:\n$function_body"
@@ -957,7 +978,6 @@ proc check-function-bodies { args } {
     set start_expected {^(\S+):$}
 
     configure_check-function-bodies config
-
     set have_bodies 0
     if { [is_remote host] } {
        remote_upload host "$filename"