extern CORE_ADDR gdbarch_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ);
extern void set_gdbarch_convert_from_func_ptr_addr (struct gdbarch *gdbarch, gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr);
+typedef CORE_ADDR (gdbarch_convert_from_addr_func_ptr_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ);
+extern CORE_ADDR gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ);
+extern void set_gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch, gdbarch_convert_from_addr_func_ptr_ftype *convert_from_addr_func_ptr);
+
/* On some machines there are bits in addresses which are not really
part of the address, but are used by the kernel, the hardware, etc.
for special purposes. gdbarch_addr_bits_remove takes out any such bits so
gdbarch_stabs_argument_has_addr_ftype *stabs_argument_has_addr = default_stabs_argument_has_addr;
int frame_red_zone_size = 0;
gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr = convert_from_func_ptr_addr_identity;
+ gdbarch_convert_from_addr_func_ptr_ftype *convert_from_addr_func_ptr = convert_from_addr_func_ptr_identity;
gdbarch_addr_bits_remove_ftype *addr_bits_remove = core_addr_identity;
int significant_addr_bit = 0;
gdbarch_memtag_to_string_ftype *memtag_to_string = default_memtag_to_string;
/* Skip verify of stabs_argument_has_addr, invalid_p == 0 */
/* Skip verify of frame_red_zone_size, invalid_p == 0 */
/* Skip verify of convert_from_func_ptr_addr, invalid_p == 0 */
+ /* Skip verify of convert_from_addr_func_ptr, invalid_p == 0 */
/* Skip verify of addr_bits_remove, invalid_p == 0 */
/* Skip verify of significant_addr_bit, invalid_p == 0 */
/* Skip verify of memtag_to_string, invalid_p == 0 */
gdb_printf (file,
"gdbarch_dump: convert_from_func_ptr_addr = <%s>\n",
host_address_to_string (gdbarch->convert_from_func_ptr_addr));
+ gdb_printf (file,
+ "gdbarch_dump: convert_from_addr_func_ptr = <%s>\n",
+ host_address_to_string (gdbarch->convert_from_addr_func_ptr));
gdb_printf (file,
"gdbarch_dump: addr_bits_remove = <%s>\n",
host_address_to_string (gdbarch->addr_bits_remove));
gdbarch->convert_from_func_ptr_addr = convert_from_func_ptr_addr;
}
+CORE_ADDR
+gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ)
+{
+ gdb_assert (gdbarch != NULL);
+ gdb_assert (gdbarch->convert_from_addr_func_ptr != NULL);
+ if (gdbarch_debug >= 2)
+ gdb_printf (gdb_stdlog, "gdbarch_convert_from_addr_func_ptr called\n");
+ return gdbarch->convert_from_addr_func_ptr (gdbarch, addr, targ);
+}
+
+void
+set_gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch,
+ gdbarch_convert_from_addr_func_ptr_ftype convert_from_addr_func_ptr)
+{
+ gdbarch->convert_from_addr_func_ptr = convert_from_addr_func_ptr;
+}
+
CORE_ADDR
gdbarch_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
{
value_coerce_function (struct value *arg1)
{
struct value *retval;
+ CORE_ADDR addr;
if (VALUE_LVAL (arg1) != lval_memory)
error (_("Attempt to take address of value not located in memory."));
+ addr = value_address (arg1);
+ addr = gdbarch_convert_from_addr_func_ptr (target_gdbarch,
+ addr,
+ ¤t_target);
+
retval = value_from_pointer (lookup_pointer_type (value_type (arg1)),
- value_address (arg1));
+ addr);
return retval;
}