X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Frs6000-aix-tdep.c;h=38c86d4cd85a0c503e9704f8df586167590fc987;hb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;hp=80038a109520666e42f0ccd02dc2de3af8ebf78f;hpb=41e26ad32d17ee35f79f629654811f5e8656cab8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/rs6000-aix-tdep.c b/gdb/rs6000-aix-tdep.c index 80038a1095..38c86d4cd8 100644 --- a/gdb/rs6000-aix-tdep.c +++ b/gdb/rs6000-aix-tdep.c @@ -1,6 +1,6 @@ /* Native support code for PPC AIX, for GDB the GNU debugger. - Copyright (C) 2006-2016 Free Software Foundation, Inc. + Copyright (C) 2006-2018 Free Software Foundation, Inc. Free Software Foundation, Inc. @@ -36,6 +36,7 @@ #include "xcoffread.h" #include "solib.h" #include "solib-aix.h" +#include "target-float.h" #include "xml-utils.h" /* If the kernel has to deliver a signal, it pushes a sigcontext @@ -253,13 +254,12 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function, Always store the floating point value using the register's floating-point format. */ const int fp_regnum = tdep->ppc_fp0_regnum + 1 + f_argno; - gdb_byte reg_val[MAX_REGISTER_SIZE]; + gdb_byte reg_val[PPC_MAX_REGISTER_SIZE]; struct type *reg_type = register_type (gdbarch, fp_regnum); gdb_assert (len <= 8); - convert_typed_floating (value_contents (arg), type, - reg_val, reg_type); + target_float_convert (value_contents (arg), type, reg_val, reg_type); regcache_cooked_write (regcache, fp_regnum, reg_val); ++f_argno; } @@ -270,7 +270,7 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Argument takes more than one register. */ while (argbytes < len) { - gdb_byte word[MAX_REGISTER_SIZE]; + gdb_byte word[PPC_MAX_REGISTER_SIZE]; memset (word, 0, reg_size); memcpy (word, ((char *) value_contents (arg)) + argbytes, @@ -290,7 +290,7 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function, else { /* Argument can fit in one register. No problem. */ - gdb_byte word[MAX_REGISTER_SIZE]; + gdb_byte word[PPC_MAX_REGISTER_SIZE]; memset (word, 0, reg_size); memcpy (word, value_contents (arg), len); @@ -463,11 +463,11 @@ rs6000_return_value (struct gdbarch *gdbarch, struct value *function, if (readbuf) { regcache_cooked_read (regcache, tdep->ppc_fp0_regnum + 1, regval); - convert_typed_floating (regval, regtype, readbuf, valtype); + target_float_convert (regval, regtype, readbuf, valtype); } if (writebuf) { - convert_typed_floating (writebuf, valtype, regval, regtype); + target_float_convert (writebuf, valtype, regval, regtype); regcache_cooked_write (regcache, tdep->ppc_fp0_regnum + 1, regval); } @@ -600,7 +600,7 @@ static CORE_ADDR branch_dest (struct regcache *regcache, int opcode, int instr, CORE_ADDR pc, CORE_ADDR safety) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR dest; @@ -673,24 +673,22 @@ branch_dest (struct regcache *regcache, int opcode, int instr, /* AIX does not support PT_STEP. Simulate it. */ -static VEC (CORE_ADDR) * -rs6000_software_single_step (struct frame_info *frame) +static std::vector +rs6000_software_single_step (struct regcache *regcache) { - struct regcache *regcache = get_current_regcache (); - struct gdbarch *gdbarch = get_regcache_arch (regcache); + struct gdbarch *gdbarch = regcache->arch (); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int ii, insn; CORE_ADDR loc; CORE_ADDR breaks[2]; int opcode; - VEC (CORE_ADDR) *next_pcs; loc = regcache_read_pc (regcache); insn = read_memory_integer (loc, 4, byte_order); - next_pcs = ppc_deal_with_atomic_sequence (frame); - if (next_pcs != NULL) + std::vector next_pcs = ppc_deal_with_atomic_sequence (regcache); + if (!next_pcs.empty ()) return next_pcs; breaks[0] = loc + PPC_INSN_SIZE; @@ -706,7 +704,8 @@ rs6000_software_single_step (struct frame_info *frame) /* ignore invalid breakpoint. */ if (breaks[ii] == -1) continue; - VEC_safe_push (CORE_ADDR, next_pcs, breaks[ii]); + + next_pcs.push_back (breaks[ii]); } errno = 0; /* FIXME, don't ignore errors! */ @@ -909,20 +908,16 @@ static void rs6000_aix_shared_library_to_xml (struct ld_info *ldi, struct obstack *obstack) { - char *p; - obstack_grow_str (obstack, "filename); - obstack_grow_str (obstack, p); - xfree (p); + std::string p = xml_escape_text (ldi->filename); + obstack_grow_str (obstack, p.c_str ()); obstack_grow_str (obstack, "\""); if (ldi->member_name[0] != '\0') { obstack_grow_str (obstack, " member=\""); p = xml_escape_text (ldi->member_name); - obstack_grow_str (obstack, p); - xfree (p); + obstack_grow_str (obstack, p.c_str ()); obstack_grow_str (obstack, "\""); } @@ -1049,7 +1044,6 @@ rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) software single-stepping. */ set_gdbarch_displaced_step_copy_insn (gdbarch, NULL); set_gdbarch_displaced_step_fixup (gdbarch, NULL); - set_gdbarch_displaced_step_free_closure (gdbarch, NULL); set_gdbarch_displaced_step_location (gdbarch, NULL); set_gdbarch_push_dummy_call (gdbarch, rs6000_push_dummy_call); @@ -1081,14 +1075,16 @@ rs6000_aix_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch) else set_gdbarch_frame_red_zone_size (gdbarch, 0); + if (tdep->wordsize == 8) + set_gdbarch_wchar_bit (gdbarch, 32); + else + set_gdbarch_wchar_bit (gdbarch, 16); + set_gdbarch_wchar_signed (gdbarch, 0); set_gdbarch_auto_wide_charset (gdbarch, rs6000_aix_auto_wide_charset); set_solib_ops (gdbarch, &solib_aix_so_ops); } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_rs6000_aix_tdep; - void _initialize_rs6000_aix_tdep (void) {