[2/2] gdb, gdbarch, infcall: Add reserve_stack_space method to gdbarch

Message ID 20230322171352.9087-3-mohamed.bouhaouel@intel.com
State New
Headers
Series Add more flexibility to inferior call |

Commit Message

Bouhaouel, Mohamed March 22, 2023, 5:13 p.m. UTC
  Change the 'reserve_stack_space' function from a static common method to a
target-dependent method.

Signed-off-by: Mohamed Bouhaouel <mohamed.bouhaouel@intel.com>
---
 gdb/gdbarch-gen.h         |  6 ++++++
 gdb/gdbarch.c             | 22 ++++++++++++++++++++++
 gdb/gdbarch_components.py | 10 ++++++++++
 gdb/infcall.c             | 16 ++++++----------
 gdb/infcall.h             |  9 +++++++++
 5 files changed, 53 insertions(+), 10 deletions(-)
  

Patch

diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h
index a9b0fe26837..ca3e074de8f 100644
--- a/gdb/gdbarch-gen.h
+++ b/gdb/gdbarch-gen.h
@@ -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);
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c
index a411e5bbac7..25fdfc6b4c2 100644
--- a/gdb/gdbarch.c
+++ b/gdb/gdbarch.c
@@ -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;
+}
diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py
index 10e8c2d52c8..800054a34b4 100644
--- a/gdb/gdbarch_components.py
+++ b/gdb/gdbarch_components.py
@@ -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,
+)
diff --git a/gdb/infcall.c b/gdb/infcall.c
index b945adebc93..8ef05bec3e0 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -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)
diff --git a/gdb/infcall.h b/gdb/infcall.h
index af3dd49220a..807d86d3989 100644
--- a/gdb/infcall.h
+++ b/gdb/infcall.h
@@ -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