bfd/
authorJakub Jelinek <jakub@redhat.com>
Mon, 27 Feb 2006 23:07:06 +0000 (23:07 +0000)
committerJakub Jelinek <jakub@redhat.com>
Mon, 27 Feb 2006 23:07:06 +0000 (23:07 +0000)
* 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.

bfd/ChangeLog
bfd/elf-eh-frame.c
gas/ChangeLog
gas/doc/as.texinfo
gas/dw2gencfi.c

index a22a384fd8f78c85829d3a886719a50c2b611894..cba16409cb6108af7eab6d7407dc1e4cdc7d5c4b 100644 (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>
 
        * po/Make-in: Add html target.
index d5041d01ba1b1220d44b23704355a6ce0e76c17f..ab0b995c0c238f485907b84bd331822cb284c420 100644 (file)
@@ -1,5 +1,5 @@
 /* .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>.
 
    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);
                    REQUIRE (get_DW_EH_PE_width (cie.fde_encoding, ptr_size));
                    break;
+                 case 'S':
+                   break;
                  case 'P':
                    {
                      int per_width;
@@ -1178,6 +1180,8 @@ _bfd_elf_write_section_eh_frame (bfd *abfd,
                      }
                    buf++;
                    break;
+                 case 'S':
+                   break;
                  default:
                    BFD_FAIL ();
                  }
index ff194bbe6c4be1383a0ac3600d05cab73cf019a1..f4d28ef2f3797feda2301e6d5bb5c9d1fb4f9273 100644 (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>
 
        * doc/Makefile.am: Add html target.
index b6879e27709846ffd6d7f41880d23c1f8840b73a..d34b754facd83e3a01b70cbec9e2d0ae9c3863fa 100644 (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
 code it's annotating.
 
+@section @code{.cfi_signal_frame}
+Mark current function as signal trampoline.
+
 @section @code{.cfi_window_save}
 SPARC register window has been saved.
 
index eb2f476b71105a5c6d70a78f17f961af5b8e2b8b..bfa5d5cf45a6f74d0815a0d80810b41bed0b284c 100644 (file)
@@ -1,5 +1,5 @@
 /* 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>
 
    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 **last;
   unsigned int return_column;
+  unsigned int signal_frame;
 };
 
 struct cie_entry
@@ -95,6 +96,7 @@ struct cie_entry
   struct cie_entry *next;
   symbolS *start_address;
   unsigned int return_column;
+  unsigned int signal_frame;
   struct cfi_insn_data *first, *last;
 };
 
@@ -354,6 +356,7 @@ static void dot_cfi_endproc (int);
 #define CFI_return_column      0x101
 #define CFI_rel_offset         0x102
 #define CFI_escape             0x103
+#define CFI_signal_frame       0x104
 
 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_window_save", dot_cfi, DW_CFA_GNU_window_save },
     { "cfi_escape", dot_cfi_escape, 0 },
+    { "cfi_signal_frame", dot_cfi, CFI_signal_frame },
     { NULL, NULL, 0 }
   };
 
@@ -547,6 +551,10 @@ dot_cfi (int arg)
       cfi_add_CFA_insn (DW_CFA_GNU_window_save);
       break;
 
+    case CFI_signal_frame:
+      cur_fde_data->signal_frame = 1;
+      break;
+
     default:
       abort ();
     }
@@ -864,6 +872,8 @@ output_cie (struct cie_entry *cie)
   out_one (DW_CIE_VERSION);                    /* Version.  */
   out_one ('z');                               /* Augmentation.  */
   out_one ('R');
+  if (cie->signal_frame)
+    out_one ('S');
   out_one (0);
   out_uleb128 (DWARF2_LINE_MIN_INSN_LENGTH);   /* Code 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)
     {
-      if (cie->return_column != fde->return_column)
+      if (cie->return_column != fde->return_column
+         || cie->signal_frame != fde->signal_frame)
        continue;
       for (i = cie->first, j = fde->data;
           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_root = cie;
   cie->return_column = fde->return_column;
+  cie->signal_frame = fde->signal_frame;
   cie->first = fde->data;
 
   for (i = cie->first; i ; i = i->next)