mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 07:08:01 +08:00
IA-64 unwind info changes, fix errors, add missing pieces, and some cleanup.
* config/tc-ia64.c (dot_restorereg_p): New function. (md_pseudo_table): Add restorereg.p. ...
This commit is contained in:
@ -1,3 +1,101 @@
|
|||||||
|
2000-05-24 David Mosberger <davidm@hpl.hp.com>
|
||||||
|
|
||||||
|
* config/tc-ia64.c (dot_restorereg_p): New function.
|
||||||
|
(md_pseudo_table): Add restorereg.p.
|
||||||
|
(output_X3_format): Fix typo: record type should be UNW_X3, not UNW_X1.
|
||||||
|
(output_X4_format): Fix typo: record type should be UNW_X4, not UNW_X2.
|
||||||
|
|
||||||
|
* config/tc-ia64.h (unw_record_type): Add unwabi.
|
||||||
|
(unw_r_record): Rename member MASK to GRMASK. Add sub-structure
|
||||||
|
called MASK with members for imask, and the masks produced by
|
||||||
|
fr_mem, gr_mem, br_mem, and frgr_mem.
|
||||||
|
(unw_p_record): Add members ABI and CONTEXT.
|
||||||
|
(unw_x_record): Add member AB.
|
||||||
|
* config/tc-ia64.c (enum reg_symbol): Add REG_PSP and REG_PRIUNAT
|
||||||
|
as pseudo-register for use during unwind info generation.
|
||||||
|
(AR_PFS, AR_LC): New macros.
|
||||||
|
(enum pseudo_type): Add PSEUDO_FUNC_REG to permit declaring registers
|
||||||
|
whose names start with an at sign (as in "@priunat").
|
||||||
|
(pseudo_func): Add "svr4", "hpux", "nt" constants and "priunat"
|
||||||
|
register.
|
||||||
|
(unwind_list, unwind_tail, current_unwind_entry, proc_start,
|
||||||
|
proc_end, unwind_info, personality_routine): Consolidate into
|
||||||
|
"unwind" structure to reduce offset-table use. Add member
|
||||||
|
NEXT_SLOT_NUMBER to track the slot number for the next instruction
|
||||||
|
to be emitted.
|
||||||
|
(output_R1_format, output_R3_format, output_P3_format,
|
||||||
|
output_P6_format): Initialize R with zero to reduce compiler warnings.
|
||||||
|
(output_P7_format): Ditto. Add `default' branch to switch
|
||||||
|
statement to reduce compiler warnings.
|
||||||
|
(output_P8_format, output_B1_format, output_B4_format): Ditto.
|
||||||
|
(output_P4_format): Rename 2nd & 3rd arg to IMASK and IMASK_SIZE.
|
||||||
|
(format_ab_reg): Rename from format_a_b_reg. Merge A and B args
|
||||||
|
into single argument.
|
||||||
|
(output_X1_format, output_X3_format): Initialize R with zero to reduce
|
||||||
|
compiler warnings. Merge A and B args into single argument.
|
||||||
|
(output_X2_format, output_X4_format): Remove unused variable R. Merge
|
||||||
|
A and B args into single argument.
|
||||||
|
(free_record): Removed (wasn't used).
|
||||||
|
(free_list_records): Also free imasks in prologue records.
|
||||||
|
(output_prologue, output_prologue_gr): Initialize mask bits to zero.
|
||||||
|
(output_spill_mask): Remove.
|
||||||
|
(output_unwabi): New function.
|
||||||
|
(output_epilogue, output_label_state, output_copy_state): Call
|
||||||
|
alloc_record.
|
||||||
|
(output_spill_psprel, output_spill_sprel, output_spill_psprel_p,
|
||||||
|
output_spill_sprel_p, output_spill_reg, output_spill_reg_p): Add AB
|
||||||
|
argument.
|
||||||
|
(process_one_record): New locals FR_MASK and GR_MASK. Ignore
|
||||||
|
gr_mem, fr_mem, br_mem, and frgr_mem records and instead emit them
|
||||||
|
as part of handling the prologue records. Emit region's imask if
|
||||||
|
we have one. Handle unwabi, epilogue, label_state, copy_state,
|
||||||
|
spill_psprel, spill_sprel, spill_reg, spill_psprel_p,
|
||||||
|
spill_sprel_p, and spill_reg_p records.
|
||||||
|
(set_imask, count_bits, slot_index): New function.
|
||||||
|
(fixup_unw_records): Fix region size computation. Handle
|
||||||
|
epilogue, spill_reg, spill_sprel, spill_psprel, spill_reg_p,
|
||||||
|
spill_sprel_p, and spill_psprel_p records. Merge mask bits of
|
||||||
|
frgr_mem, fr_mem, gr_mem, br_mem on a per-region basis and
|
||||||
|
set_imask accordingly. Update imask for gr_gr, and br_gr records.
|
||||||
|
(convert_expr_to_ab_reg, convert_expr_to_xy_reg): New function.
|
||||||
|
(dot_save): Use manifest constants for applicaton registers.
|
||||||
|
Handle REG_PR and REG_PRIUNAT.
|
||||||
|
(dot_restore): Don't just ignore it.
|
||||||
|
(dot_restorereg): New function..
|
||||||
|
(generate_unwind_image): Ensure unwind info is a multiple of eight
|
||||||
|
bytes, not just four bytes.
|
||||||
|
(dot_handlerdata, dot_unwentry): Demand empty rest of line.
|
||||||
|
(dot_altrp): Don't just ignore it.
|
||||||
|
(dot_savemem): New function. Replaces dot_savesp() and
|
||||||
|
dot_savepsp(). Use manifest constants for applicaton registers.
|
||||||
|
Handle REG_PR and REG_PRIUNAT.
|
||||||
|
(dot_savef): Simplify.
|
||||||
|
(dot_saveb): Support generation of br_gr.
|
||||||
|
(dot_spillreg, dot_spillmem, dot_spillreg_p, dot_spillmem_p,
|
||||||
|
dot_label_state, dot_copy_state): New function.
|
||||||
|
(dot_unwabi): Don't just ignore it.
|
||||||
|
(md_pseudo_table): Add restorereg, spillreg, spillsp, spillpsp,
|
||||||
|
spillreg.p, spillsp.p, spillpsp, label_state, copy_state,
|
||||||
|
unwabi, vframesp, and vframepsp. Fix typo alprp->altrp.
|
||||||
|
(emit_one_bundle): Set slot number for prologue/body records
|
||||||
|
*before* emitting the first insn.
|
||||||
|
(emit_one_bundle): Set UNWIND.NEXT_SLOT_NUMBER.
|
||||||
|
(md_begin): Declare "psp" pseudo-register.
|
||||||
|
(md_operand): Handle PSEUDO_FUNC_REG. Fix printing of error message
|
||||||
|
so we don't get segfault.
|
||||||
|
(output_psp_sprel): Output sp/psp relative offsets as 4-byte word
|
||||||
|
counts as required per SW Conventions manual
|
||||||
|
(output_rp_psprel, output_rp_sprel, output_pfs_psprel,output_pfs_sprel,
|
||||||
|
output_preds_psprel, output_preds_sprel, output_spill_base,
|
||||||
|
output_unat_psprel, output_unat_sprel, output_lc_psprel,
|
||||||
|
output_lc_sprel, output_fpsr_psprel, output_fpsr_sprel,
|
||||||
|
output_priunat_psprel, output_priunat_sprel, output_bsp_psprel,
|
||||||
|
output_bsp_sprel, output_bspstore_psprel, output_bspstore_sprel,
|
||||||
|
output_rnat_psprel, output_rnat_sprel, output_spill_psprel,
|
||||||
|
output_spill_sprel, output_spill_psprel_p, output_spill_sprel_p):Ditto.
|
||||||
|
(dot_vframe): Implement.
|
||||||
|
(dot_vframesp, dot_vframepsp): New function.
|
||||||
|
|
||||||
Tue May 23 00:57:05 2000 Hans-Peter Nilsson <hp@axis.com>
|
Tue May 23 00:57:05 2000 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
* configure.in (i386-*-freebsd a.out entry): Quote properly.
|
* configure.in (i386-*-freebsd a.out entry): Quote properly.
|
||||||
|
1402
gas/config/tc-ia64.c
1402
gas/config/tc-ia64.c
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
|||||||
/* tc-ia64.h -- Header file for tc-ia64.c.
|
/* tc-ia64.h -- Header file for tc-ia64.c.
|
||||||
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
|
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||||
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
|
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
|
||||||
|
|
||||||
This file is part of GAS, the GNU Assembler.
|
This file is part of GAS, the GNU Assembler.
|
||||||
@ -157,7 +157,7 @@ typedef enum
|
|||||||
bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
|
bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
|
||||||
rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
|
rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
|
||||||
spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
|
spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
|
||||||
spill_reg_p
|
spill_reg_p, unwabi
|
||||||
} unw_record_type;
|
} unw_record_type;
|
||||||
|
|
||||||
|
|
||||||
@ -167,8 +167,18 @@ typedef enum
|
|||||||
typedef struct unw_r_record
|
typedef struct unw_r_record
|
||||||
{
|
{
|
||||||
unsigned long rlen;
|
unsigned long rlen;
|
||||||
unsigned short mask;
|
unsigned short grmask;
|
||||||
unsigned short grsave;
|
unsigned short grsave;
|
||||||
|
/* masks to represent the union of save.g, save.f, save.b, and
|
||||||
|
save.gf: */
|
||||||
|
unsigned long imask_size;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned char *i;
|
||||||
|
unsigned long fr_mem;
|
||||||
|
unsigned char gr_mem;
|
||||||
|
unsigned char br_mem;
|
||||||
|
} mask;
|
||||||
} unw_r_record;
|
} unw_r_record;
|
||||||
|
|
||||||
typedef struct unw_p_record
|
typedef struct unw_p_record
|
||||||
@ -184,6 +194,8 @@ typedef struct unw_p_record
|
|||||||
unsigned short grmask;
|
unsigned short grmask;
|
||||||
unsigned long frmask;
|
unsigned long frmask;
|
||||||
unsigned short brmask;
|
unsigned short brmask;
|
||||||
|
unsigned char abi;
|
||||||
|
unsigned char context;
|
||||||
} unw_p_record;
|
} unw_p_record;
|
||||||
|
|
||||||
typedef struct unw_b_record
|
typedef struct unw_b_record
|
||||||
@ -201,7 +213,8 @@ typedef struct unw_x_record
|
|||||||
unsigned short reg;
|
unsigned short reg;
|
||||||
unsigned short treg;
|
unsigned short treg;
|
||||||
unsigned short qp;
|
unsigned short qp;
|
||||||
unsigned short xy; /* Value of the XY field.. */
|
unsigned short ab; /* Value of the AB field.. */
|
||||||
|
unsigned short xy; /* Value of the XY field.. */
|
||||||
} unw_x_record;
|
} unw_x_record;
|
||||||
|
|
||||||
/* This structure is used to determine the specific record type and
|
/* This structure is used to determine the specific record type and
|
||||||
|
Reference in New Issue
Block a user