This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH] Move catch syscall to inferior-data.
- From: Yao Qi <yao at codesourcery dot com>
- To: <gdb-patches at sourceware dot org>
- Date: Mon, 12 Mar 2012 20:17:57 +0800
- Subject: [PATCH] Move catch syscall to inferior-data.
Hi,
when I am using DEF_VEC_I(int)/VEC(int) in my c code, which will be
compiled with GDB and GDBserver, DEF_VEC_I(int) in breakpoint.h makes
some troubles to me, because my c code has to include breakpoint.h
indirectly when compiled for GDB, and my code either gets an error
that VEC_int is undefined or redefined (vec.c has been moved to common/
in my local tree).
After trying some different methods, I realize that it is not a good
way to put "DEF_VEC_I(foo)" in header file. Fortunately, VEC is only
used in `struct inferior' for syscall catchpoint, so we can put these
bits to `inferior-data' which is only visible inside breakpoint.c.
Then `DEF_VEC_I(int)' can be removed from `breakpoint.h', and my problem
above get fixed.
On the other hand, moving syscall catch related code out of `struct
inferior' is more clear. Regression tested on x86_64-linux.
Note that, with this patch applied, `inferior.h' doesn't have to
include `breakpoint.h'. This can be addressed by a follow-up patch.
gdb:
2012-03-12 Yao Qi <yao@codesourcery.com>
* inferior.h (struct inferior): Remove fields any_syscall_count,
syscalls_counts and total_syscalls_count. Move them to new
struct catch_syscall_inferior_data in breakpoint.c.
* breakpoint.c: Call DEF_VEC_I(int).
(struct catch_syscall_inferior_data): New.
(get_catch_syscall_inferior_data): New.
(catch_syscall_inferior_data_cleanup): New.
(insert_catch_syscall): Update to access data in
struct catch_syscall_inferior_data.
(insert_catch_syscall): Likewise.
(remove_catch_syscall): Likewise.
(remove_catch_syscall): Likewise.
(is_syscall_catchpoint_enabled): Likewise.
(add_catch_command): Likewise.
(_initialize_breakpoint): Register cleanup.
* breakpoint.h: Removed DEF_VEC_I(int).
* dwarf2loc.c: Call DEF_VEC_I(int).
* mi/mi-main.c: Likewise.
---
gdb/breakpoint.c | 112 +++++++++++++++++++++++++++++++++++++++++-------------
gdb/breakpoint.h | 3 -
gdb/dwarf2loc.c | 2 +
gdb/inferior.h | 14 -------
gdb/mi/mi-main.c | 2 +
5 files changed, 89 insertions(+), 44 deletions(-)
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 9e64700..261dec5 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -7458,6 +7458,8 @@ catch_unload_command_1 (char *arg, int from_tty,
catch_load_or_unload (arg, from_tty, 0, command);
}
+DEF_VEC_I(int);
+
/* An instance of this type is used to represent a syscall catchpoint.
It includes a "struct breakpoint" as a kind of base class; users
downcast to "struct breakpoint *" when needed. A breakpoint is
@@ -7489,6 +7491,47 @@ dtor_catch_syscall (struct breakpoint *b)
base_breakpoint_ops.dtor (b);
}
+static const struct inferior_data *catch_syscall_inferior_data = NULL;
+
+struct catch_syscall_inferior_data
+{
+ /* We keep a count of the number of times the user has requested a
+ particular syscall to be tracked, and pass this information to the
+ target. This lets capable targets implement filtering directly. */
+
+ /* Number of times that "any" syscall is requested. */
+ int any_syscall_count;
+
+ /* Count of each system call. */
+ VEC(int) *syscalls_counts;
+
+ /* This counts all syscall catch requests, so we can readily determine
+ if any catching is necessary. */
+ int total_syscalls_count;
+};
+
+static struct catch_syscall_inferior_data*
+get_catch_syscall_inferior_data (struct inferior *inf)
+{
+ struct catch_syscall_inferior_data *inf_data;
+
+ inf_data = inferior_data (inf, catch_syscall_inferior_data);
+ if (inf_data == NULL)
+ {
+ inf_data = XZALLOC (struct catch_syscall_inferior_data);
+ set_inferior_data (inf, catch_syscall_inferior_data, inf_data);
+ }
+
+ return inf_data;
+}
+
+static void
+catch_syscall_inferior_data_cleanup (struct inferior *inf, void *arg)
+{
+ xfree (arg);
+}
+
+
/* Implement the "insert" breakpoint_ops method for syscall
catchpoints. */
@@ -7497,10 +7540,12 @@ insert_catch_syscall (struct bp_location *bl)
{
struct syscall_catchpoint *c = (struct syscall_catchpoint *) bl->owner;
struct inferior *inf = current_inferior ();
+ struct catch_syscall_inferior_data *inf_data
+ = get_catch_syscall_inferior_data (inf);
- ++inf->total_syscalls_count;
+ ++inf_data->total_syscalls_count;
if (!c->syscalls_to_be_caught)
- ++inf->any_syscall_count;
+ ++inf_data->any_syscall_count;
else
{
int i, iter;
@@ -7511,28 +7556,31 @@ insert_catch_syscall (struct bp_location *bl)
{
int elem;
- if (iter >= VEC_length (int, inf->syscalls_counts))
+ if (iter >= VEC_length (int, inf_data->syscalls_counts))
{
- int old_size = VEC_length (int, inf->syscalls_counts);
+ int old_size = VEC_length (int, inf_data->syscalls_counts);
uintptr_t vec_addr_offset
= old_size * ((uintptr_t) sizeof (int));
uintptr_t vec_addr;
- VEC_safe_grow (int, inf->syscalls_counts, iter + 1);
- vec_addr = (uintptr_t) VEC_address (int, inf->syscalls_counts) +
- vec_addr_offset;
+ VEC_safe_grow (int, inf_data->syscalls_counts, iter + 1);
+ vec_addr = ((uintptr_t) VEC_address (int,
+ inf_data->syscalls_counts)
+ + vec_addr_offset);
memset ((void *) vec_addr, 0,
(iter + 1 - old_size) * sizeof (int));
}
- elem = VEC_index (int, inf->syscalls_counts, iter);
- VEC_replace (int, inf->syscalls_counts, iter, ++elem);
+ elem = VEC_index (int, inf_data->syscalls_counts, iter);
+ VEC_replace (int, inf_data->syscalls_counts, iter, ++elem);
}
}
return target_set_syscall_catchpoint (PIDGET (inferior_ptid),
- inf->total_syscalls_count != 0,
- inf->any_syscall_count,
- VEC_length (int, inf->syscalls_counts),
- VEC_address (int, inf->syscalls_counts));
+ inf_data->total_syscalls_count != 0,
+ inf_data->any_syscall_count,
+ VEC_length (int,
+ inf_data->syscalls_counts),
+ VEC_address (int,
+ inf_data->syscalls_counts));
}
/* Implement the "remove" breakpoint_ops method for syscall
@@ -7543,10 +7591,12 @@ remove_catch_syscall (struct bp_location *bl)
{
struct syscall_catchpoint *c = (struct syscall_catchpoint *) bl->owner;
struct inferior *inf = current_inferior ();
+ struct catch_syscall_inferior_data *inf_data
+ = get_catch_syscall_inferior_data (inf);
- --inf->total_syscalls_count;
+ --inf_data->total_syscalls_count;
if (!c->syscalls_to_be_caught)
- --inf->any_syscall_count;
+ --inf_data->any_syscall_count;
else
{
int i, iter;
@@ -7556,20 +7606,21 @@ remove_catch_syscall (struct bp_location *bl)
i++)
{
int elem;
- if (iter >= VEC_length (int, inf->syscalls_counts))
+ if (iter >= VEC_length (int, inf_data->syscalls_counts))
/* Shouldn't happen. */
continue;
- elem = VEC_index (int, inf->syscalls_counts, iter);
- VEC_replace (int, inf->syscalls_counts, iter, --elem);
+ elem = VEC_index (int, inf_data->syscalls_counts, iter);
+ VEC_replace (int, inf_data->syscalls_counts, iter, --elem);
}
}
return target_set_syscall_catchpoint (PIDGET (inferior_ptid),
- inf->total_syscalls_count != 0,
- inf->any_syscall_count,
- VEC_length (int, inf->syscalls_counts),
+ inf_data->total_syscalls_count != 0,
+ inf_data->any_syscall_count,
+ VEC_length (int,
+ inf_data->syscalls_counts),
VEC_address (int,
- inf->syscalls_counts));
+ inf_data->syscalls_counts));
}
/* Implement the "breakpoint_hit" breakpoint_ops method for syscall
@@ -14395,9 +14446,10 @@ is_syscall_catchpoint_enabled (struct breakpoint *bp)
int
catch_syscall_enabled (void)
{
- struct inferior *inf = current_inferior ();
+ struct catch_syscall_inferior_data *inf_data
+ = get_catch_syscall_inferior_data (current_inferior ());
- return inf->total_syscalls_count != 0;
+ return inf_data->total_syscalls_count != 0;
}
int
@@ -15062,9 +15114,12 @@ add_catch_command (char *name, char *docstring,
static void
clear_syscall_counts (struct inferior *inf)
{
- inf->total_syscalls_count = 0;
- inf->any_syscall_count = 0;
- VEC_free (int, inf->syscalls_counts);
+ struct catch_syscall_inferior_data *inf_data
+ = get_catch_syscall_inferior_data (inf);
+
+ inf_data->total_syscalls_count = 0;
+ inf_data->any_syscall_count = 0;
+ VEC_free (int, inf_data->syscalls_counts);
}
static void
@@ -15317,6 +15372,9 @@ _initialize_breakpoint (void)
breakpoint_objfile_key = register_objfile_data ();
+ catch_syscall_inferior_data
+ = register_inferior_data_with_cleanup (catch_syscall_inferior_data_cleanup);
+
breakpoint_chain = 0;
/* Don't bother to call set_breakpoint_count. $bpnum isn't useful
before a breakpoint is set. */
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index aef222c..0d5a8d2 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -584,9 +584,6 @@ enum watchpoint_triggered
watch_triggered_yes
};
-/* This is used to declare the VEC syscalls_to_be_caught. */
-DEF_VEC_I(int);
-
typedef struct bp_location *bp_location_p;
DEF_VEC_P(bp_location_p);
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index ebd3452..8f10681 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -42,6 +42,8 @@
#include "gdb_string.h"
#include "gdb_assert.h"
+DEF_VEC_I(int);
+
extern int dwarf2_always_disassemble;
static void dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc,
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 19ad1ac..a09e6fd 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -509,20 +509,6 @@ struct inferior
int has_exit_code;
LONGEST exit_code;
- /* We keep a count of the number of times the user has requested a
- particular syscall to be tracked, and pass this information to the
- target. This lets capable targets implement filtering directly. */
-
- /* Number of times that "any" syscall is requested. */
- int any_syscall_count;
-
- /* Count of each system call. */
- VEC(int) *syscalls_counts;
-
- /* This counts all syscall catch requests, so we can readily determine
- if any catching is necessary. */
- int total_syscalls_count;
-
/* Default flags to pass to the symbol reading functions. These are
used whenever a new objfile is created. The valid values come
from enum symfile_add_flags. */
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index a03e230..787d247 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -508,6 +508,8 @@ mi_cmd_thread_info (char *command, char **argv, int argc)
print_thread_info (current_uiout, argv[0], -1);
}
+DEF_VEC_I(int);
+
struct collect_cores_data
{
int pid;
--
1.7.0.4