* elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Handle S flag.
	(_bfd_elf_write_section_eh_frame): Likewise.
gas/
	* dw2gencfi.c (struct fde_entry, struct cie_entry): Add signal_frame
	field.
	(CFI_signal_frame): Define.
	(cfi_pseudo_table): Add .cfi_signal_frame.
	(dot_cfi): Handle CFI_signal_frame.
	(output_cie): Handle cie->signal_frame.
	(select_cie_for_fde): Don't share CIE if signal_frame flag is
	different.  Copy signal_frame from FDE to newly created CIE.
	* doc/as.texinfo: Document .cfi_signal_frame.
This commit is contained in:
Jakub Jelinek
2006-02-27 23:07:06 +00:00
parent ad676ae7ef
commit 63752a757f
5 changed files with 39 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2006-02-27 Jakub Jelinek <jakub@redhat.com>
* elf-eh-frame.c (_bfd_elf_discard_section_eh_frame): Handle S flag.
(_bfd_elf_write_section_eh_frame): Likewise.
2006-02-27 Carlos O'Donell <carlos@codesourcery.com> 2006-02-27 Carlos O'Donell <carlos@codesourcery.com>
* po/Make-in: Add html target. * po/Make-in: Add html target.

View File

@ -1,5 +1,5 @@
/* .eh_frame section optimization. /* .eh_frame section optimization.
Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Copyright 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Written by Jakub Jelinek <jakub@redhat.com>. Written by Jakub Jelinek <jakub@redhat.com>.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
@ -613,6 +613,8 @@ _bfd_elf_discard_section_eh_frame
ENSURE_NO_RELOCS (buf); ENSURE_NO_RELOCS (buf);
REQUIRE (get_DW_EH_PE_width (cie.fde_encoding, ptr_size)); REQUIRE (get_DW_EH_PE_width (cie.fde_encoding, ptr_size));
break; break;
case 'S':
break;
case 'P': case 'P':
{ {
int per_width; int per_width;
@ -1178,6 +1180,8 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
} }
buf++; buf++;
break; break;
case 'S':
break;
default: default:
BFD_FAIL (); BFD_FAIL ();
} }

View File

@ -1,3 +1,15 @@
2006-02-27 Jakub Jelinek <jakub@redhat.com>
* dw2gencfi.c (struct fde_entry, struct cie_entry): Add signal_frame
field.
(CFI_signal_frame): Define.
(cfi_pseudo_table): Add .cfi_signal_frame.
(dot_cfi): Handle CFI_signal_frame.
(output_cie): Handle cie->signal_frame.
(select_cie_for_fde): Don't share CIE if signal_frame flag is
different. Copy signal_frame from FDE to newly created CIE.
* doc/as.texinfo: Document .cfi_signal_frame.
2006-02-27 Carlos O'Donell <carlos@codesourcery.com> 2006-02-27 Carlos O'Donell <carlos@codesourcery.com>
* doc/Makefile.am: Add html target. * doc/Makefile.am: Add html target.

View File

@ -4102,6 +4102,9 @@ using the known displacement of the CFA register from the CFA.
This is often easier to use, because the number will match the This is often easier to use, because the number will match the
code it's annotating. code it's annotating.
@section @code{.cfi_signal_frame}
Mark current function as signal trampoline.
@section @code{.cfi_window_save} @section @code{.cfi_window_save}
SPARC register window has been saved. SPARC register window has been saved.

View File

@ -1,5 +1,5 @@
/* dw2gencfi.c - Support for generating Dwarf2 CFI information. /* dw2gencfi.c - Support for generating Dwarf2 CFI information.
Copyright 2003, 2004, 2005 Free Software Foundation, Inc. Copyright 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
Contributed by Michal Ludvig <mludvig@suse.cz> Contributed by Michal Ludvig <mludvig@suse.cz>
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
@ -88,6 +88,7 @@ struct fde_entry
struct cfi_insn_data *data; struct cfi_insn_data *data;
struct cfi_insn_data **last; struct cfi_insn_data **last;
unsigned int return_column; unsigned int return_column;
unsigned int signal_frame;
}; };
struct cie_entry struct cie_entry
@ -95,6 +96,7 @@ struct cie_entry
struct cie_entry *next; struct cie_entry *next;
symbolS *start_address; symbolS *start_address;
unsigned int return_column; unsigned int return_column;
unsigned int signal_frame;
struct cfi_insn_data *first, *last; struct cfi_insn_data *first, *last;
}; };
@ -354,6 +356,7 @@ static void dot_cfi_endproc (int);
#define CFI_return_column 0x101 #define CFI_return_column 0x101
#define CFI_rel_offset 0x102 #define CFI_rel_offset 0x102
#define CFI_escape 0x103 #define CFI_escape 0x103
#define CFI_signal_frame 0x104
const pseudo_typeS cfi_pseudo_table[] = const pseudo_typeS cfi_pseudo_table[] =
{ {
@ -374,6 +377,7 @@ const pseudo_typeS cfi_pseudo_table[] =
{ "cfi_restore_state", dot_cfi, DW_CFA_restore_state }, { "cfi_restore_state", dot_cfi, DW_CFA_restore_state },
{ "cfi_window_save", dot_cfi, DW_CFA_GNU_window_save }, { "cfi_window_save", dot_cfi, DW_CFA_GNU_window_save },
{ "cfi_escape", dot_cfi_escape, 0 }, { "cfi_escape", dot_cfi_escape, 0 },
{ "cfi_signal_frame", dot_cfi, CFI_signal_frame },
{ NULL, NULL, 0 } { NULL, NULL, 0 }
}; };
@ -547,6 +551,10 @@ dot_cfi (int arg)
cfi_add_CFA_insn (DW_CFA_GNU_window_save); cfi_add_CFA_insn (DW_CFA_GNU_window_save);
break; break;
case CFI_signal_frame:
cur_fde_data->signal_frame = 1;
break;
default: default:
abort (); abort ();
} }
@ -864,6 +872,8 @@ output_cie (struct cie_entry *cie)
out_one (DW_CIE_VERSION); /* Version. */ out_one (DW_CIE_VERSION); /* Version. */
out_one ('z'); /* Augmentation. */ out_one ('z'); /* Augmentation. */
out_one ('R'); out_one ('R');
if (cie->signal_frame)
out_one ('S');
out_one (0); out_one (0);
out_uleb128 (DWARF2_LINE_MIN_INSN_LENGTH); /* Code alignment. */ out_uleb128 (DWARF2_LINE_MIN_INSN_LENGTH); /* Code alignment. */
out_sleb128 (DWARF2_CIE_DATA_ALIGNMENT); /* Data alignment. */ out_sleb128 (DWARF2_CIE_DATA_ALIGNMENT); /* Data alignment. */
@ -944,7 +954,8 @@ select_cie_for_fde (struct fde_entry *fde, struct cfi_insn_data **pfirst)
for (cie = cie_root; cie; cie = cie->next) for (cie = cie_root; cie; cie = cie->next)
{ {
if (cie->return_column != fde->return_column) if (cie->return_column != fde->return_column
|| cie->signal_frame != fde->signal_frame)
continue; continue;
for (i = cie->first, j = fde->data; for (i = cie->first, j = fde->data;
i != cie->last && j != NULL; i != cie->last && j != NULL;
@ -1017,6 +1028,7 @@ select_cie_for_fde (struct fde_entry *fde, struct cfi_insn_data **pfirst)
cie->next = cie_root; cie->next = cie_root;
cie_root = cie; cie_root = cie;
cie->return_column = fde->return_column; cie->return_column = fde->return_column;
cie->signal_frame = fde->signal_frame;
cie->first = fde->data; cie->first = fde->data;
for (i = cie->first; i ; i = i->next) for (i = cie->first; i ; i = i->next)