introduce call_function_by_hand_dummy
authorJan Kratochvil <jan.kratochvil@redhat.com>
Wed, 14 May 2014 20:16:22 +0000 (14:16 -0600)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Fri, 12 Dec 2014 21:26:41 +0000 (22:26 +0100)
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
function.

gdb/ChangeLog
2014-12-12  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.
(call_function_by_hand_dummy): Rename from call_function_by_hand.
Add arguments.  Register a destructor.

gdb/ChangeLog
gdb/infcall.c
gdb/infcall.h

index 21a292f3a42568ad7ab93bf6bad22ff7fa53fd57..df939950353598fd04e9eb0ab577d90c95e6ab6b 100644 (file)
@@ -1,3 +1,11 @@
+2014-12-12  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.
+       (call_function_by_hand_dummy): Rename from call_function_by_hand.
+       Add arguments.  Register a destructor.
+
 2014-12-12  Tom Tromey  <tromey@redhat.com>
            Jan Kratochvil  <jan.kratochvil@redhat.com>
 
index 25a7af4ac937742ea0db72d04489129f16c8b894..b5a9ae190a4d01f1c1c5a1e4a0e481dcf4c1d4b3 100644 (file)
@@ -456,6 +456,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
@@ -475,7 +483,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;
@@ -874,6 +885,9 @@ 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, inferior_ptid);
+  if (dummy_dtor != NULL)
+    register_dummy_frame_dtor (dummy_id, inferior_ptid,
+                              dummy_dtor, dummy_dtor_data);
 
   /* Discard both inf_status and caller_state cleanups.
      From this point on we explicitly restore the associated state
index c6dcdc33436c20432dd0331b13de420b23e0f3b2..f895e335fff907a4a4edb50dd12a7cc876593bb2 100644 (file)
@@ -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);
+
 #endif