From patchwork Fri Jul 7 13:39:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luc Van Oostenryck X-Patchwork-Id: 9830509 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8F3FB60352 for ; Fri, 7 Jul 2017 13:51:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 83FED284FC for ; Fri, 7 Jul 2017 13:51:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 78D4828618; Fri, 7 Jul 2017 13:51:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 07168284FC for ; Fri, 7 Jul 2017 13:51:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752791AbdGGNv2 (ORCPT ); Fri, 7 Jul 2017 09:51:28 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:35845 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751034AbdGGNkn (ORCPT ); Fri, 7 Jul 2017 09:40:43 -0400 Received: by mail-lf0-f66.google.com with SMTP id f28so4001259lfi.3 for ; Fri, 07 Jul 2017 06:40:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=OBOz+tUASD3FKbfGnjz0yW1URoVMSp6pAy8m6XOcytQ=; b=sz3al5kZK1XGhGS84+CioaSRKcpErOlFIl2Lke2Z8kwqoqZqzq9/ofg+U8f9aHD0Yk 0S33v4lGjY5wAhesr6Co2zhPR7TISLdGYmKY0oWWPBBHP4ebRqAvKCmU1rQHflZbY+2V 4tHeNclBycrWw6q6HR4ODwz48wOLT/Ruh2T5yAg69kDaWhXb44b1/RmVHCAjynVmzbI3 giu6cQgGurD5R1Pz9udUA/6Wqt1iuWcjSQ4H+lafy+PHD+GLjw/Zksj9FYGe/NN02SnZ CeIhp3MiUUCip+cB7vO6anw7yDxfMltOiChYPderBJ81sAp6t/NZ+IBhMZg7IyRXPvkC Lxvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OBOz+tUASD3FKbfGnjz0yW1URoVMSp6pAy8m6XOcytQ=; b=YVq0s/K4rtRWsdg2XveCFakx/JJaWLLToK1dIeTsczLpI7b5J79wnYg5vcnn4cjzTy JjC2fW8etZORS7TNavufpu8e4XSXRWn2Q2kVRD8wqtsXt4hgwvYEOXNh45oJlqVjiD80 e4bSXvtCxik2cNM+yrCbCkXJdBjyCfXwhnJTE3QxatGy5Y531teD/Fw4eg8FXuMPNUYB 6JVXPxzrDikzjaAmMP7kxC/z/fKOmQcGMshzl3eeU8v+6u1afmHW/q7FfaeLWaZZ7J57 /RvjHQ7YEsK2ku2tP2HA38+Yh0r7FhK9rWd6SwoaVw3eGyDPBAOfN3g89DYyAMNcD3rj IgLg== X-Gm-Message-State: AIVw111aS0VnA1mj0KjQLmTPp5OnxOcV0Inqc2pi/sP7JvXWXAkNqL7q V3q2KNb6kEOjDbht1vA= X-Received: by 10.80.216.195 with SMTP id y3mr2325915edj.165.1499434841114; Fri, 07 Jul 2017 06:40:41 -0700 (PDT) Received: from localhost.localdomain ([2a02:a03f:8ed:9a00:3d4d:9b95:75f7:a8db]) by smtp.gmail.com with ESMTPSA id e28sm1899277ede.14.2017.07.07.06.40.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 07 Jul 2017 06:40:40 -0700 (PDT) From: Luc Van Oostenryck To: linux-sparse@vger.kernel.org Cc: Christopher Li , Linus Torvalds , Luc Van Oostenryck Subject: [PATCH 30/34] ptrlist: simplify common case for __add_ptr_list() Date: Fri, 7 Jul 2017 15:39:58 +0200 Message-Id: <20170707134002.49500-31-luc.vanoostenryck@gmail.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170707134002.49500-1-luc.vanoostenryck@gmail.com> References: <20170707134002.49500-1-luc.vanoostenryck@gmail.com> Sender: linux-sparse-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sparse@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The vast majority of pointer list use non-tagged pointer, the core library and the sparse tool doesn't use them (in fact only 'example.c' use them). The current functions to add a pointer to a ptr_list suppose that all pointers are tagged and in the case of non-word-aligned pointers (strings) it create a a fake tag consiting of the last 2 bits. This patch siplify the situation by separating the common case (non-tagged or non-word-aligned pointers) which ignore the presence of a tag and make another version which check and combien the tag with the pointer before calling the common case. --- ptrlist.c | 30 +++++++++++++++++++++++------- ptrlist.h | 11 +++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/ptrlist.c b/ptrlist.c index 1957baf1f..95447eaea 100644 --- a/ptrlist.c +++ b/ptrlist.c @@ -114,18 +114,19 @@ void split_ptr_list_head(struct ptr_list *head) memset(head->list + old, 0xf0, nr * sizeof(void *)); } -void **__add_ptr_list(struct ptr_list **listp, void *ptr, unsigned long tag) +/* + * Add 'ptr' to 'listp'. + * 'ptr' can be a tagged pointer, a non-tagged one or a + * non-word-aligned one, it doesn't matter. + * Returns the address where 'ptr' was stored. + */ +void **__add_ptr_list(struct ptr_list **listp, void *ptr) { struct ptr_list *list = *listp; struct ptr_list *last = NULL; /* gcc complains needlessly */ void **ret; int nr; - /* The low two bits are reserved for tags */ - assert((3 & (unsigned long)ptr) == 0); - assert((~3 & tag) == 0); - ptr = (void *)(tag | (unsigned long)ptr); - if (!list || (nr = (last = list->prev)->nr) >= LIST_NODE_NR) { struct ptr_list *newlist = __alloc_ptrlist(0); if (!list) { @@ -148,6 +149,21 @@ void **__add_ptr_list(struct ptr_list **listp, void *ptr, unsigned long tag) return ret; } +/* + * Add 'ptr' to 'listp' and tag it with 'tag' + * 'ptr' must be a non-tagged word-aligned pointer. + * Returns the address where 'ptr' was stored. + */ +void **__add_ptr_list_tag(struct ptr_list **listp, void *ptr, unsigned long tag) +{ + /* The low two bits are reserved for tags */ + assert((3 & (unsigned long)ptr) == 0); + assert((~3 & tag) == 0); + ptr = (void *)(tag | (unsigned long)ptr); + + return __add_ptr_list(listp, ptr); +} + int delete_ptr_list_entry(struct ptr_list **list, void *entry, int count) { struct ptr_cur cur; @@ -234,7 +250,7 @@ void concat_ptr_list(struct ptr_list *a, struct ptr_list **b) return; while (ptr_cur_next(&cur)) - __add_ptr_list(b, ptr_cur_entry(&cur), 0); + __add_ptr_list(b, ptr_cur_entry(&cur)); } void __free_ptr_list(struct ptr_list **listp) diff --git a/ptrlist.h b/ptrlist.h index c1d53632d..9e16adb36 100644 --- a/ptrlist.h +++ b/ptrlist.h @@ -45,7 +45,8 @@ int delete_ptr_list_entry(struct ptr_list **, void *, int); int replace_ptr_list_entry(struct ptr_list **, void *old, void *new, int); extern void sort_list(struct ptr_list **, int (*)(const void *, const void *)); -extern void **__add_ptr_list(struct ptr_list **, void *, unsigned long); +extern void **__add_ptr_list(struct ptr_list **, void *); +extern void **__add_ptr_list_tag(struct ptr_list **, void *, unsigned long); extern void concat_ptr_list(struct ptr_list *a, struct ptr_list **b); extern void __free_ptr_list(struct ptr_list **); extern int ptr_list_size(struct ptr_list *); @@ -65,13 +66,11 @@ void ptr_cur_delete(struct ptr_cur *cur, void *ptr); * extensions.. */ #define add_ptr_list_tag(list,entry,tag) \ - MKTYPE(*(list), (CHECK_TYPE(*(list),(entry)),__add_ptr_list((struct ptr_list **)(list), (entry), (tag)))) + MKTYPE(*(list), (CHECK_TYPE(*(list),(entry)),__add_ptr_list_tag((struct ptr_list **)(list), (entry), (tag)))) #define add_ptr_list_notag(list,entry) \ - MKTYPE(*(list), (CHECK_TYPE(*(list),(entry)),__add_ptr_list((struct ptr_list **)(list), \ - (void *)((unsigned long)(entry) & ~3UL), \ - (unsigned long)(entry) & 3))) + MKTYPE(*(list), (CHECK_TYPE(*(list),(entry)),__add_ptr_list((struct ptr_list **)(list), (entry)))) #define add_ptr_list(list,entry) \ - add_ptr_list_tag(list,entry,0) + add_ptr_list_notag(list,entry) #define free_ptr_list(list) \ do { VRFY_PTR_LIST(*(list)); __free_ptr_list((struct ptr_list **)(list)); } while (0)