From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 89561 invoked by alias); 17 May 2016 16:55:05 -0000 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 Received: (qmail 89551 invoked by uid 89); 17 May 2016 16:55:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.9 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-oi0-f73.google.com Received: from mail-oi0-f73.google.com (HELO mail-oi0-f73.google.com) (209.85.218.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 17 May 2016 16:55:03 +0000 Received: by mail-oi0-f73.google.com with SMTP id u185so1431775oie.0 for ; Tue, 17 May 2016 09:55:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:message-id:date:subject:from:to:cc; bh=qOWRBOdkQh6GWDHmyLHanWx/u0asGJdaUTvMGjIcNsA=; b=P2G900d8hGK0bppNSzkOoOwJQX9hrYm/57Mr60mo1zTP87I3FR0cooJlyoHKhazb0N 7uSYfRb9ejL3m5lV9S5FmCcVwJiaJOS/V5DPwTkXZvDCwvgmh0baxuOv9EjVHYcap1yY /oOjj+AQBSFLIW0Ol5cnQ989kd/sNoNU3MFs0wiEv/W/jTcmKTYuIGH7PZ8iIE7x8D9B QLKYiTdPG6oa8tp228Me8cFvwSVJ5jawze2YutFZHyu1paeLnbRaKJJlzNgdF5r+Lz+C Cy/Lx4sylNxW9nV5yChAl2Tgqpsdq+lXIg+7BmcI9pLbtISUSkDR8TrZ+rZU921UHaNh n42Q== X-Gm-Message-State: AOPr4FXfBPkv393RYqIwCLZHnUUlxZR+2eTKTnu9guzVk6WdruJ/ylT0JS3IiZt7RPU4OCmogw== MIME-Version: 1.0 X-Received: by 10.50.155.137 with SMTP id vw9mr17400267igb.9.1463504101165; Tue, 17 May 2016 09:55:01 -0700 (PDT) Message-ID: Date: Tue, 17 May 2016 16:55:00 -0000 Subject: Re: [PATCH v5 2/5] Add support to catch groups of syscalls. From: Doug Evans To: Gabriel Krisman Bertazi Cc: gdb-patches@sourceware.org, palves@redhat.com, sergiodj@redhat.com Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes X-IsSubscribed: yes X-SW-Source: 2016-05/txt/msg00262.txt.bz2 Gabriel Krisman Bertazi writes: > This implements the catchpoint side. While parsing 'catch syscall' > arguments, we verify if the argument is a syscall group and expand it to > a list of syscalls that are part of that group. > > gdb/ > > * break-catch-syscall.c (catch_syscall_split_args): Verify if > argument is a syscall group and expand it to a list of syscalls > when creating catchpoints. > (catch_syscall_completer): Add word completion for system call > groups. Hi. Just more nits. > diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c > index dbebdda..be034ac 100644 > --- a/gdb/break-catch-syscall.c > +++ b/gdb/break-catch-syscall.c > @@ -464,10 +464,38 @@ catch_syscall_split_args (char *arg) > cur_name[i] = '\0'; > arg += i; > > - /* Check if the user provided a syscall name or a number. */ > + /* Check if the user provided a syscall name, group, or a number. */ > syscall_number = (int) strtol (cur_name, &endptr, 0); > if (*endptr == '\0') > - get_syscall_by_number (gdbarch, syscall_number, &s); > + { > + get_syscall_by_number (gdbarch, syscall_number, &s); > + VEC_safe_push (int, result, s.number); > + } > + else if (strncmp (cur_name, "g:", sizeof ("g:") - 1) == 0 > + || strncmp (cur_name, "group:", sizeof ("group:") - 1) == 0) Use startswith here. [See common/common-utils.h.] > + { > + /* We have a syscall group. Let's expand it into a syscall > + list before inserting. */ > + struct syscall *syscall_list; > + const char *group_name; > + > + /* Skip over "g:" and "group:" prefix strings. */ > + group_name = strchr (cur_name, ':') + 1; > + > + syscall_list = get_syscalls_by_group (gdbarch, group_name); > + > + if (syscall_list == NULL) > + error (_("Unknown syscall group '%s'."), group_name); > + > + for (i = 0; syscall_list[i].name != NULL; i++) > + { > + /* Insert each syscall that are part of the group. No > + need to check if it is valid. */ > + VEC_safe_push (int, result, syscall_list[i].number); > + } > + > + xfree (syscall_list); > + } > else > { > /* We have a name. Let's check if it's valid and convert it > @@ -479,10 +507,10 @@ catch_syscall_split_args (char *arg) > because GDB cannot do anything useful if there's no > syscall number to be caught. */ > error (_("Unknown syscall name '%s'."), cur_name); > - } > > - /* Ok, it's valid. */ > - VEC_safe_push (int, result, s.number); > + /* Ok, it's valid. */ > + VEC_safe_push (int, result, s.number); > + } > } > > discard_cleanups (cleanup); > @@ -597,11 +625,59 @@ static VEC (char_ptr) * > catch_syscall_completer (struct cmd_list_element *cmd, > const char *text, const char *word) > { > - const char **list = get_syscall_names (get_current_arch ()); > - VEC (char_ptr) *retlist > - = (list == NULL) ? NULL : complete_on_enum (list, word, word); > + struct gdbarch *gdbarch = get_current_arch (); > + struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); > + VEC (char_ptr) *group_retlist = NULL; > + VEC (char_ptr) *syscall_retlist = NULL; > + VEC (char_ptr) *retlist = NULL; > + const char **group_list = NULL; > + const char **syscall_list = NULL; > + const char *prefix; > + int i; > + > + /* Completion considers ':' to be a word separator, so we use this to > + verify whether the previous word was a group prefix. If so, we > + build the completion list using group names only. */ > + for (prefix = word; prefix != text && prefix[-1] != ' '; prefix--) > + ; > + > + if (strncmp (prefix, "g:", sizeof ("g:") - 1) == 0 > + || strncmp (prefix, "group:", sizeof ("group:") - 1) == 0) startswith > + { > + /* Perform completion inside 'group:' namespace only. */ > + group_list = get_syscall_group_names (gdbarch); > + retlist = (group_list == NULL > + ? NULL : complete_on_enum (group_list, word, word)); > + } > + else > + { > + /* Complete with both, syscall names and groups. */ > + syscall_list = get_syscall_names (gdbarch); > + group_list = get_syscall_group_names (gdbarch); > + > + /* Append "group:" prefix to syscall groups. */ > + for (i = 0; group_list[i] != NULL; i++) > + { > + char *prefixed_group = xstrprintf ("group:%s", group_list[i]); > + > + group_list[i] = prefixed_group; > + make_cleanup (xfree, prefixed_group); > + } > + > + syscall_retlist = ((syscall_list == NULL) > + ? NULL : complete_on_enum (syscall_list, word, word)); > + group_retlist = ((group_list == NULL) > + ? NULL : complete_on_enum (group_list, word, word)); > + > + retlist = VEC_merge (char_ptr, syscall_retlist, group_retlist); > + } > + > + VEC_free (char_ptr, syscall_retlist); > + VEC_free (char_ptr, group_retlist); > + xfree (syscall_list); > + xfree (group_list); > + do_cleanups (cleanups); > > - xfree (list); > return retlist; > } > > -- > 2.4.3 >