Refine .cfi_sections check to only consider compact eh_frame
authorMatthew Fortune <matthew.fortune@imgtec.com>
Thu, 29 Sep 2016 10:13:46 +0000 (11:13 +0100)
committerMatthew Fortune <matthew.fortune@imgtec.com>
Thu, 6 Oct 2016 11:46:09 +0000 (12:46 +0100)
The .cfi_sections directive can be safely used multiple times
with different sections named at any time unless the compact form
of exception handling is requested after CFI information has
been emitted.  Only the compact form of CFI information changes
the way in which CFI is generated and therefore cannot be
retrospectively requested after generating CFI information.

gas/

PR gas/20648
* dw2gencfi.c (dot_cfi_sections): Refine the check for
inconsistent .cfi_sections to only consider compact vs non
compact forms.
* testsuite/gas/cfi/cfi-common-9.d: New file.
* testsuite/gas/cfi/cfi-common-9.s: New file.
* testsuite/gas/cfi/cfi.exp: Run new test.

gas/ChangeLog
gas/dw2gencfi.c
gas/testsuite/gas/cfi/cfi-common-9.d [new file with mode: 0644]
gas/testsuite/gas/cfi/cfi-common-9.s [new file with mode: 0644]
gas/testsuite/gas/cfi/cfi.exp

index d0b848934f3f08baf5a23764df56306d7f0c08ca..12f2e1988b9e3482288808acbe3a9b221e6eb6d0 100644 (file)
@@ -1,3 +1,13 @@
+2016-10-06  Matthew Fortune  <matthew.fortune@imgtec.com>
+
+       PR gas/20648
+       * dw2gencfi.c (dot_cfi_sections): Refine the check for
+       inconsistent .cfi_sections to only consider compact vs non
+       compact forms.
+       * testsuite/gas/cfi/cfi-common-9.d: New file.
+       * testsuite/gas/cfi/cfi-common-9.s: New file.
+       * testsuite/gas/cfi/cfi.exp: Run new test.
+
 2016-10-06  Alan Modra  <amodra@gmail.com>
 
        * app.c: Add missing fall through comments.
index 7294f179964d0d2eb04ce9d2326b07dcc439a7ee..8eebb51e1c199006f351fb3f0e4f8a37964877bc 100644 (file)
@@ -1269,7 +1269,10 @@ dot_cfi_sections (int ignored ATTRIBUTE_UNUSED)
       }
 
   demand_empty_rest_of_line ();
-  if (cfi_sections_set && cfi_sections != sections)
+  if (cfi_sections_set
+      && (sections & (CFI_EMIT_eh_frame | CFI_EMIT_eh_frame_compact))
+      && (cfi_sections & (CFI_EMIT_eh_frame | CFI_EMIT_eh_frame_compact))
+        != (sections & (CFI_EMIT_eh_frame | CFI_EMIT_eh_frame_compact)))
     as_bad (_("inconsistent uses of .cfi_sections"));
   cfi_sections = sections;
 }
diff --git a/gas/testsuite/gas/cfi/cfi-common-9.d b/gas/testsuite/gas/cfi/cfi-common-9.d
new file mode 100644 (file)
index 0000000..33f0176
--- /dev/null
@@ -0,0 +1,23 @@
+#objdump: -Wf
+#name: CFI common 9
+#...
+Contents of the .eh_frame section:
+
+00000000 0+0010 0+0000 CIE
+  Version:               1
+  Augmentation:          "zR"
+  Code alignment factor: .*
+  Data alignment factor: .*
+  Return address column: .*
+  Augmentation data:     [01]b
+
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+
+00000014 0+00(10|18|1c|20) 0+0018 FDE cie=0+0000 pc=.*
+
+  DW_CFA_nop
+  DW_CFA_nop
+  DW_CFA_nop
+#...
diff --git a/gas/testsuite/gas/cfi/cfi-common-9.s b/gas/testsuite/gas/cfi/cfi-common-9.s
new file mode 100644 (file)
index 0000000..1bc7cc2
--- /dev/null
@@ -0,0 +1,4 @@
+       .cfi_sections .eh_frame
+       .cfi_startproc simple
+       .cfi_sections .debug_frame
+       .cfi_endproc
index 30568564b25f5ecb8a409d882c5563df34139de5..6251434700c0b62f71ed6c70f1acb153bae4f887 100644 (file)
@@ -136,4 +136,5 @@ if { ![istarget "hppa64*-*"] } then {
   }
   run_dump_test "cfi-common-7"
   run_dump_test "cfi-common-8"
+  run_dump_test "cfi-common-9"
 }