@@ -1687,3 +1687,9 @@ extern void set_gdbarch_get_pc_address_flags (struct gdbarch *gdbarch, gdbarch_g
typedef void (gdbarch_read_core_file_mappings_ftype) (struct gdbarch *gdbarch, struct bfd *cbfd, read_core_file_mappings_pre_loop_ftype pre_loop_cb, read_core_file_mappings_loop_ftype loop_cb);
extern void gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, struct bfd *cbfd, read_core_file_mappings_pre_loop_ftype pre_loop_cb, read_core_file_mappings_loop_ftype loop_cb);
extern void set_gdbarch_read_core_file_mappings (struct gdbarch *gdbarch, gdbarch_read_core_file_mappings_ftype *read_core_file_mappings);
+
+/* Reserve space on the stack for a value of the given type. */
+
+typedef CORE_ADDR (gdbarch_reserve_stack_space_ftype) (struct gdbarch *gdbarch, const type *valtype, CORE_ADDR &sp);
+extern CORE_ADDR gdbarch_reserve_stack_space (struct gdbarch *gdbarch, const type *valtype, CORE_ADDR &sp);
+extern void set_gdbarch_reserve_stack_space (struct gdbarch *gdbarch, gdbarch_reserve_stack_space_ftype *reserve_stack_space);
@@ -254,6 +254,7 @@ struct gdbarch
gdbarch_type_align_ftype *type_align = default_type_align;
gdbarch_get_pc_address_flags_ftype *get_pc_address_flags = default_get_pc_address_flags;
gdbarch_read_core_file_mappings_ftype *read_core_file_mappings = default_read_core_file_mappings;
+ gdbarch_reserve_stack_space_ftype *reserve_stack_space = default_reserve_stack_space;
};
/* Create a new ``struct gdbarch'' based on information provided by
@@ -518,6 +519,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
/* Skip verify of type_align, invalid_p == 0 */
/* Skip verify of get_pc_address_flags, invalid_p == 0 */
/* Skip verify of read_core_file_mappings, invalid_p == 0 */
+ /* Skip verify of reserve_stack_space, invalid_p == 0 */
if (!log.empty ())
internal_error (_("verify_gdbarch: the following are invalid ...%s"),
log.c_str ());
@@ -1362,6 +1364,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
gdb_printf (file,
"gdbarch_dump: read_core_file_mappings = <%s>\n",
host_address_to_string (gdbarch->read_core_file_mappings));
+ gdb_printf (file,
+ "gdbarch_dump: reserve_stack_space = <%s>\n",
+ host_address_to_string (gdbarch->reserve_stack_space));
if (gdbarch->dump_tdep != NULL)
gdbarch->dump_tdep (gdbarch, file);
}
@@ -5365,3 +5370,20 @@ set_gdbarch_read_core_file_mappings (struct gdbarch *gdbarch,
{
gdbarch->read_core_file_mappings = read_core_file_mappings;
}
+
+CORE_ADDR
+gdbarch_reserve_stack_space (struct gdbarch *gdbarch, const type *valtype, CORE_ADDR &sp)
+{
+ gdb_assert (gdbarch != NULL);
+ gdb_assert (gdbarch->reserve_stack_space != NULL);
+ if (gdbarch_debug >= 2)
+ gdb_printf (gdb_stdlog, "gdbarch_reserve_stack_space called\n");
+ return gdbarch->reserve_stack_space (gdbarch, valtype, sp);
+}
+
+void
+set_gdbarch_reserve_stack_space (struct gdbarch *gdbarch,
+ gdbarch_reserve_stack_space_ftype reserve_stack_space)
+{
+ gdbarch->reserve_stack_space = reserve_stack_space;
+}
@@ -2683,3 +2683,13 @@ Read core file mappings
predefault="default_read_core_file_mappings",
invalid=False,
)
+
+Method(
+ comment="Reserve space on the stack for a value of the given type.",
+ type="CORE_ADDR",
+ name="reserve_stack_space",
+ params=[("const type *", "valtype"), ("CORE_ADDR &", "sp")],
+ predefault="default_reserve_stack_space",
+ predicate=False,
+ invalid=False,
+)
@@ -702,16 +702,12 @@ run_inferior_call (std::unique_ptr<call_thread_fsm> sm,
return caught_error;
}
-/* Reserve space on the stack for a value of the given type.
- Return the address of the allocated space.
- Make certain that the value is correctly aligned.
- The SP argument is modified. */
+/* See infcall.h. */
-static CORE_ADDR
-reserve_stack_space (const type *values_type, CORE_ADDR &sp)
+CORE_ADDR
+default_reserve_stack_space (gdbarch *gdbarch, const type *values_type,
+ CORE_ADDR &sp)
{
- frame_info_ptr frame = get_current_frame ();
- struct gdbarch *gdbarch = get_frame_arch (frame);
CORE_ADDR addr = 0;
if (gdbarch_inner_than (gdbarch, 1, 2))
@@ -1116,7 +1112,7 @@ call_function_by_hand_dummy (struct value *function,
/* Make a copy of the argument on the stack. If the argument is
trivially copy ctor'able, copy bit by bit. Otherwise, call
the copy ctor to initialize the clone. */
- CORE_ADDR addr = reserve_stack_space (param_type, sp);
+ CORE_ADDR addr = gdbarch_reserve_stack_space (gdbarch, param_type, sp);
value *clone
= value_from_contents_and_address (param_type, nullptr, addr);
push_thread_stack_temporary (call_thread.get (), clone);
@@ -1201,7 +1197,7 @@ call_function_by_hand_dummy (struct value *function,
if (return_method != return_method_normal
|| (stack_temporaries && class_or_union_p (values_type)))
- struct_addr = reserve_stack_space (values_type, sp);
+ struct_addr = gdbarch_reserve_stack_space (gdbarch, values_type, sp);
std::vector<struct value *> new_args;
if (return_method == return_method_hidden_param)
@@ -79,4 +79,13 @@ extern void error_call_unknown_return_type (const char *func_name);
extern value *default_value_arg_coerce (gdbarch *gdbarch, value *arg,
type *param_type, int is_prototyped);
+
+/* Reserve space on the stack for a value of the given type.
+ Return the address of the allocated space.
+ Make certain that the value is correctly aligned.
+ The SP argument is modified. */
+
+extern CORE_ADDR default_reserve_stack_space (gdbarch *gdbarch,
+ const type *values_type,
+ CORE_ADDR &sp);
#endif