[v2,08/14] introduce call_function_by_hand_dummy

Message ID 1403279874-23781-9-git-send-email-tromey@redhat.com
State New, archived

Commit Message

Tom Tromey June 20, 2014, 3:57 p.m. UTC
  From: Jan Kratochvil <jan.kratochvil@redhat.com>

This provides a variant of call_function_by_hand that allows the dummy
frame destructor to be set.  This is used by the compiler code to
manage some resources when calling the gdb-generated inferior

2014-06-20  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* infcall.h (call_function_by_hand_dummy): Declare.
	* infcall.c (call_function_by_hand): Use
	(call_function_by_hand_dummy): Rename from call_function_by_hand.
	Add arguments.  Register a destructor.
 gdb/ChangeLog |  8 ++++++++
 gdb/infcall.c | 15 ++++++++++++++-
 gdb/infcall.h | 11 +++++++++++
 3 files changed, 33 insertions(+), 1 deletion(-)


diff --git a/gdb/infcall.c b/gdb/infcall.c
index 685b8a4..7339f55 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -451,6 +451,14 @@  cleanup_delete_std_terminate_breakpoint (void *ignore)
   delete_std_terminate_breakpoint ();
+/* See infcall.h.  */
+struct value *
+call_function_by_hand (struct value *function, int nargs, struct value **args)
+  return call_function_by_hand_dummy (function, nargs, args, NULL, NULL);
 /* All this stuff with a dummy frame may seem unnecessarily complicated
    (why not just save registers in GDB?).  The purpose of pushing a dummy
    frame which looks just like a real frame is so that if you call a
@@ -470,7 +478,10 @@  cleanup_delete_std_terminate_breakpoint (void *ignore)
    ARGS is modified to contain coerced values.  */
 struct value *
-call_function_by_hand (struct value *function, int nargs, struct value **args)
+call_function_by_hand_dummy (struct value *function,
+			     int nargs, struct value **args,
+			     call_function_by_hand_dummy_dtor_ftype *dummy_dtor,
+			     void *dummy_dtor_data)
   CORE_ADDR sp;
   struct type *values_type, *target_values_type;
@@ -827,6 +838,8 @@  call_function_by_hand (struct value *function, int nargs, struct value **args)
      caller (and identify the dummy-frame) onto the dummy-frame
      stack.  */
   dummy_frame_push (caller_state, &dummy_id);
+  if (dummy_dtor != NULL)
+    register_dummy_frame_dtor (dummy_id, dummy_dtor, dummy_dtor_data);
   /* Discard both inf_status and caller_state cleanups.
      From this point on we explicitly restore the associated state
diff --git a/gdb/infcall.h b/gdb/infcall.h
index c6dcdc3..f895e33 100644
--- a/gdb/infcall.h
+++ b/gdb/infcall.h
@@ -38,4 +38,15 @@  extern CORE_ADDR find_function_addr (struct value *function,
 extern struct value *call_function_by_hand (struct value *function, int nargs,
 					    struct value **args);
+/* Similar to call_function_by_hand and additional call
+   register_dummy_frame_dtor with DUMMY_DTOR and DUMMY_DTOR_DATA for the
+   created inferior call dummy frame.  */
+typedef void (call_function_by_hand_dummy_dtor_ftype) (void *data);
+extern struct value *
+  call_function_by_hand_dummy (struct value *function, int nargs,
+			       struct value **args,
+			     call_function_by_hand_dummy_dtor_ftype *dummy_dtor,
+			       void *dummy_dtor_data);