aboutsummaryrefslogtreecommitdiff
path: root/gas/dw2gencfi.h
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2011-05-09 13:17:58 +0000
committerPaul Brook <paul@codesourcery.com>2011-05-09 13:17:58 +0000
commit1bce6bd86f99b05ddc311eb34545165983ff8ddc (patch)
tree67998c9ac603266185a3b7c6898b0d3b8e607200 /gas/dw2gencfi.h
parent9cf0e28212068b89d962e7c850f33b56a0f50a09 (diff)
downloadgdb-1bce6bd86f99b05ddc311eb34545165983ff8ddc.zip
gdb-1bce6bd86f99b05ddc311eb34545165983ff8ddc.tar.gz
gdb-1bce6bd86f99b05ddc311eb34545165983ff8ddc.tar.bz2
2011-05-09 Paul Brook <paul@codesourcery.com>
bfd/ * elf32-tic6x.c (is_tic6x_elf_unwind_section_name, elf32_tic6x_fake_sections): New functions. (elf_backend_fake_sections): Define. gas/ * config/tc-tic6x.c (streq): Define. (tic6x_get_unwind): New. (s_tic6x_cantunwind, s_tic6x_handlerdata, s_tic6x_endp, s_tic6x_personalityindex, s_tic6x_personality): New functions. (md_pseudo_table): Add "endp", "handlerdata", "personalityindex", "personality" and "cantunwind". (tic6x_regname_to_dw2regnum, tic6x_frame_initial_instructions, tic6x_start_unwind_section, tic6x_unwind_frame_regs, tic6x_pop_rts_offset_little, tic6x_pop_rts_offset_big, tic6x_unwind_reg_from_dwarf, tic6x_flush_unwind_word, tic6x_unwind_byte, tic6x_unwind_2byte, tic6x_unwind_uleb, tic6x_cfi_startproc, output_exidx_entry, tic6x_output_unwinding, tic6x_cfi_endproc): New. * config/tc-tic6x.h (TIC6X_NUM_UNWIND_REGS): Define. (tic6x_unwind_info): New. (tic6x_segment_info_type): Add marked_pr_dependency, unwind and text_unwind. (TARGET_USE_CFIPOP, tc_regname_to_dw2regnum, tc_cfi_frame_initial_instructions, DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT, tc_cfi_startproc, tc_cfi_endproc, tc_cfi_section_name): Define. * doc/c-tic6x.texi: Document new unwinding directives. * dw2gencfi.c (tc_cfi_startproc, tc_cfi_endproc): Add default definitions. (cfi_insn_data, fde_entry, CFI_adjust_cfa_offset, CFI_return_column, CFI_rel_offset, CFI_escape, CFI_signal_frame, CFI_val_encoded_addr): Move to dw2gencfi.h. (CFI_EMIT_target): Define. (dot_cfi_sections): Check tc_cfi_section_name. (dot_cfi_startproc): Use tc_cfi_startproc. (dot_cfi_endproc): Use tc_cfi_endproc. * dw2gencfi.h (cfi_insn_data, fde_entry, CFI_adjust_cfa_offset, CFI_return_column, CFI_rel_offset, CFI_escape, CFI_signal_frame, CFI_val_encoded_addr): Move to here from dw2gencfi.c. gas/testsuite: * gas/tic6x/unwind-1.d: New test. * gas/tic6x/unwind-1.s: New test. * gas/tic6x/unwind-2.d: New test. * gas/tic6x/unwind-2.s: New test. * gas/tic6x/unwind-3.d: New test. * gas/tic6x/unwind-3.s: New test. * gas/tic6x/unwind-bad-1.d: New test. * gas/tic6x/unwind-bad-1.s: New test. * gas/tic6x/unwind-bad-1.l: New test. * gas/tic6x/unwind-bad-2.d: New test. * gas/tic6x/unwind-bad-2.s: New test. * gas/tic6x/unwind-bad-2.l: New test. include/ * elf/tic6x.h (ELF_STRING_C6000_unwind, ELF_STRING_C6000_unwind_info, ELF_STRING_C6000_unwind_once, ELF_STRING_C6000_unwind_info_once): Define.
Diffstat (limited to 'gas/dw2gencfi.h')
-rw-r--r--gas/dw2gencfi.h77
1 files changed, 77 insertions, 0 deletions
diff --git a/gas/dw2gencfi.h b/gas/dw2gencfi.h
index f8f235d..0226cdd 100644
--- a/gas/dw2gencfi.h
+++ b/gas/dw2gencfi.h
@@ -49,4 +49,81 @@ extern void cfi_add_CFA_same_value (unsigned);
extern void cfi_add_CFA_remember_state (void);
extern void cfi_add_CFA_restore_state (void);
+/* Structures for md_cfi_end. */
+
+#if defined (TE_PE) || defined (TE_PEP)
+#define SUPPORT_FRAME_LINKONCE 1
+#else
+#define SUPPORT_FRAME_LINKONCE 0
+#endif
+
+struct cfi_insn_data
+{
+ struct cfi_insn_data *next;
+#if SUPPORT_FRAME_LINKONCE
+ segT cur_seg;
+#endif
+ int insn;
+ union
+ {
+ struct
+ {
+ unsigned reg;
+ offsetT offset;
+ } ri;
+
+ struct
+ {
+ unsigned reg1;
+ unsigned reg2;
+ } rr;
+
+ unsigned r;
+ offsetT i;
+
+ struct
+ {
+ symbolS *lab1;
+ symbolS *lab2;
+ } ll;
+
+ struct cfi_escape_data *esc;
+
+ struct
+ {
+ unsigned reg, encoding;
+ expressionS exp;
+ } ea;
+ } u;
+};
+
+struct fde_entry
+{
+ struct fde_entry *next;
+#if SUPPORT_FRAME_LINKONCE
+ segT cur_seg;
+#endif
+ symbolS *start_address;
+ symbolS *end_address;
+ struct cfi_insn_data *data;
+ struct cfi_insn_data **last;
+ unsigned char per_encoding;
+ unsigned char lsda_encoding;
+ expressionS personality;
+ expressionS lsda;
+ unsigned int return_column;
+ unsigned int signal_frame;
+#if SUPPORT_FRAME_LINKONCE
+ int handled;
+#endif
+};
+
+/* Fake CFI type; outside the byte range of any real CFI insn. */
+#define CFI_adjust_cfa_offset 0x100
+#define CFI_return_column 0x101
+#define CFI_rel_offset 0x102
+#define CFI_escape 0x103
+#define CFI_signal_frame 0x104
+#define CFI_val_encoded_addr 0x105
+
#endif /* DW2GENCFI_H */