forked from Imagelibrary/binutils-gdb
Enable chained function calls in C++ expressions.
gdb/ChangeLog: * eval.c: Include gdbthread.h. (evaluate_subexp): Enable thread stack temporaries before evaluating a complete expression and clean them up after the evaluation is complete. * gdbthread.h: Include common/vec.h. (value_ptr): New typedef. (VEC (value_ptr)): New vector type. (value_vec): New typedef. (struct thread_info): Add new fields stack_temporaries_enabled and stack_temporaries. (enable_thread_stack_temporaries) (thread_stack_temporaries_enabled_p, push_thread_stack_temporary) (get_last_thread_stack_temporary) (value_in_thread_stack_temporaries): Declare. * gdbtypes.c (class_or_union_p): New function. * gdbtypes.h (class_or_union_p): Declare. * infcall.c (call_function_by_hand): Store return values of class type as temporaries on stack. * thread.c (enable_thread_stack_temporaries): New function. (thread_stack_temporaries_enabled_p, push_thread_stack_temporary) (get_last_thread_stack_temporary): Likewise. (value_in_thread_stack_temporaries): Likewise. * value.c (value_force_lval): New function. * value.h (value_force_lval): Declare. gdb/testsuite/ChangeLog: * gdb.cp/chained-calls.cc: New file. * gdb.cp/chained-calls.exp: New file. * gdb.cp/smartp.exp: Remove KFAIL for "p c2->inta".
This commit is contained in:
@@ -28,6 +28,7 @@ struct symtab;
|
||||
#include "ui-out.h"
|
||||
#include "inferior.h"
|
||||
#include "btrace.h"
|
||||
#include "common/vec.h"
|
||||
|
||||
/* Frontend view of the thread state. Possible extensions: stepping,
|
||||
finishing, until(ling),... */
|
||||
@@ -152,6 +153,10 @@ struct thread_suspend_state
|
||||
enum gdb_signal stop_signal;
|
||||
};
|
||||
|
||||
typedef struct value *value_ptr;
|
||||
DEF_VEC_P (value_ptr);
|
||||
typedef VEC (value_ptr) value_vec;
|
||||
|
||||
struct thread_info
|
||||
{
|
||||
struct thread_info *next;
|
||||
@@ -264,6 +269,14 @@ struct thread_info
|
||||
|
||||
/* Branch trace information for this thread. */
|
||||
struct btrace_thread_info btrace;
|
||||
|
||||
/* Flag which indicates that the stack temporaries should be stored while
|
||||
evaluating expressions. */
|
||||
int stack_temporaries_enabled;
|
||||
|
||||
/* Values that are stored as temporaries on stack while evaluating
|
||||
expressions. */
|
||||
value_vec *stack_temporaries;
|
||||
};
|
||||
|
||||
/* Create an empty thread list, or empty the existing one. */
|
||||
@@ -465,6 +478,16 @@ extern void prune_threads (void);
|
||||
|
||||
int pc_in_thread_step_range (CORE_ADDR pc, struct thread_info *thread);
|
||||
|
||||
extern struct cleanup *enable_thread_stack_temporaries (ptid_t ptid);
|
||||
|
||||
extern int thread_stack_temporaries_enabled_p (ptid_t ptid);
|
||||
|
||||
extern void push_thread_stack_temporary (ptid_t ptid, struct value *v);
|
||||
|
||||
extern struct value *get_last_thread_stack_temporary (ptid_t);
|
||||
|
||||
extern int value_in_thread_stack_temporaries (struct value *, ptid_t);
|
||||
|
||||
extern struct thread_info *thread_list;
|
||||
|
||||
#endif /* GDBTHREAD_H */
|
||||
|
||||
Reference in New Issue
Block a user