This was written before Thomas' modification to the ELF-handling to allow
a config-based change for target details.  I did consider updating this
to try and use that scheme, but I think that it would sit a little
awkwardly, since there are some differences in the start-up scanning for
Mach-O.  I would say that in all probability we could improve things but
I'd like to put this forward as a well-tested initial implementation.

It has been in use for more than 2 years on the aarch64 Darwin devt.
branch. Tested also in configurations on x86_64-linux and
aarch64-linux.  Obviously, this is not aarch64-specific but that is
out initial use-case.  OK for trunk?
thanks
Iain

--- 8< ---

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 <i...@sandoe.co.uk>
---
 gcc/testsuite/lib/scanasm.exp | 55 ++++++++++++++++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp
index 5df80325dff..fab4b0669ec 100644
--- a/gcc/testsuite/lib/scanasm.exp
+++ b/gcc/testsuite/lib/scanasm.exp
@@ -851,6 +851,44 @@ proc parse_function_bodies { config filename result } {
     close $fd
 }
 
+proc parse_MACHO_function_bodies { filename result } {
+    upvar $result up_result
+
+    # Regexp for the start of a function definition (name in \1).
+    set label {^(_[a-zA-Z_]\S+):$}
+    set start {^LFB[0-9]+}
+
+    # Regexp for the end of a function definition.
+    set terminator {^LFE[0-9]+}
+
+    # Regexp for lines that aren't interesting.
+    set fluff {^\s*(?:\.|//|@)}
+    set fluff3 {^L[0-9ACESV]}
+
+    set fd [open $filename r]
+    set in_function 0
+    while { [gets $fd line] >= 0 } {
+       if { !$in_function && [regexp $label $line dummy function_name] } {
+           set in_function 1
+           set function_body ""
+       } elseif { $in_function == 1 } {
+         if { [regexp $start $line] } {
+           set in_function 2
+         } else {
+           set in_function 0
+         }
+       } elseif { $in_function == 2 } {
+           if { [regexp $terminator $line] } {
+               set up_result($function_name) $function_body
+               set in_function 0
+           } elseif { ![regexp $fluff $line]  && ![regexp $fluff3 $line] } {
+               append function_body $line "\n"
+           }
+       }
+    }
+    close $fd
+}
+
 # FUNCTIONS is an array that maps function names to function bodies.
 # Return true if it contains a definition of function NAME and if
 # that definition matches BODY_REGEXP.
@@ -883,6 +921,14 @@ proc check-function-bodies { args } {
        error "too many arguments to check-function-bodies"
     }
 
+    set isELF 1
+    # some targets have a __USER_LABEL_PREFIX__
+    set needsULP 0
+    if { [istarget *-*-darwin*] } {
+      set isELF 0
+      set needsULP 1
+    }
+
     if { [llength $args] >= 3 } {
        set required_flags [lindex $args 2]
 
@@ -944,7 +990,11 @@ proc check-function-bodies { args } {
        remote_upload host "$filename"
     }
     if { [file exists $output_filename] } {
-       parse_function_bodies config $output_filename functions
+        if { $isELF } {
+           parse_function_bodies config $output_filename functions
+       } else {
+           parse_MACHO_function_bodies $output_filename functions
+       }
        set have_bodies 1
     } else {
        verbose -log "$testcase: output file does not exist"
@@ -988,6 +1038,9 @@ proc check-function-bodies { args } {
                if { $xfail_all || [string equal $selector "F"] } {
                    setup_xfail "*-*-*"
                }
+               if { $needsULP } {
+                   set function_name "_$function_name"
+               }
                set testname "$testcase check-function-bodies $function_name"
                if { !$have_bodies } {
                    unresolved $testname
-- 
2.39.2 (Apple Git-143)

Reply via email to