aboutsummaryrefslogtreecommitdiff
path: root/gcc/frame.h
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@cygnus.com>2000-05-25 15:21:51 +0000
committerAndrew Haley <aph@gcc.gnu.org>2000-05-25 15:21:51 +0000
commitce152ef8360320d27e1aacba9af8fdc4e1649941 (patch)
treefeadfb24e9829d3678b304cad386af16dda71a31 /gcc/frame.h
parentc66265e4833fb9553699839453725586cc248fc3 (diff)
downloadgcc-ce152ef8360320d27e1aacba9af8fdc4e1649941.zip
gcc-ce152ef8360320d27e1aacba9af8fdc4e1649941.tar.gz
gcc-ce152ef8360320d27e1aacba9af8fdc4e1649941.tar.bz2
except.c (func_eh_entry): Add emitted field.
2000-05-25 Andrew MacLeod <amacleod@cygnus.com> Andrew Haley <aph@cygnus.com> * except.c (func_eh_entry): Add emitted field. (new_eh_region_entry): Set emitted field to 0; (output_exception_table_entry): Only emit previously un-emitted data, and send it to the eh_data section. (output_exception_table): Break out common parts. Output exception table for entire compilation unit to eh_data section. (output_exception_table_data): Common parts of output_exception_table. Send output to eh_data section. (output_function_exception_table): Output exception table data for a single function to eh_data section. (free_exception_table): New external to free the table. * except.h (free_exception_table): Add prototype. (output_function_exception_table): Add prototype. * final.c (final_end_function): Output function exception table for IA64_UNWIND_INFO. (final_scan_insn): Emit any unwind directives for an insn. * frame-dwarf2.c: New file containing all DWARF 2 specific code from frame.c. * frame.c: Remove all DWARF 2 specific code. * config/ia64/frame-ia64.c: New file. (gthread_stuff): Make all gthread available with IA64_UNWIND_INFO. (dwarf_fde): Define an IA64 struct for dwarf_fde. (__register_frame_info, __register_frame): Move to common area of file. (__register_frame_info_table, __register_frame_table): Move to common i area. (__deregister_frame_info, __deregister_frame): Move to common area. (__frame_init, find_fde): New versions for IA64_UNWIND_INFO. (read_uleb128): New version for ia64. (get_unwind_record): Read the next IA-64 unwind record. (read_R_record): Read a region header record. (process_a_b_reg_code): X record helper. (read_X_record): Read an X format record. (read_B_record): Read a B format record. (P3_record_types): List of record types matching the P3 format. (P7_record_types): List of record types matching the P7 format. (P8_record_types): List of record types matching the P8 format. (read_P_record): Read a P format record. (init_ia64_reg_loc): Set default fields for a register. (init_ia64_unwind_frame): Set defaults for all register records. (execute_one_ia64_descriptor): Execute one descriptor record. (rse_address_add): Calculate the position of a local reg in memory. (normalize_reg_loc): Turn a location descriptor into a memory address. (maybe_normalize_reg_loc): Only normalize a descriptor if it falls within a specified PC offset range. (get_real_reg_value): Given a register location, retrieve its value. (set_real_reg_value): Change the value of a register location. (copy_reg_value): Copy reg values, if needed. (copy_saved_reg_state): Copy all registers that need to be copied. (process_state_between): Normalize all frame register records that fall within the specified PC range. (frame_translate): Take a processed frame description, and turn everything into addresses. (build_ia64_frame_state ): Find and create frame state record for a PC. (get_personality): Get the personality routine for a given frame. (get_except_table): Get the exception table for a given frame. (record_name): Unwind record names for debugging. (print_record): Print and unwind record. (print_all_records): Print an entire unwind image. (__ia64_backtrace): Print a backtrace. (ia64_backtrace_helper): New function. (__register_frame_info_aux): New function. * config/ia64/crtend.asm (__do_frame_setup_aux): New function. * frame.h (enum unw_record_type): New unwind record types. (struct unw_p_record, unw_b_record, unw_x_record) : New unwind records. (struct unw_r_record, unwind_record): New unwind record structs. (struct unwind_info_ptr): Unwind information layout. (IA64_UNW_LOC_TYPE_*): Macros for different types for location descriptors. (struct ia64_reg_loc): Register location description. (struct ia64_frame_state): Location of all registers in a frame. (struct object): Add pc_base and fde_end for IA64_UNWIND_INFO. * libgcc2.c (__ia64_personality_v1): Personality routine. (__calc_caller_bsp): Calculate the bsp register for the caller's frame. (ia64_throw_helper): Figure out who to return to and set up the registers. (__throw): Throw routine. * output.h (assemble_eh_align, assemble_eh_label): New functions to generate EH info where we want it. (assemble_eh_integer): New function. * toplev.c (compile_file): Output module level exception table for non-ia64 targets. (main): Set exceptions_via_longjump and flag_new_exceptions based on IA64_UNWIND_INFO too. * varasm.c (assemble_eh_label): Generate a label via ASM_OUTPUT_EH_LABEL if it has been specified. (assemble_eh_align): Generate an alignment directive via ASM_OUTPUT_EH_ALIGN if it has been specified. (assemble_eh_label): Generate an integer value via ASM_OUTPUT_EH_type if they have been specified. * config/ia64/ia64.c (rtx_needs_barrier): Add flushrs. (ia64_init_builtins): Add __builtin_ia64_bsp and __builtin_ia64_flushrs. (ia64_expand_builtin): Add IA64_BUILTIN_BSP and IA64_BUILTIN_FLUSHRS. * config/ia64/ia64.h (ia64_builtins): Add IA64_BUILTIN_BSP and IA64_BUILTIN_FLUSHRS. * config/ia64/ia64.md (flushrs): New insn to flush the register stack. Add to unspec list. * config/ia64/crtbegin.asm (frame_object): Change size. (__do_frame_setup_aux): New function. * config/ia64/crtend.asm: call __do_frame_setup_aux. * config/ia64/t-ia64 (LIB2ADDEH): Add. * Makefile.in (LIB2ADDEH): Add. (LIB2ADD): Use LIB2ADDEH. Co-Authored-By: Andrew Haley <aph@cygnus.com> From-SVN: r34169
Diffstat (limited to 'gcc/frame.h')
-rw-r--r--gcc/frame.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/gcc/frame.h b/gcc/frame.h
index 330277c..384e5eb 100644
--- a/gcc/frame.h
+++ b/gcc/frame.h
@@ -50,9 +50,15 @@ typedef struct frame_state
keep the copies synchronized! */
struct object {
+#ifdef IA64_UNWIND_INFO
+ void *pc_base; /* This field will be set by find_fde. */
+#endif
void *pc_begin;
void *pc_end;
struct dwarf_fde *fde_begin;
+#ifdef IA64_UNWIND_INFO
+ struct dwarf_fde *fde_end;
+#endif
struct dwarf_fde **fde_array;
size_t count;
struct object *next;
@@ -87,3 +93,184 @@ extern void *__deregister_frame_info (void *);
Returns NULL on failure, otherwise returns STATE_IN. */
extern struct frame_state *__frame_state_for (void *, struct frame_state *);
+
+#ifdef IA64_UNWIND_INFO
+
+/* This is the information required for unwind records in an ia64
+ object file. This is required by GAS and the compiler runtime. */
+
+/* These are the starting point masks for the various types of
+ unwind records. To create a record of type R3 for instance, one
+ starts by using the value UNW_R3 and or-ing in any other required values.
+ These values are also unique (in context), so they can be used to identify
+ the various record types as well. UNW_Bx and some UNW_Px do have the
+ same value, but Px can only occur in a prologue context, and Bx in
+ a body context. */
+
+#define UNW_R1 0x00
+#define UNW_R2 0x40
+#define UNW_R3 0x60
+#define UNW_P1 0x80
+#define UNW_P2 0xA0
+#define UNW_P3 0xB0
+#define UNW_P4 0xB8
+#define UNW_P5 0xB9
+#define UNW_P6 0xC0
+#define UNW_P7 0xE0
+#define UNW_P8 0xF0
+#define UNW_P9 0xF1
+#define UNW_P10 0xFF
+#define UNW_X1 0xF9
+#define UNW_X2 0xFA
+#define UNW_X3 0xFB
+#define UNW_X4 0xFC
+#define UNW_B1 0x80
+#define UNW_B2 0xC0
+#define UNW_B3 0xE0
+#define UNW_B4 0xF0
+
+/* These are all the various types of unwind records. */
+
+typedef enum
+{
+ prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
+ rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
+ pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
+ fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
+ unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
+ lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
+ priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
+ priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
+ bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
+ rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
+ spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
+ spill_reg_p
+} unw_record_type;
+
+
+/* These structures declare the fields that can be used in each of the
+ 4 record formats, R, P, B and X. */
+
+typedef struct unw_r_record
+{
+ unsigned long rlen;
+ unsigned short mask;
+ unsigned short grsave;
+} unw_r_record;
+
+typedef struct unw_p_record
+{
+ void *imask;
+ unsigned long t;
+ unsigned long size;
+ unsigned long spoff;
+ unsigned long br;
+ unsigned long pspoff;
+ unsigned short gr;
+ unsigned short rmask;
+ unsigned short grmask;
+ unsigned long frmask;
+ unsigned short brmask;
+} unw_p_record;
+
+typedef struct unw_b_record
+{
+ unsigned long t;
+ unsigned long label;
+ unsigned short ecount;
+} unw_b_record;
+
+typedef struct unw_x_record
+{
+ unsigned long t;
+ unsigned long spoff;
+ unsigned long pspoff;
+ unsigned short reg;
+ unsigned short treg;
+ unsigned short qp;
+ unsigned short xy; /* Value of the XY field.. */
+} unw_x_record;
+
+/* This structure is used to determine the specific record type and
+ its fields. */
+typedef struct unwind_record
+{
+ unw_record_type type;
+ union {
+ unw_r_record r;
+ unw_p_record p;
+ unw_b_record b;
+ unw_x_record x;
+ } record;
+} unwind_record;
+
+#define IA64_UNW_LOC_TYPE_NONE 0
+#define IA64_UNW_LOC_TYPE_MEM 1
+#define IA64_UNW_LOC_TYPE_GR 2
+#define IA64_UNW_LOC_TYPE_FR 3
+#define IA64_UNW_LOC_TYPE_BR 4
+#define IA64_UNW_LOC_TYPE_SPOFF 5
+#define IA64_UNW_LOC_TYPE_PSPOFF 6
+#define IA64_UNW_LOC_TYPE_OFFSET 7
+#define IA64_UNW_LOC_TYPE_SPILLBASE 8
+
+typedef struct ia64_reg_loc
+{
+ long when; /* PC relative offset from start of function. */
+ union { /* In memory or another register? */
+ void *mem;
+ int regno;
+ int offset;
+ } l;
+ short loc_type; /* Where to find value. */
+ short reg_size;
+} ia64_reg_loc;
+
+/* Frame information record. */
+
+typedef struct ia64_frame_state
+{
+ ia64_reg_loc gr[4]; /* gr4 to gr7. */
+ ia64_reg_loc fr[20]; /* fr2 to fr5, fr16 to fr31. */
+ ia64_reg_loc br[5]; /* br1 to br5. */
+ ia64_reg_loc rp;
+ ia64_reg_loc fpsr;
+ ia64_reg_loc bsp;
+ ia64_reg_loc bspstore;
+ ia64_reg_loc rnat;
+ ia64_reg_loc pfs;
+ ia64_reg_loc unat;
+ ia64_reg_loc lc;
+ ia64_reg_loc pr;
+ ia64_reg_loc priunat;
+ ia64_reg_loc sp;
+ ia64_reg_loc psp;
+ ia64_reg_loc spill_base;
+ void *my_sp;
+ void *my_bsp;
+} ia64_frame_state;
+
+/* This structure represents the start of an unwind information pointer.
+ 'unwind_descriptors' is the beginninng of the unwind descriptors, which
+ use up 'length' bytes of storage. */
+
+typedef struct unwind_info_ptr
+{
+ unsigned short version;
+ unsigned short flags;
+ unsigned int length;
+ unsigned char unwind_descriptors[1];
+} unwind_info_ptr;
+
+
+extern unwind_info_ptr *__build_ia64_frame_state (unsigned char *,
+ ia64_frame_state *, void *,
+ void **);
+extern void *__get_real_reg_value (ia64_reg_loc *);
+extern void *__get_personality (unwind_info_ptr *);
+extern void *__get_except_table (unwind_info_ptr *);
+extern void __set_real_reg_value (ia64_reg_loc *, void *);
+void *__calc_caller_bsp (long, unsigned char *);
+void __copy_saved_reg_state (ia64_frame_state *, ia64_frame_state *);
+#endif /* IA64_UNWIND_INFO */
+