aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2016-02-11 15:30:55 +0000
committerNick Clifton <nickc@redhat.com>2016-02-11 15:30:55 +0000
commitbd5608dcc6a76876db06b1af1852252a4282aa2f (patch)
tree52b42f6769739207278db2a83a23425cede1f6be /gas/dw2gencfi.c
parentgdb.trace: Add a testcase for tdesc in tfile. (diff)
downloadbinutils-gdb-bd5608dcc6a76876db06b1af1852252a4282aa2f.tar.gz
binutils-gdb-bd5608dcc6a76876db06b1af1852252a4282aa2f.tar.bz2
binutils-gdb-bd5608dcc6a76876db06b1af1852252a4282aa2f.zip
Allow the .cfi_sections directive to be reissued provided that CFI generation has not yet started.
PR gas/19614 * dw2gencfi.c (cfi_sections_set): Delay setting this variable until it is actually used. (cfi_set_sections): Set cfi_sections_set to true. (dot_cfi_startproc): Likewise. (dot_cfi_endproc): Likewise. (dot_cfi_fde_data): Likewise. (cfi_finish): Likewise. (dot_cfi_sections): Do not set cfi_sections_set. * doc/as.texinfo (.cfi_sections): Note that targets can provide their own cfi section name. Also note that the directive can be reissued provided that CFI generation has not started. * testsuite/gas/mips/compact-eh-err2.s: Add .cfi_startproc and .cfi_endproc directives so that the redefinition of .cfi_sections will trigger the generation of the error message. * testsuite/gas/mips/compact-eh-err2.l: Update expected line number of error message.
Diffstat (limited to 'gas/dw2gencfi.c')
-rw-r--r--gas/dw2gencfi.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c
index 195013bf07d..c66402df291 100644
--- a/gas/dw2gencfi.c
+++ b/gas/dw2gencfi.c
@@ -509,6 +509,7 @@ void
cfi_set_sections (void)
{
frchain_now->frch_cfi_data->cur_fde_data->sections = all_cfi_sections;
+ cfi_sections_set = TRUE;
}
/* Universal functions to store new instructions. */
@@ -1248,7 +1249,6 @@ dot_cfi_sections (int ignored ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
if (cfi_sections_set && cfi_sections != sections)
as_bad (_("inconsistent uses of .cfi_sections"));
- cfi_sections_set = TRUE;
cfi_sections = sections;
}
@@ -1284,6 +1284,7 @@ dot_cfi_startproc (int ignored ATTRIBUTE_UNUSED)
}
demand_empty_rest_of_line ();
+ cfi_sections_set = TRUE;
all_cfi_sections |= cfi_sections;
cfi_set_sections ();
frchain_now->frch_cfi_data->cur_cfa_offset = 0;
@@ -1310,6 +1311,7 @@ dot_cfi_endproc (int ignored ATTRIBUTE_UNUSED)
demand_empty_rest_of_line ();
+ cfi_sections_set = TRUE;
if ((cfi_sections & CFI_EMIT_target) != 0)
tc_cfi_endproc (last_fde);
}
@@ -1372,6 +1374,7 @@ dot_cfi_fde_data (int ignored ATTRIBUTE_UNUSED)
last_fde = frchain_now->frch_cfi_data->cur_fde_data;
+ cfi_sections_set = TRUE;
if ((cfi_sections & CFI_EMIT_target) != 0
|| (cfi_sections & CFI_EMIT_eh_frame_compact) != 0)
{
@@ -2223,6 +2226,7 @@ cfi_finish (void)
if (all_fde_data == 0)
return;
+ cfi_sections_set = TRUE;
if ((all_cfi_sections & CFI_EMIT_eh_frame) != 0
|| (all_cfi_sections & CFI_EMIT_eh_frame_compact) != 0)
{
@@ -2408,6 +2412,7 @@ cfi_finish (void)
flag_traditional_format = save_flag_traditional_format;
}
+ cfi_sections_set = TRUE;
if ((all_cfi_sections & CFI_EMIT_debug_frame) != 0)
{
int alignment = ffs (DWARF2_ADDR_SIZE (stdoutput)) - 1;