X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fspu-tdep.c;h=032f5de4618c3d7d9bab5eaa7e5e1eac6b9aa36e;hb=e39371a3c471d65d5a83f89fd22c5c1184ee4145;hp=157f37b933b54a8d2223e1d0a68d3254c09c5351;hpb=3b7344d5ab495cd82b6c72ec5e00d018549837fb;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c index 157f37b..032f5de 100644 --- a/gdb/spu-tdep.c +++ b/gdb/spu-tdep.c @@ -24,8 +24,6 @@ #include "gdbtypes.h" #include "gdbcmd.h" #include "gdbcore.h" -#include -#include "gdb_assert.h" #include "frame.h" #include "frame-unwind.h" #include "frame-base.h" @@ -44,7 +42,8 @@ #include "observer.h" #include "infcall.h" #include "dwarf2.h" -#include "exceptions.h" +#include "dwarf2-frame.h" +#include "ax.h" #include "spu-tdep.h" @@ -311,13 +310,59 @@ spu_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, } } +static int +spu_ax_pseudo_register_collect (struct gdbarch *gdbarch, + struct agent_expr *ax, int regnum) +{ + switch (regnum) + { + case SPU_SP_REGNUM: + ax_reg_mask (ax, SPU_RAW_SP_REGNUM); + return 0; + + case SPU_FPSCR_REGNUM: + case SPU_SRR0_REGNUM: + case SPU_LSLR_REGNUM: + case SPU_DECR_REGNUM: + case SPU_DECR_STATUS_REGNUM: + return -1; + + default: + internal_error (__FILE__, __LINE__, _("invalid regnum")); + } +} + +static int +spu_ax_pseudo_register_push_stack (struct gdbarch *gdbarch, + struct agent_expr *ax, int regnum) +{ + switch (regnum) + { + case SPU_SP_REGNUM: + ax_reg (ax, SPU_RAW_SP_REGNUM); + return 0; + + case SPU_FPSCR_REGNUM: + case SPU_SRR0_REGNUM: + case SPU_LSLR_REGNUM: + case SPU_DECR_REGNUM: + case SPU_DECR_STATUS_REGNUM: + return -1; + + default: + internal_error (__FILE__, __LINE__, _("invalid regnum")); + } +} + + /* Value conversion -- access scalar values at the preferred slot. */ static struct value * -spu_value_from_register (struct type *type, int regnum, - struct frame_info *frame) +spu_value_from_register (struct gdbarch *gdbarch, struct type *type, + int regnum, struct frame_id frame_id) { - struct value *value = default_value_from_register (type, regnum, frame); + struct value *value = default_value_from_register (gdbarch, type, + regnum, frame_id); int len = TYPE_LENGTH (type); if (regnum < SPU_NUM_GPRS && len < 16) @@ -351,6 +396,15 @@ spu_register_reggroup_p (struct gdbarch *gdbarch, int regnum, return default_register_reggroup_p (gdbarch, regnum, group); } +/* DWARF-2 register numbers. */ + +static int +spu_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg) +{ + /* Use cooked instead of raw SP. */ + return (reg == SPU_RAW_SP_REGNUM)? SPU_SP_REGNUM : reg; +} + /* Address handling. */ @@ -1768,10 +1822,10 @@ spu_get_overlay_table (struct objfile *objfile) if (!ovly_buf_table_msym.minsym) return NULL; - ovly_table_base = MSYMBOL_VALUE_ADDRESS (ovly_table_msym.minsym); + ovly_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_table_msym); ovly_table_size = MSYMBOL_SIZE (ovly_table_msym.minsym); - ovly_buf_table_base = MSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym.minsym); + ovly_buf_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_buf_table_msym); ovly_buf_table_size = MSYMBOL_SIZE (ovly_buf_table_msym.minsym); ovly_table = xmalloc (ovly_table_size); @@ -1923,12 +1977,12 @@ spu_catch_start (struct objfile *objfile) /* If we have debugging information, try to use it -- this will allow us to properly skip the prologue. */ - pc = MSYMBOL_VALUE_ADDRESS (minsym.minsym); + pc = BMSYMBOL_VALUE_ADDRESS (minsym); symtab = find_pc_sect_symtab (pc, MSYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym)); if (symtab != NULL) { - struct blockvector *bv = BLOCKVECTOR (symtab); + const struct blockvector *bv = BLOCKVECTOR (symtab); struct block *block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); struct symbol *sym; struct symtab_and_line sal; @@ -2002,7 +2056,7 @@ flush_ea_cache (void) type = objfile_type (obj)->builtin_void; type = lookup_function_type (type); type = lookup_pointer_type (type); - addr = MSYMBOL_VALUE_ADDRESS (msymbol.minsym); + addr = BMSYMBOL_VALUE_ADDRESS (msymbol); call_function_by_hand (value_from_pointer (type, addr), 0, NULL); } @@ -2592,7 +2646,7 @@ info_spu_command (char *args, int from_tty) { printf_unfiltered (_("\"info spu\" must be followed by " "the name of an SPU facility.\n")); - help_list (infospucmdlist, "info spu ", -1, gdb_stdout); + help_list (infospucmdlist, "info spu ", all_commands, gdb_stdout); } @@ -2679,6 +2733,11 @@ spu_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_pseudo_register_write (gdbarch, spu_pseudo_register_write); set_gdbarch_value_from_register (gdbarch, spu_value_from_register); set_gdbarch_register_reggroup_p (gdbarch, spu_register_reggroup_p); + set_gdbarch_dwarf2_reg_to_regnum (gdbarch, spu_dwarf_reg_to_regnum); + set_gdbarch_ax_pseudo_register_collect + (gdbarch, spu_ax_pseudo_register_collect); + set_gdbarch_ax_pseudo_register_push_stack + (gdbarch, spu_ax_pseudo_register_push_stack); /* Data types. */ set_gdbarch_char_signed (gdbarch, 0); @@ -2717,6 +2776,7 @@ spu_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Frame handling. */ set_gdbarch_inner_than (gdbarch, core_addr_lessthan); + dwarf2_append_unwinders (gdbarch); frame_unwind_append_unwinder (gdbarch, &spu_frame_unwind); frame_base_set_default (gdbarch, &spu_frame_base); set_gdbarch_unwind_pc (gdbarch, spu_unwind_pc);