From patchwork Thu Aug 17 04:05:18 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: 9904913 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 D1B8660244 for ; Thu, 17 Aug 2017 04:05:46 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C4A7628414 for ; Thu, 17 Aug 2017 04:05:46 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B989328946; Thu, 17 Aug 2017 04:05:46 +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 5622128414 for ; Thu, 17 Aug 2017 04:05:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750805AbdHQEFq (ORCPT ); Thu, 17 Aug 2017 00:05:46 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:36665 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750755AbdHQEFp (ORCPT ); Thu, 17 Aug 2017 00:05:45 -0400 Received: by mail-wr0-f193.google.com with SMTP id y67so6172211wrb.3 for ; Wed, 16 Aug 2017 21:05:44 -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=OXwBAKWVtBcNA1U3TnSpLLTBEwyKg/lAexhsdfJXMhs=; b=n67UW3OVgcAOdFGEhX6mPVqhWviJdzd1WwA1F/KnXEJekZFGX/ZnqZzgGVr1kz8pl7 S08pUKDHD8Zz+F9mzePHnB0boXTcU040VEnfFWaHaGRhbWHQOJTrxx2ZqscIHkV0kHuM 8QEd6PuJuVo4cw6mPZNXG08YcIasEdCxGUPV98XNCdo1HXxTm8A/djtz96Q8sKxh3lTp juZ1npJqk8GZT73AbLRr0bRnwPj6XKdijbtKZNkGKUWEXb0avE5OrbsQiE+AuVJdgttM G+SBub3K4lcpR6SlB0ayKp6cmfIfoRanSmLhDnPfZcqKialVc+MMKzp4IO7P+A7VlmO0 d/wQ== 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=OXwBAKWVtBcNA1U3TnSpLLTBEwyKg/lAexhsdfJXMhs=; b=A3KMp2xBkmHFNykjz3fi1Aawfkmzyxav0ZYDMRPR8kWuYYMawF+CNATTLZmz+W0j5A rbuDbboThdtwzJ4jGyEruej/FwltrUS+liqD5i0loSqCGrMuwQ05RlTp70bVZDKsbCRO zHswpPl+8k+yVr7eq2THJGiCAZXmSdbNT9xRTQRJYBjZbEmwVV/MVfnkJx/rfsIZAEvM 3Oltg5GYkSsGSYjpKwFQBUwoypeXFgQt7Ty1ztvApQLMoiItwZAQ1Kq5KBKCXd+fKh1M j73xZTrcuLgWwym1M9OcQ+GEBtCZ5/bL/o4Zb3K4xMqW/zyIr+yXhgDmWohmR+Ha2XZp Gv1A== X-Gm-Message-State: AHYfb5gjChxc5Eb77k9GbUu4qTCOy3SE6Z/P2FQtTNXa7AqdW5rcJtlj z66hBsMQZRTk+8HUz6A= X-Received: by 10.80.140.134 with SMTP id q6mr522669edq.301.1502942743986; Wed, 16 Aug 2017 21:05:43 -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.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Aug 2017 21:05:43 -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 03/14] cast: prepare finer grained cast instructions Date: Thu, 17 Aug 2017 06:05:18 +0200 Message-Id: <20170817040529.7289-4-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 As a first step, add a small function classify values into 'machine type: - signed integer - unsigned integer - pointer - floats and use this to select the appropriate O_XXXCAST. Note: this is a preparatory patch and should not introduce any changes in the generated IR. Signed-off-by: Luc Van Oostenryck --- linearize.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/linearize.c b/linearize.c index ba76397ea..c77a3c2df 100644 --- a/linearize.c +++ b/linearize.c @@ -1109,28 +1109,75 @@ static pseudo_t linearize_postop(struct entrypoint *ep, struct expression *expr) * case, since you can't access through it anyway without another * cast. */ -static struct instruction *alloc_cast_instruction(struct symbol *src, struct symbol *ctype) +enum mtype { + MTYPE_UINT, + MTYPE_SINT, + MTYPE_PTR, + MTYPE_FLOAT, + MTYPE_BAD, +}; + +static enum mtype get_mtype(struct symbol *s) +{ + int sign = (s->ctype.modifiers & MOD_SIGNED) ? 1 : 0; + +retry: switch (s->type) { + case SYM_NODE: + s = s->ctype.base_type; + goto retry; + case SYM_PTR: + if (s->ctype.base_type == &void_ctype) + // handle void pointer like an uint + goto case_int; + return MTYPE_PTR; + case SYM_BITFIELD: + case SYM_RESTRICT: + case SYM_FOULED: + case SYM_ENUM: + s = s->ctype.base_type; + /* fall-through */ + case_int: + return sign ? MTYPE_SINT : MTYPE_UINT; + case SYM_BASETYPE: + if (s->ctype.base_type == &fp_type) + return MTYPE_FLOAT; + if (s->ctype.base_type == &int_type) + goto case_int; + /* fall-through */ + default: + return MTYPE_BAD; + } +} + +static int get_cast_opcode(struct symbol *dst, struct symbol *src) { - int opcode = OP_CAST; - struct symbol *base = ctype; + enum mtype stype = get_mtype(src); + enum mtype dtype = get_mtype(dst); - if (src->ctype.modifiers & MOD_SIGNED) - opcode = OP_SCAST; - if (base->type == SYM_NODE) - base = base->ctype.base_type; - if (base->type == SYM_PTR) { - base = base->ctype.base_type; - if (base != &void_ctype) - opcode = OP_PTRCAST; - } else if (base->ctype.base_type == &fp_type) - opcode = OP_FPCAST; - return alloc_typed_instruction(opcode, ctype); + switch (dtype) { + case MTYPE_FLOAT: + return OP_FPCAST; + case MTYPE_PTR: + return OP_PTRCAST; + case MTYPE_UINT: + case MTYPE_SINT: + switch (stype) { + case MTYPE_SINT: + return OP_SCAST; + default: + break; + } + /* fall through */ + default: + return OP_CAST; + } } static pseudo_t cast_pseudo(struct entrypoint *ep, pseudo_t src, struct symbol *from, struct symbol *to) { pseudo_t result; struct instruction *insn; + int opcode; if (src == VOID) return VOID; @@ -1138,7 +1185,8 @@ static pseudo_t cast_pseudo(struct entrypoint *ep, pseudo_t src, struct symbol * return VOID; if (from->bit_size < 0 || to->bit_size < 0) return VOID; - insn = alloc_cast_instruction(from, to); + opcode = get_cast_opcode(to, from); + insn = alloc_typed_instruction(opcode, to); result = alloc_pseudo(insn); insn->target = result; insn->orig_type = from;