From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17352 invoked by alias); 12 Mar 2012 12:18:31 -0000 Received: (qmail 16927 invoked by uid 22791); 12 Mar 2012 12:18:26 -0000 X-SWARE-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_00,FROM_12LTRDOM,TW_BJ X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 12 Mar 2012 12:18:10 +0000 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1S74CW-0002rK-Lg from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Mon, 12 Mar 2012 05:18:08 -0700 Received: from SVR-ORW-FEM-03.mgc.mentorg.com ([147.34.97.39]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Mon, 12 Mar 2012 05:18:07 -0700 Received: from localhost.localdomain (147.34.91.1) by svr-orw-fem-03.mgc.mentorg.com (147.34.97.39) with Microsoft SMTP Server id 14.1.289.1; Mon, 12 Mar 2012 05:18:06 -0700 From: Yao Qi To: Subject: [PATCH] Move catch syscall to inferior-data. Date: Mon, 12 Mar 2012 12:18:00 -0000 Message-ID: <1331554677-12906-1-git-send-email-yao@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-03/txt/msg00392.txt.bz2 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 * 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