From patchwork Thu Aug 17 04:05:24 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: 9904925 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 022E060244 for ; Thu, 17 Aug 2017 04:06:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E90BA28945 for ; Thu, 17 Aug 2017 04:06:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DDF7928987; Thu, 17 Aug 2017 04:06:00 +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 698F028945 for ; Thu, 17 Aug 2017 04:06:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750817AbdHQEGA (ORCPT ); Thu, 17 Aug 2017 00:06:00 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:33054 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750741AbdHQEF7 (ORCPT ); Thu, 17 Aug 2017 00:05:59 -0400 Received: by mail-wr0-f193.google.com with SMTP id n88so6177133wrb.0 for ; Wed, 16 Aug 2017 21:05:58 -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=6iEe1PK0248W3l8/n/H+ge4lX0G6BB/3qW2yjWWUL8g=; b=dcWEtW3vJngD8v3yNEvNQ6RSoWbpKHbsPBGFFSycT+VK0tWtrDEqxNdFwgWB/sl5N5 9gNVw5hEx5u1ep9WWoF974ly1fnbRd74IQbzr5gNaEQ2A8k/GufWR+kBWp5JWFnz6X0s JiKRzT6Fw42X/fpNVocyT8sYs9xTRKb9COErdezlnB6Dl7wcCyJq80/7cDwaoXOWJyUJ TQgmiW7QI/8cDHi8Yz9D6YsCovX451zAjc5Eu7k97RYtGsmWPfy7BO6ebWwbUf1pgDI+ 0/B17f6SO6/Telk8DKcF/Xc8myslSg1YQe5zx1pLMACamrrLR8ZPfV67KA54TDPtlNiT MNCQ== 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=6iEe1PK0248W3l8/n/H+ge4lX0G6BB/3qW2yjWWUL8g=; b=dG1EPujHQ6e7RGaq44zkdlK79JZUs58TcSv3RdM+QhSDMrDJG2Nwnm7VEWflBgsPTt PysfpFWfraWzxhAPJvTkjG9D9lTLbZMTlAD7dNDd+lfE4pK9x3+S5E/8Ji6RkrMhZUGZ qWGyy+BPWS1LiZKxr5JCLdBleBXkJSPkWXbMBUU9AH8DXcZJ2lXtpRTXD5mvh/zKmxt9 hgxmuqp2nxVgmhNwvyKLCsTEfHpWMRL+ghClov5r9KlMvPWcuuqsVfcDL7H1kQrcK/ky OL9qw82u9+lqNt+sZ778XcJBta+q7y5G6uGvBRzl4mXbIYbqOnuasfAF1haJzTOrsGqr qWqQ== X-Gm-Message-State: AHYfb5jVQYzkQjDPnszn1U+zRI4/eGzgH8cy6AuvMcuXHP7eF/gFjK9U LVedBJJdpRusVkjufu8= X-Received: by 10.80.181.163 with SMTP id a32mr541988ede.199.1502942757961; Wed, 16 Aug 2017 21:05:57 -0700 (PDT) Received: from localhost.localdomain (1.84-65-87.adsl-dyn.isp.belgacom.be. [87.65.84.1]) by smtp.gmail.com with ESMTPSA id e12sm1378134edj.72.2017.08.16.21.05.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Aug 2017 21:05:57 -0700 (PDT) From: Luc Van Oostenryck To: linux-sparse@vger.kernel.org Cc: Linus Torvalds , Christopher Li , Dibyendu Majumdar , Luc Van Oostenryck Subject: [RFC PATCH 09/14] cast: make pointer casts always size preserving Date: Thu, 17 Aug 2017 06:05:24 +0200 Message-Id: <20170817040529.7289-10-luc.vanoostenryck@gmail.com> X-Mailer: git-send-email 2.14.0 In-Reply-To: <20170817040529.7289-1-luc.vanoostenryck@gmail.com> References: <20170817040529.7289-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 Currently casts to pointers can be done from any integer type. However, casts to (or from) pointers are only meaningful if value preserving and thus between object of the same size. To avoid to have to worry about sign/zero extension while doing casts to pointers it's good to not have to deal with such casts. Do this by doing first, if needed, a cast an integer of the same size as a pointer before doing the cast to a pointer. Signed-off-by: Luc Van Oostenryck --- Documentation/IR.md | 2 +- linearize.c | 2 ++ validation/cast-kinds.c | 62 +++++++++++++++++++++++++----------------------- validation/cast-weirds.c | 18 +++++++------- 4 files changed, 45 insertions(+), 39 deletions(-) diff --git a/Documentation/IR.md b/Documentation/IR.md index 039bdb097..a1a32c562 100644 --- a/Documentation/IR.md +++ b/Documentation/IR.md @@ -164,7 +164,7 @@ Cast to unsigned integer (and to void pointer). Cast to signed integer. ### OP_UTPTR -Cast from unsigned integer to pointer type. +Cast from pointer-sized unsigned integer to pointer type. ### OP_PTRCAST Cast to pointer. diff --git a/linearize.c b/linearize.c index 85d472ca6..8be26db58 100644 --- a/linearize.c +++ b/linearize.c @@ -1225,6 +1225,8 @@ static pseudo_t cast_pseudo(struct entrypoint *ep, pseudo_t src, struct symbol * break; if (Wint_to_pointer_cast) warning(to->pos, "non size-preserving integer to pointer cast"); + src = cast_pseudo(ep, src, from, size_t_ctype); + from = size_t_ctype; break; default: break; diff --git a/validation/cast-kinds.c b/validation/cast-kinds.c index e5b64b768..aa9f9bb29 100644 --- a/validation/cast-kinds.c +++ b/validation/cast-kinds.c @@ -293,106 +293,108 @@ iptr_2_vptr: int_2_iptr: .L66: - utptr.64 %r101 <- (32) %arg1 - ret.64 %r101 + scast.64 %r101 <- (32) %arg1 + utptr.64 %r102 <- (64) %r101 + ret.64 %r102 uint_2_iptr: .L68: - utptr.64 %r104 <- (32) %arg1 - ret.64 %r104 + cast.64 %r105 <- (32) %arg1 + utptr.64 %r106 <- (64) %r105 + ret.64 %r106 long_2_iptr: .L70: - utptr.64 %r107 <- (64) %arg1 - ret.64 %r107 + utptr.64 %r109 <- (64) %arg1 + ret.64 %r109 ulong_2_iptr: .L72: - utptr.64 %r110 <- (64) %arg1 - ret.64 %r110 + utptr.64 %r112 <- (64) %arg1 + ret.64 %r112 vptr_2_iptr: .L74: - ptrcast.64 %r113 <- (64) %arg1 - ret.64 %r113 + ptrcast.64 %r115 <- (64) %arg1 + ret.64 %r115 int_2_float: .L76: - scvtf.32 %r116 <- (32) %arg1 - ret.32 %r116 + scvtf.32 %r118 <- (32) %arg1 + ret.32 %r118 uint_2_float: .L78: - ucvtf.32 %r119 <- (32) %arg1 - ret.32 %r119 + ucvtf.32 %r121 <- (32) %arg1 + ret.32 %r121 long_2_float: .L80: - scvtf.32 %r122 <- (64) %arg1 - ret.32 %r122 + scvtf.32 %r124 <- (64) %arg1 + ret.32 %r124 ulong_2_float: .L82: - ucvtf.32 %r125 <- (64) %arg1 - ret.32 %r125 + ucvtf.32 %r127 <- (64) %arg1 + ret.32 %r127 double_2_float: .L84: - fcvtf.32 %r128 <- (64) %arg1 - ret.32 %r128 + fcvtf.32 %r130 <- (64) %arg1 + ret.32 %r130 int_2_double: .L86: - scvtf.64 %r131 <- (32) %arg1 - ret.64 %r131 + scvtf.64 %r133 <- (32) %arg1 + ret.64 %r133 uint_2_double: .L88: - ucvtf.64 %r134 <- (32) %arg1 - ret.64 %r134 + ucvtf.64 %r136 <- (32) %arg1 + ret.64 %r136 long_2_double: .L90: - scvtf.64 %r137 <- (64) %arg1 - ret.64 %r137 + scvtf.64 %r139 <- (64) %arg1 + ret.64 %r139 ulong_2_double: .L92: - ucvtf.64 %r140 <- (64) %arg1 - ret.64 %r140 + ucvtf.64 %r142 <- (64) %arg1 + ret.64 %r142 float_2_double: .L94: - fcvtf.64 %r143 <- (32) %arg1 - ret.64 %r143 + fcvtf.64 %r145 <- (32) %arg1 + ret.64 %r145 float_2_float: diff --git a/validation/cast-weirds.c b/validation/cast-weirds.c index 136137b4c..71e52ff57 100644 --- a/validation/cast-weirds.c +++ b/validation/cast-weirds.c @@ -20,29 +20,31 @@ cast-weirds.c:5:44: warning: non size-preserving integer to pointer cast int_2_iptr: .L0: - utptr.64 %r2 <- (32) %arg1 - ret.64 %r2 + scast.64 %r2 <- (32) %arg1 + utptr.64 %r3 <- (64) %r2 + ret.64 %r3 uint_2_iptr: .L2: - utptr.64 %r5 <- (32) %arg1 - ret.64 %r5 + cast.64 %r6 <- (32) %arg1 + utptr.64 %r7 <- (64) %r6 + ret.64 %r7 int_2_vptr: .L4: - scast.64 %r8 <- (32) %arg1 - ret.64 %r8 + scast.64 %r10 <- (32) %arg1 + ret.64 %r10 uint_2_vptr: .L6: - cast.64 %r11 <- (32) %arg1 - ret.64 %r11 + cast.64 %r13 <- (32) %arg1 + ret.64 %r13 * check-output-end