From bc754168c7c3fc64e40bb7ddd97ea1ad07fb32d2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 7 Dec 2019 22:32:52 +1030 Subject: [PATCH 1/1] Optional matching for run_dump_test This adds an alternative to using #... in dump files, useful where we only want to allow specific extra output. DW_CFA_nop in CIEs and FDEs to pad out to required alignment (larger for 64-bit than 32-bit) is an example where these optional match patterns are useful. binutils/ * testsuite/lib/binutils-common.exp (regexp_diff): Support #?REGEXP. ld/ * testsuite/ld-elf/eh4.d: Match optional padding DW_CFA_nop in FDEs. * testsuite/ld-elf/eh5.d: Likewise, and extra CIEs emitted on embedded targets. --- binutils/ChangeLog | 4 ++ binutils/testsuite/lib/binutils-common.exp | 19 +++++++ ld/ChangeLog | 6 +++ ld/testsuite/ld-elf/eh4.d | 6 ++- ld/testsuite/ld-elf/eh5.d | 60 +++++++++++++++++++--- 5 files changed, 86 insertions(+), 9 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index d91298924c..ef72f21be3 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,7 @@ +2019-12-08 Alan Modra + + * testsuite/lib/binutils-common.exp (regexp_diff): Support #?REGEXP. + 2019-11-22 Andrew Burgess * dwarf.c (regname_internal_riscv): New function. diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp index 3b229babeb..f2efa23651 100644 --- a/binutils/testsuite/lib/binutils-common.exp +++ b/binutils/testsuite/lib/binutils-common.exp @@ -286,6 +286,10 @@ proc check_shared_lib_support { } { # REGEXP # Skip all lines in FILE_1 until the first that matches REGEXP. # +# #?REGEXP +# Optionally match REGEXP against line from FILE_1. If the REGEXP +# does not match then the next line from FILE_2 is tried. +# # Other # lines are comments. Regexp lines starting with the `!' character # specify inverse matching (use `\!' for literal matching against a leading # `!'). Skip empty lines in both files. @@ -372,6 +376,21 @@ proc regexp_diff { file_1 file_2 args } { } } break + } elseif { [string match "#\\?*" $line_b] } { + if { ! $end_1 } { + set line_b [string replace $line_b 0 1] + set negated [expr { [string index $line_b 0] == "!" }] + set line_bx [string range $line_b $negated end] + set n [expr { $negated ? "! " : "" }] + # Substitute on the reference. + foreach {name value} $ref_subst { + regsub -- $name $line_bx $value line_bx + } + verbose "optional match for $n\"^$line_bx$\"" 3 + if { [expr [regexp "^$line_bx$" "$line_a"] != $negated] } { + break + } + } } if { [gets $file_b line_b] == $eof } { set end_2 1 diff --git a/ld/ChangeLog b/ld/ChangeLog index 8c07ff6bc7..a70421478b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2019-12-08 Alan Modra + + * testsuite/ld-elf/eh4.d: Match optional padding DW_CFA_nop in FDEs. + * testsuite/ld-elf/eh5.d: Likewise, and extra CIEs emitted on + embedded targets. + 2019-12-06 Alan Modra * testsuite/ld-mips-elf/eh-frame1-n32.d: Pass --eh-frame-hdr to ld. diff --git a/ld/testsuite/ld-elf/eh4.d b/ld/testsuite/ld-elf/eh4.d index 391efb8cd2..f33431a8b7 100644 --- a/ld/testsuite/ld-elf/eh4.d +++ b/ld/testsuite/ld-elf/eh4.d @@ -34,6 +34,10 @@ Contents of the .eh_frame section: DW_CFA_def_cfa_offset: 24 DW_CFA_advance_loc: [0-9a-f]+ to [0-9a-f]+ DW_CFA_def_cfa_expression \(DW_OP_breg7 \(rsp\): 8; DW_OP_breg16 \(rip\): 0;.* -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + [0-9a-f]+ ZERO terminator #pass diff --git a/ld/testsuite/ld-elf/eh5.d b/ld/testsuite/ld-elf/eh5.d index e61db610a4..4a69748235 100644 --- a/ld/testsuite/ld-elf/eh5.d +++ b/ld/testsuite/ld-elf/eh5.d @@ -19,7 +19,11 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+001[48] 0+0014 0+001[8c] FDE cie=0+0000 pc=.* DW_CFA_advance_loc: 4 to .* DW_CFA_def_cfa: r0(.*) ofs 16 @@ -62,7 +66,11 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+009[08] 0+001c 0+002[04] FDE cie=0+007[48] pc=.* Augmentation data: (ef be ad de 00 00 00 00|00 00 00 00 de ad be ef) @@ -81,12 +89,20 @@ Contents of the .eh_frame section: Augmentation data: (0b|1b) DW_CFA_def_cfa: r0(.*) ofs 16 -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+00(c4|d0) 0+001[04] 0+001[8c] FDE cie=0+00b[08] pc=.* DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+00[de]8 0+0014 0+0000 CIE Version: [13] Augmentation: "zPR" @@ -108,7 +124,11 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+01(1c|30) 0+001[8c] 0+0000 CIE Version: [13] Augmentation: "zPLR" @@ -120,7 +140,11 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+01(38|50) 0+001c 0+002[04] FDE cie=0+01(1c|30) pc=.* Augmentation data: (ef be ad de 00 00 00 00|00 00 00 00 de ad be ef) @@ -136,7 +160,16 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... + +#?0+0170 0+0014 0+ CIE +#? Version: 1 +#? Augmentation: "zPR" +#? Code alignment factor: .* +#? Data alignment factor: .* +#? Return address column: .* +#? Augmentation data: 03 .. .. .. .. 1b +#? DW_CFA_nop + 0+01(70|88) 0+0014 0+0(01c|148|15c) FDE cie=0+0(02c|030|170) pc=.* DW_CFA_advance_loc: 4 to .* DW_CFA_def_cfa: r0(.*) ofs 16 @@ -150,7 +183,18 @@ Contents of the .eh_frame section: DW_CFA_nop DW_CFA_nop DW_CFA_nop -#... + +#?0+01b8 0+0018 0+ CIE +#? Version: 1 +#? Augmentation: "zPLR" +#? Code alignment factor: .* +#? Data alignment factor: .* +#? Return address column: .* +#? Augmentation data: 03 .. .. .. .. 0c 1b +#? DW_CFA_nop +#? DW_CFA_nop +#? DW_CFA_nop + 0+01(a0|b8|d4) 0+001c 0+0(020|130|144) FDE cie=0+0(074|078|1b8) pc=.* Augmentation data: (ef be ad de 00 00 00 00|00 00 00 00 de ad be ef) -- 2.34.1