gas/riscv: Produce version 3 DWARF CIE by default
authorAndrew Burgess <andrew.burgess@embecosm.com>
Mon, 4 Nov 2019 23:03:10 +0000 (23:03 +0000)
committerAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 28 Nov 2019 00:03:05 +0000 (00:03 +0000)
The flag controlling the default DWARF CIE version to produce now
starts with the value -1.  This can be modified with the command line
flag as before, but after command line flag processing, in
md_after_parse_args targets can, if the global still has the value -1,
override this value.  This gives a target specific default.

If a CIE version is not select either by command line flag, or a
target specific default, then some new code in dwarf2_init now select
a global default.  This remains as version 1 to match previous
behaviour.

This RISC-V has a target specific default of version provided, this
make the return column uleb128, which means we can use all DWARF
registers include CSRs.

I chose to switch to version 3 rather than version 4 as this is most
similar to the global default (version 1).  Switching to version 4
adds additional columns to the CIE header.

gas/ChangeLog:

* as.c (flag_dwarf_cie_version): Change initial value to -1, and
update comment.
* config/tc-riscv.c (riscv_after_parse_args): Set
flag_dwarf_cie_version if it has not already been set.
* dwarf2dbg.c (dwarf2_init): Initialise flag_dwarf_cie_version if
needed.
* testsuite/gas/riscv/default-cie-version.d: New file.
* testsuite/gas/riscv/default-cie-version.s: New file.

ld/ChangeLog:

* testsuite/ld-elf/eh5.d: Accept version 3 DWARF CIE.

Change-Id: Ibbfe8f0979fba480bf0a359978b09d2b3055555e

gas/ChangeLog
gas/as.c
gas/config/tc-riscv.c
gas/dwarf2dbg.c
gas/testsuite/gas/riscv/default-cie-version.d [new file with mode: 0644]
gas/testsuite/gas/riscv/default-cie-version.s [new file with mode: 0644]
ld/ChangeLog
ld/testsuite/ld-elf/eh5.d

index c7dfd5ee98bf4597266e1190fd3dd1c454967a51..45e8b8a8e9a951a096932b82f63f7591512a8b9e 100644 (file)
@@ -1,3 +1,14 @@
+2019-11-22  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * as.c (flag_dwarf_cie_version): Change initial value to -1, and
+       update comment.
+       * config/tc-riscv.c (riscv_after_parse_args): Set
+       flag_dwarf_cie_version if it has not already been set.
+       * dwarf2dbg.c (dwarf2_init): Initialise flag_dwarf_cie_version if
+       needed.
+       * testsuite/gas/riscv/default-cie-version.d: New file.
+       * testsuite/gas/riscv/default-cie-version.s: New file.
+
 2019-11-22  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * dw2gencfi.c (output_cie): Error on return column overflow.
index cc84725a421fcdc60b7a6eac157d42feceb3da60..091fe902da18ede2698b80859ade64c80ffba7d4 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -95,10 +95,12 @@ int debug_memory = 0;
 /* Enable verbose mode.  */
 int verbose = 0;
 
-/* Which version of DWARF CIE to produce.  The default could be overridden
-   by a target during its initialisation, or by the --gdwarf-cie-version
-   command line flag.  */
-int flag_dwarf_cie_version = 1;
+/* Which version of DWARF CIE to produce.  This default value of -1
+   indicates that this value has not been set yet, a default value is
+   provided in dwarf2_init.  A different value can also be supplied by the
+   command line flag --gdwarf-cie-version, or by a target in
+   MD_AFTER_PARSE_ARGS.  */
+int flag_dwarf_cie_version = -1;
 
 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
 int flag_use_elf_stt_common = DEFAULT_GENERATE_ELF_STT_COMMON;
index dcd8405a2c1dfb6a5a57c4b85865b7c425b4d536..055d80c3444431d5b3305f72970fb96958cde4b4 100644 (file)
@@ -2341,6 +2341,12 @@ riscv_after_parse_args (void)
 
   /* Insert float_abi into the EF_RISCV_FLOAT_ABI field of elf_flags.  */
   elf_flags |= float_abi * (EF_RISCV_FLOAT_ABI & ~(EF_RISCV_FLOAT_ABI << 1));
+
+  /* If the CIE to be produced has not been overridden on the command line,
+     then produce version 3 by default.  This allows us to use the full
+     range of registers in a .cfi_return_column directive.  */
+  if (flag_dwarf_cie_version == -1)
+    flag_dwarf_cie_version = 3;
 }
 
 long
index 001e2a16ad190043a2f7b08bedc4608cf36d1313..fd6ab54faa1f6fb355713ebb599d47b35091a124 100644 (file)
@@ -2171,6 +2171,17 @@ void
 dwarf2_init (void)
 {
   last_seg_ptr = &all_segs;
+
+  /* Select the default CIE version to produce here.  The global
+     starts with a value of -1 and will be modified to a valid value
+     either by the user providing a command line option, or some
+     targets will select their own default in md_after_parse_args.  If
+     we get here and the global still contains -1 then it is up to us
+     to pick a sane default.  The default we choose is 1, this is the
+     CIE version gas has produced for a long time, and there seems no
+     reason to change it yet.  */
+  if (flag_dwarf_cie_version == -1)
+    flag_dwarf_cie_version = 1;
 }
 
 
diff --git a/gas/testsuite/gas/riscv/default-cie-version.d b/gas/testsuite/gas/riscv/default-cie-version.d
new file mode 100644 (file)
index 0000000..035f258
--- /dev/null
@@ -0,0 +1,15 @@
+#objdump: --dwarf=frames
+#as:
+#...
+.*:     file format elf.*-.*riscv
+
+Contents of the .* section:
+
+00000000 0+[0-9a-f]+ 0+000 CIE
+  Version:               3
+  Augmentation:          .*
+  Code alignment factor: .*
+  Data alignment factor: .*
+  Return address column: .*
+  Augmentation data:     .*
+#...
\ No newline at end of file
diff --git a/gas/testsuite/gas/riscv/default-cie-version.s b/gas/testsuite/gas/riscv/default-cie-version.s
new file mode 100644 (file)
index 0000000..659b3b9
--- /dev/null
@@ -0,0 +1,2 @@
+       .cfi_startproc
+       .cfi_endproc
index 969ab78035253121d445d9ba86537bae2429eb4a..adca95ffc0b5aa6f8be46a12e78b0d92444e1d00 100644 (file)
@@ -1,3 +1,7 @@
+2019-11-27  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * testsuite/ld-elf/eh5.d: Accept version 3 DWARF CIE.
+
 2019-11-26  Martin Liska  <mliska@suse.cz>
 
        * scripttempl/arclinux.sc: Add .text.sorted.* which is sorted
index b74d4cf1e943ca97c259133f4e460cef67d1433c..e61db610a4129305c60be4a9640bbb3fbbd02a3c 100644 (file)
@@ -9,7 +9,7 @@
 Contents of the .eh_frame section:
 
 0+0000 0+001[04] 0+0000 CIE
-  Version:               1
+  Version:               [13]
   Augmentation:          "zR"
   Code alignment factor: .*
   Data alignment factor: .*
@@ -28,7 +28,7 @@ Contents of the .eh_frame section:
   DW_CFA_nop
 
 0+00(2c|30) 0+0014 0+0000 CIE
-  Version:               1
+  Version:               [13]
   Augmentation:          "zPR"
   Code alignment factor: .*
   Data alignment factor: .*
@@ -52,7 +52,7 @@ Contents of the .eh_frame section:
   DW_CFA_nop
 
 0+007[48] 0+001[8c] 0+0000 CIE
-  Version:               1
+  Version:               [13]
   Augmentation:          "zPLR"
   Code alignment factor: .*
   Data alignment factor: .*
@@ -73,7 +73,7 @@ Contents of the .eh_frame section:
   DW_CFA_nop
 
 0+00b[08] 0+001[04] 0+0000 CIE
-  Version:               1
+  Version:               [13]
   Augmentation:          "zR"
   Code alignment factor: .*
   Data alignment factor: .*
@@ -88,7 +88,7 @@ Contents of the .eh_frame section:
   DW_CFA_nop
 #...
 0+00[de]8 0+0014 0+0000 CIE
-  Version:               1
+  Version:               [13]
   Augmentation:          "zPR"
   Code alignment factor: .*
   Data alignment factor: .*
@@ -110,7 +110,7 @@ Contents of the .eh_frame section:
   DW_CFA_nop
 #...
 0+01(1c|30) 0+001[8c] 0+0000 CIE
-  Version:               1
+  Version:               [13]
   Augmentation:          "zPLR"
   Code alignment factor: .*
   Data alignment factor: .*