/* dw2gencfi.c - Support for generating Dwarf2 CFI information.
- Copyright 2003, 2004 Free Software Foundation, Inc.
+ Copyright 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Michal Ludvig <mludvig@suse.cz>
This file is part of GAS, the GNU Assembler.
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to the Free
- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA. */
+ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+ 02110-1301, USA. */
#include "as.h"
#include "dw2gencfi.h"
#endif
#ifndef EH_FRAME_ALIGNMENT
-# ifdef BFD_ASSEMBLER
-# define EH_FRAME_ALIGNMENT (bfd_get_arch_size (stdoutput) == 64 ? 3 : 2)
-# else
-# define EH_FRAME_ALIGNMENT 2
-# endif
+# define EH_FRAME_ALIGNMENT (bfd_get_arch_size (stdoutput) == 64 ? 3 : 2)
#endif
#ifndef tc_cfi_frame_initial_instructions
}
#endif
- expression (&exp);
+ expression_and_evaluate (&exp);
switch (exp.X_op)
{
case O_register:
if (!cur_fde_data)
{
as_bad (_("CFI instruction used without previous .cfi_startproc"));
+ ignore_rest_of_line ();
return;
}
break;
case DW_CFA_restore:
- reg1 = cfi_parse_reg ();
- cfi_add_CFA_restore (reg1);
+ for (;;)
+ {
+ reg1 = cfi_parse_reg ();
+ cfi_add_CFA_restore (reg1);
+ SKIP_WHITESPACE ();
+ if (*input_line_pointer != ',')
+ break;
+ ++input_line_pointer;
+ }
break;
case DW_CFA_undefined:
- reg1 = cfi_parse_reg ();
- cfi_add_CFA_undefined (reg1);
+ for (;;)
+ {
+ reg1 = cfi_parse_reg ();
+ cfi_add_CFA_undefined (reg1);
+ SKIP_WHITESPACE ();
+ if (*input_line_pointer != ',')
+ break;
+ ++input_line_pointer;
+ }
break;
case DW_CFA_same_value:
if (!cur_fde_data)
{
as_bad (_("CFI instruction used without previous .cfi_startproc"));
+ ignore_rest_of_line ();
return;
}
insn = alloc_cfi_insn_data ();
insn->insn = CFI_escape;
insn->u.esc = head;
+
+ --input_line_pointer;
+ demand_empty_rest_of_line ();
}
static void
if (cur_fde_data)
{
as_bad (_("previous CFI entry not closed (missing .cfi_endproc)"));
+ ignore_rest_of_line ();
return;
}
if (! cur_fde_data)
{
as_bad (_(".cfi_endproc without corresponding .cfi_startproc"));
+ ignore_rest_of_line ();
return;
}
cfi_end_fde (symbol_temp_new_now ());
+
+ demand_empty_rest_of_line ();
}
\f
for (i = cie->first; i != cie->last; i = i->next)
output_cfi_insn (i);
- frag_align (2, 0, 0);
+ frag_align (2, DW_CFA_nop, 0);
symbol_set_value_now (end_address);
}
for (; first; first = first->next)
output_cfi_insn (first);
- frag_align (align, 0, 0);
+ frag_align (align, DW_CFA_nop, 0);
symbol_set_value_now (end_address);
}
/* Open .eh_frame section. */
cfi_seg = subseg_new (".eh_frame", 0);
-#ifdef BFD_ASSEMBLER
bfd_set_section_flags (stdoutput, cfi_seg,
SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY);
-#endif
subseg_set (cfi_seg, 0);
record_alignment (cfi_seg, EH_FRAME_ALIGNMENT);