X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fhppa-tdep.c;h=866e6cf6dea3dc5cc8e9fb7a4dd2dc9cbb75b7c8;hb=be6d4f74c77c6f521afc873d226480e001cb99c2;hp=4bb49ed2ef64928d8ba2bc1d48c4b76483fd30b4;hpb=04180708eff91ddd3a9572bd4b517ccce5850db0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index 4bb49ed2ef..866e6cf6de 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for the HP PA-RISC architecture. - Copyright (C) 1986-2016 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. Contributed by the Center for Software Science at the University of Utah (pa-gdb-bugs@cs.utah.edu). @@ -205,13 +205,10 @@ hppa_symbol_address(const char *sym) static struct hppa_objfile_private * hppa_init_objfile_priv_data (struct objfile *objfile) { - struct hppa_objfile_private *priv; + hppa_objfile_private *priv + = OBSTACK_ZALLOC (&objfile->objfile_obstack, hppa_objfile_private); - priv = (struct hppa_objfile_private *) - obstack_alloc (&objfile->objfile_obstack, - sizeof (struct hppa_objfile_private)); set_objfile_data (objfile, hppa_objfile_priv_data, priv); - memset (priv, 0, sizeof (*priv)); return priv; } @@ -486,7 +483,6 @@ struct unwind_table_entry * find_unwind_entry (CORE_ADDR pc) { int first, middle, last; - struct objfile *objfile; struct hppa_objfile_private *priv; if (hppa_debug) @@ -501,61 +497,61 @@ find_unwind_entry (CORE_ADDR pc) return NULL; } - ALL_OBJFILES (objfile) - { - struct hppa_unwind_info *ui; - ui = NULL; - priv = ((struct hppa_objfile_private *) - objfile_data (objfile, hppa_objfile_priv_data)); - if (priv) - ui = ((struct hppa_objfile_private *) priv)->unwind_info; - - if (!ui) - { - read_unwind_info (objfile); - priv = ((struct hppa_objfile_private *) - objfile_data (objfile, hppa_objfile_priv_data)); - if (priv == NULL) - error (_("Internal error reading unwind information.")); - ui = ((struct hppa_objfile_private *) priv)->unwind_info; - } + for (objfile *objfile : current_program_space->objfiles ()) + { + struct hppa_unwind_info *ui; + ui = NULL; + priv = ((struct hppa_objfile_private *) + objfile_data (objfile, hppa_objfile_priv_data)); + if (priv) + ui = ((struct hppa_objfile_private *) priv)->unwind_info; + + if (!ui) + { + read_unwind_info (objfile); + priv = ((struct hppa_objfile_private *) + objfile_data (objfile, hppa_objfile_priv_data)); + if (priv == NULL) + error (_("Internal error reading unwind information.")); + ui = ((struct hppa_objfile_private *) priv)->unwind_info; + } - /* First, check the cache. */ + /* First, check the cache. */ - if (ui->cache - && pc >= ui->cache->region_start - && pc <= ui->cache->region_end) - { - if (hppa_debug) - fprintf_unfiltered (gdb_stdlog, "%s (cached) }\n", - hex_string ((uintptr_t) ui->cache)); - return ui->cache; - } + if (ui->cache + && pc >= ui->cache->region_start + && pc <= ui->cache->region_end) + { + if (hppa_debug) + fprintf_unfiltered (gdb_stdlog, "%s (cached) }\n", + hex_string ((uintptr_t) ui->cache)); + return ui->cache; + } - /* Not in the cache, do a binary search. */ + /* Not in the cache, do a binary search. */ - first = 0; - last = ui->last; + first = 0; + last = ui->last; - while (first <= last) - { - middle = (first + last) / 2; - if (pc >= ui->table[middle].region_start - && pc <= ui->table[middle].region_end) - { - ui->cache = &ui->table[middle]; - if (hppa_debug) - fprintf_unfiltered (gdb_stdlog, "%s }\n", - hex_string ((uintptr_t) ui->cache)); - return &ui->table[middle]; - } + while (first <= last) + { + middle = (first + last) / 2; + if (pc >= ui->table[middle].region_start + && pc <= ui->table[middle].region_end) + { + ui->cache = &ui->table[middle]; + if (hppa_debug) + fprintf_unfiltered (gdb_stdlog, "%s }\n", + hex_string ((uintptr_t) ui->cache)); + return &ui->table[middle]; + } - if (pc < ui->table[middle].region_start) - last = middle - 1; - else - first = middle + 1; - } - } /* ALL_OBJFILES() */ + if (pc < ui->table[middle].region_start) + last = middle - 1; + else + first = middle + 1; + } + } if (hppa_debug) fprintf_unfiltered (gdb_stdlog, "NULL (not found) }\n"); @@ -613,7 +609,7 @@ typedef BP_MANIPULATION (hppa_break_insn) hppa_breakpoint; static const char * hppa32_register_name (struct gdbarch *gdbarch, int i) { - static char *names[] = { + static const char *names[] = { "flags", "r1", "rp", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", @@ -656,7 +652,7 @@ hppa32_register_name (struct gdbarch *gdbarch, int i) static const char * hppa64_register_name (struct gdbarch *gdbarch, int i) { - static char *names[] = { + static const char *names[] = { "flags", "r1", "rp", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", @@ -717,7 +713,8 @@ static CORE_ADDR hppa32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, - int struct_return, CORE_ADDR struct_addr) + function_call_return_method return_method, + CORE_ADDR struct_addr) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -823,17 +820,15 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int fpLreg = 72 + (param_ptr - 36) / 4 * 2; int fpreg = 74 + (param_ptr - 32) / 8 * 4; - regcache_cooked_write (regcache, grreg, param_val); - regcache_cooked_write (regcache, fpLreg, param_val); + regcache->cooked_write (grreg, param_val); + regcache->cooked_write (fpLreg, param_val); if (param_len > 4) { - regcache_cooked_write (regcache, grreg + 1, - param_val + 4); + regcache->cooked_write (grreg + 1, param_val + 4); - regcache_cooked_write (regcache, fpreg, param_val); - regcache_cooked_write (regcache, fpreg + 1, - param_val + 4); + regcache->cooked_write (fpreg, param_val); + regcache->cooked_write (fpreg + 1, param_val + 4); } } } @@ -854,7 +849,7 @@ hppa32_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* If a structure has to be returned, set up register 28 to hold its address. */ - if (struct_return) + if (return_method == return_method_struct) regcache_cooked_write_unsigned (regcache, 28, struct_addr); gp = tdep->find_global_pointer (gdbarch, function); @@ -895,6 +890,7 @@ hppa64_integral_or_pointer_p (const struct type *type) } case TYPE_CODE_PTR: case TYPE_CODE_REF: + case TYPE_CODE_RVALUE_REF: return (TYPE_LENGTH (type) == 8); default: break; @@ -973,7 +969,8 @@ static CORE_ADDR hppa64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, - int struct_return, CORE_ADDR struct_addr) + function_call_return_method return_method, + CORE_ADDR struct_addr) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); @@ -1048,8 +1045,8 @@ hppa64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, passed in floating-point registers, are passed in the right halves of the floating point registers; the left halves are unused." */ - regcache_cooked_write_part (regcache, regnum, offset % 8, - len, value_contents (arg)); + regcache->cooked_write_part (regnum, offset % 8, len, + value_contents (arg)); } } } @@ -1090,8 +1087,8 @@ hppa64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, regnum = HPPA_ARG0_REGNUM - offset / 8; while (regnum > HPPA_ARG0_REGNUM - 8 && len > 0) { - regcache_cooked_write_part (regcache, regnum, - offset % 8, std::min (len, 8), valbuf); + regcache->cooked_write_part (regnum, offset % 8, std::min (len, 8), + valbuf); offset += std::min (len, 8); valbuf += std::min (len, 8); len -= std::min (len, 8); @@ -1117,7 +1114,7 @@ hppa64_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* If a structure has to be returned, set up GR 28 (%ret0) to hold its address. */ - if (struct_return) + if (return_method == return_method_struct) regcache_cooked_write_unsigned (regcache, HPPA_RET0_REGNUM, struct_addr); /* Set up GR27 (%dp) to hold the global pointer (gp). */ @@ -1156,20 +1153,18 @@ hppa32_return_value (struct gdbarch *gdbarch, struct value *function, if (part > 0) { if (readbuf != NULL) - regcache_cooked_read_part (regcache, reg, 4 - part, - part, readbuf); + regcache->cooked_read_part (reg, 4 - part, part, readbuf); if (writebuf != NULL) - regcache_cooked_write_part (regcache, reg, 4 - part, - part, writebuf); + regcache->cooked_write_part (reg, 4 - part, part, writebuf); reg++; } /* Now transfer the remaining register values. */ for (b = part; b < TYPE_LENGTH (type); b += 4) { if (readbuf != NULL) - regcache_cooked_read (regcache, reg, readbuf + b); + regcache->cooked_read (reg, readbuf + b); if (writebuf != NULL) - regcache_cooked_write (regcache, reg, writebuf + b); + regcache->cooked_write (reg, writebuf + b); reg++; } return RETURN_VALUE_REGISTER_CONVENTION; @@ -1247,8 +1242,8 @@ hppa64_return_value (struct gdbarch *gdbarch, struct value *function, { while (len > 0) { - regcache_cooked_read_part (regcache, regnum, offset, - std::min (len, 8), readbuf); + regcache->cooked_read_part (regnum, offset, std::min (len, 8), + readbuf); readbuf += std::min (len, 8); len -= std::min (len, 8); regnum++; @@ -1259,8 +1254,8 @@ hppa64_return_value (struct gdbarch *gdbarch, struct value *function, { while (len > 0) { - regcache_cooked_write_part (regcache, regnum, offset, - std::min (len, 8), writebuf); + regcache->cooked_write_part (regnum, offset, std::min (len, 8), + writebuf); writebuf += std::min (len, 8); len -= std::min (len, 8); regnum++; @@ -1303,13 +1298,13 @@ hppa64_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) } CORE_ADDR -hppa_read_pc (struct regcache *regcache) +hppa_read_pc (readable_regcache *regcache) { ULONGEST ipsw; ULONGEST pc; - regcache_cooked_read_unsigned (regcache, HPPA_IPSW_REGNUM, &ipsw); - regcache_cooked_read_unsigned (regcache, HPPA_PCOQ_HEAD_REGNUM, &pc); + regcache->cooked_read (HPPA_IPSW_REGNUM, &ipsw); + regcache->cooked_read (HPPA_PCOQ_HEAD_REGNUM, &pc); /* If the current instruction is nullified, then we are effectively still executing the previous instruction. Pretend we are still @@ -2441,9 +2436,7 @@ static struct hppa_stub_unwind_cache * hppa_stub_frame_unwind_cache (struct frame_info *this_frame, void **this_cache) { - struct gdbarch *gdbarch = get_frame_arch (this_frame); struct hppa_stub_unwind_cache *info; - struct unwind_table_entry *u; if (*this_cache) return (struct hppa_stub_unwind_cache *) *this_cache; @@ -2454,21 +2447,6 @@ hppa_stub_frame_unwind_cache (struct frame_info *this_frame, info->base = get_frame_register_unsigned (this_frame, HPPA_SP_REGNUM); - if (gdbarch_osabi (gdbarch) == GDB_OSABI_HPUX_SOM) - { - /* HPUX uses export stubs in function calls; the export stub clobbers - the return value of the caller, and, later restores it from the - stack. */ - u = find_unwind_entry (get_frame_pc (this_frame)); - - if (u && u->stub_unwind.stub_type == EXPORT) - { - info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr = info->base - 24; - - return info; - } - } - /* By default we assume that stubs do not change the rp. */ info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].realreg = HPPA_RP_REGNUM; @@ -2562,31 +2540,32 @@ struct bound_minimal_symbol hppa_lookup_stub_minimal_symbol (const char *name, enum unwind_stub_types stub_type) { - struct objfile *objfile; - struct minimal_symbol *msym; struct bound_minimal_symbol result = { NULL, NULL }; - ALL_MSYMBOLS (objfile, msym) + for (objfile *objfile : current_program_space->objfiles ()) { - if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0) - { - struct unwind_table_entry *u; - - u = find_unwind_entry (MSYMBOL_VALUE (msym)); - if (u != NULL && u->stub_unwind.stub_type == stub_type) + for (minimal_symbol *msym : objfile->msymbols ()) + { + if (strcmp (MSYMBOL_LINKAGE_NAME (msym), name) == 0) { - result.objfile = objfile; - result.minsym = msym; - return result; + struct unwind_table_entry *u; + + u = find_unwind_entry (MSYMBOL_VALUE (msym)); + if (u != NULL && u->stub_unwind.stub_type == stub_type) + { + result.objfile = objfile; + result.minsym = msym; + return result; + } } - } + } } return result; } static void -unwind_command (char *exp, int from_tty) +unwind_command (const char *exp, int from_tty) { CORE_ADDR address; struct unwind_table_entry *u; @@ -2761,14 +2740,14 @@ hppa_fetch_pointer_argument (struct frame_info *frame, int argi, } static enum register_status -hppa_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, +hppa_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, int regnum, gdb_byte *buf) { enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); ULONGEST tmp; enum register_status status; - status = regcache_raw_read_unsigned (regcache, regnum, &tmp); + status = regcache->raw_read (regnum, &tmp); if (status == REG_VALID) { if (regnum == HPPA_PCOQ_HEAD_REGNUM || regnum == HPPA_PCOQ_TAIL_REGNUM) @@ -3062,14 +3041,6 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { struct gdbarch_tdep *tdep; struct gdbarch *gdbarch; - - /* Try to determine the ABI of the object we are loading. */ - if (info.abfd != NULL && info.osabi == GDB_OSABI_UNKNOWN) - { - /* If it's a SOM file, assume it's HP/UX SOM. */ - if (bfd_get_flavour (info.abfd) == bfd_target_som_flavour) - info.osabi = GDB_OSABI_HPUX_SOM; - } /* find a candidate among the list of pre-declared architectures. */ arches = gdbarch_list_lookup_by_info (arches, &info); @@ -3144,8 +3115,6 @@ hppa_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Helper for function argument information. */ set_gdbarch_fetch_pointer_argument (gdbarch, hppa_fetch_pointer_argument); - set_gdbarch_print_insn (gdbarch, print_insn_hppa); - /* When a hardware watchpoint triggers, we'll move the inferior past it by removing all eventpoints; stepping past the instruction that caused the trigger; reinserting eventpoints; and checking @@ -3211,9 +3180,6 @@ hppa_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (file, "elf = %s\n", tdep->is_elf ? "yes" : "no"); } -/* Provide a prototype to silence -Wmissing-prototypes. */ -extern initialize_file_ftype _initialize_hppa_tdep; - void _initialize_hppa_tdep (void) {