From patchwork Tue Jun 20 15:22:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qing Zhao X-Patchwork-Id: 110583 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp3746078vqr; Tue, 20 Jun 2023 08:25:25 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7Uw4yUceHFE+jgHOSiRkrM+IP32sz8+NW3A2+cNsLdaZebUi4hUQZx95aHOVK7hR7Z7S42 X-Received: by 2002:a2e:8296:0:b0:2b4:76f6:63a8 with SMTP id y22-20020a2e8296000000b002b476f663a8mr4356841ljg.12.1687274725820; Tue, 20 Jun 2023 08:25:25 -0700 (PDT) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id l15-20020a17090615cf00b009829826728dsi1409682ejd.640.2023.06.20.08.25.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Jun 2023 08:25:25 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=FqLuWy3E; arc=fail (signature failed); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F40C13857707 for ; Tue, 20 Jun 2023 15:24:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F40C13857707 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1687274660; bh=AWpZci9gtVmjIQ503tSnKgWycfXFmbOEv60g3xMv2Sc=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=FqLuWy3EqQlhpSV9aW0GwUwVnipzGtAoOBK3taKt9lm4o61MFjJuCe22ZbKf1OMGx bh8mqD529HFpZWJ0MpfsaFNuDQTRVfiWMMCS3ZMU/QWZCjIz7vGVgdIuwcUyQO6fxn k0IcB7aBXOjYf7SIikwT9nhFm8rVxIVu/LBzUw40= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id 7AD0A3857B8E for ; Tue, 20 Jun 2023 15:23:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 7AD0A3857B8E Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 35KBWq8a001373; Tue, 20 Jun 2023 15:23:29 GMT Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3r93e1d2j2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 20 Jun 2023 15:23:28 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 35KFLsVL005858; Tue, 20 Jun 2023 15:23:27 GMT Received: from nam12-dm6-obe.outbound.protection.outlook.com (mail-dm6nam12lp2169.outbound.protection.outlook.com [104.47.59.169]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3r9394gxnn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 20 Jun 2023 15:23:26 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FzBmpAy+V91DBaDNcul0whtCLen3L0Ynqoxj82edzqIhRfH0JPixzariKP4ZsCByOEiYUPxdLXfx3gZWFQ2mrcTX4tmlrR27jDXzIsQCDoNUrisub5tHfQK9oMFSl5M38YjhfxWIrPFaMoJCWW0nNOxYDEpEmxl0kZwWHFtv7eqZKUjrD8UBC0TlLMoYD2xg7rzEJJi8uf2PUBXDPlyY4fz91ZS97LqyPSWU7IBQS6xNbIa3xX8yEI1Yreg5LF2NuO3EZImVS+deWCF71vB9MrkNxB6w9sxuiK53TlzwwjxxAqKuZJbbFMVbhv//CBEZygUmisAa8DeQrTzHsSeMMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=AWpZci9gtVmjIQ503tSnKgWycfXFmbOEv60g3xMv2Sc=; b=ZBE533CDcGIgqKMHLov5jJgFogrvP/oOeFp+pCSUyk0+8lj3849yFNSJlO50LbrwU+cm6n6U8QgKl8ApvwKPbyAkCwEo5OwpWyI3H/irkGIhDjGaUHq2jibFsIFVruPfkrJ5P0Im/gLyPwXh3U9uDBOdCTF6exAb32VBpY8RPWsKU4gp+npP6pVUUde0WPskzzzBOGf7iGBDjQkmT4nwLB0Sol1bnrs5UQ6g4oLU+mWVJoIWH/ggSmho5LP2gWWIoev9IYx9pLLhePGnkLD83LIEgGYASDXW+1vGZBA9eDp7qyK4zhZFugxG3TiznIE0q8Ki2ueaZuDmzhk7oPaWNg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from CH2PR10MB4344.namprd10.prod.outlook.com (2603:10b6:610:af::19) by CY8PR10MB6513.namprd10.prod.outlook.com (2603:10b6:930:5f::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6500.36; Tue, 20 Jun 2023 15:23:00 +0000 Received: from CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::8d90:607a:f94c:5323]) by CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::8d90:607a:f94c:5323%3]) with mapi id 15.20.6521.020; Tue, 20 Jun 2023 15:22:59 +0000 To: qing.zhao@oracle.com, joseph@codesourcery.com, richard.guenther@gmail.com, jakub@redhat.com, gcc-patches@gcc.gnu.org Cc: keescook@chromium.org, siddhesh@gotplt.org, uecker@tugraz.at Subject: [V10][PATCH 3/3] Use TYPE_INCLUDES_FLEXARRAY in __builtin_object_size [PR101832] Date: Tue, 20 Jun 2023 15:22:46 +0000 Message-Id: <20230620152246.311493-4-qing.zhao@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20230620152246.311493-1-qing.zhao@oracle.com> References: <20230620152246.311493-1-qing.zhao@oracle.com> X-ClientProxiedBy: SA1P222CA0009.NAMP222.PROD.OUTLOOK.COM (2603:10b6:806:22c::25) To CH2PR10MB4344.namprd10.prod.outlook.com (2603:10b6:610:af::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PR10MB4344:EE_|CY8PR10MB6513:EE_ X-MS-Office365-Filtering-Correlation-Id: f30c32d9-216b-4bef-70e5-08db71a23b5d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: JkYM8r8RxHp5FryIAboFz+JwY/ROU69BEs/HRN9DN9Of8RzhNYQZ04/rKMH3el5IxP7uuY2YT+EBkN1CGxBVwCOM30FOhEzHzofJo9bNUR0KYU9nkKmuOjq7GsqJ1gNQuz2AnZyOwbW8ukdKBtXGaRcxLRLbjpzK/TqULgXAev8oroWSVlvTq+rrmkQgH4qH4suy+PNgbGKqyaNYRjlUcEo7eX0fCuac7WIy2C0VII5ozhd5tK5cjmYHtZS9KFs1gc9KaECIRAhJZLPVR0MZGE+Keyo3KRsWcNovqFH3iUJsyw2vFL1onEemE6n/qePb10ur1Fp0ceUIGBrq9ybrsUVvnpxQXvgkqlteYNWMR1JsYy5qopTIk1Z9dHMoqxbgHxA9YcOjg+ibb8/HzFg9YPmb4jy4Kwx3klLLls2za0Rco6gXfisJBv+00rnplngl1/EgRBOFNv74/4MjBmtiGBMN5OlyLK6g+4c8dP687QJTM2eoq9G1ETWJywUXJBK7fumGQMlXYQxXlBkJ5T6tbB1Q94azbik4XATg81EkkNU= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CH2PR10MB4344.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(396003)(346002)(366004)(136003)(39860400002)(376002)(451199021)(44832011)(86362001)(41300700001)(8676002)(8936002)(5660300002)(66476007)(66946007)(66556008)(316002)(2616005)(83380400001)(84970400001)(38100700002)(36756003)(186003)(26005)(6512007)(6486002)(6666004)(6506007)(1076003)(478600001)(4326008)(2906002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: PL8CEq/w6rMH09bdBpYQJhQawW7fi/vwkbi1RQiE3aXRtI8PHQ8CBW3tVYw7sNYY4x+EVIaGtV/Dez2llTDlc7BG6fulJYSs6tV1zgRAE4YWcqsv4faI37fwRGUDah/JFkG/4W/QzXEQDUb4gaEMxmZhX9ZGOy/ysHXwkNO/hP0Crh9IjX5OBjLZqHWyHgf4uXpqYwG/aRbU4OV0Z01YFNb5nqXqUpImV2W9J3kS/b1Isz4n0AogEqP+svro5mv60xbnaXklYOHn6ZpLClqs6yKQg6qfkCu7amSkC7hvoXpSEM8RkRg/596fwm/2fc4osHIYzhJHsNMd8hxJA5N79JMGci3kiEy6yrcj+09yHBZs3sSknXtMM+b3iHWT7CKUiiX3eyaerP0hV/9hjHSSWAEi5beNfUxYf6TBk5rA0BjmCI9yGFgNOsMWsceeY+8XkcrrbwAJandcw4TXZzS6pMA3r8ENLpB6OIgo2MjouW7rTFGiHJHR/KewFLoCMWX1PojKy61dpRpw/+Tvc0pfvzSfA0C0K6S7NsUhj5A4Pzu8skq8j9qDxx4GktuBIPkZFHwiUSCFg8ZeFiQIDxgKqwVzJKzGqwFFNyiYfHC4tCb1CsRFyIoO4HwstvdHyqcZ9SOEJb6sEBqOwwBQ7RIdNhLEjpQ7PS16srznIXwVZ7SEiKID2SK56pLXyEdT0sQfqFRnhCpN4gh4beCaBWrpKDMm7YwwJROlQf1oxIIcPVc9N7wbd5vRqJClq8iVNj6gGi9DUwSAg1jsSo/B0xrMRN27Z6SUGnM9VMDXDigMQM5XFX6maIiSJv9g3iwX6IY4Y165o9qqjdxrUjs8VuLu4jiKvhWPTHO/S2eRcjvFQQ5nrQlRHJp+aSpAoowN1DBfj8w4eIA/MKS3TbwqWYI4bXbfvW0vVgGnalBU4yhAMN95eczPTm9+Dg7JQOaRW/fP6D7+t+C8HWje243ZOjWMP4yeDmreAB7NZsN/2g+1FLMF3Z7c400NUEwABShSTATETZ89LZCGTeNsra0a8mT+dXRL0Zv/IsLYZWMr+PnjmdVvHgs9YaNZejjJ7Kr0p41+LE8hxWL4jW2RG/6ocbFczThJm5AkhMvGCr4Vc/rQF8gXpMJb5doj/7X6VaiJQ2ul6jf7FeVCktFBjTPYPxLG60mpWiKFGzbC2M45Ji2MsLQmQpIh7MNnh65u4R5KI2cVs3op7SlxFN2IPvRiaDXH4+uFbGpECSF7hnmUzYoU5VXVLKsJLfT6RdgY+rxiilFdSyTkm97YI++FgTm1+aiZVDVKFSUDX1wF218P8T8J5xGx9hulf54xRhuH2zaVB6xtZujglD/uRC1aX5gBoC1zQO+kHPTX0BEYKpFxyQRrCCA/HenXk7DUmDvttpQ449c5kVCz/6JN9sYAq2fzyEl5tzcX6tPQZlt1z5pO5+3nxUuZ7JPqUgCepx6JsTtGL5e4OILltVRLaVqwppIsM5y7IBWOo8kxhTFXyTPUDwpOifuHH2YI8K6TYYj9jz3pZSejpWvsIg4TJk3sXeSFMykFSRNFDNMK9sjRANEcxtopVTH9IQ6uDpnh/baJiZRLmiPS X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Bnj/yTYCjJhkxTb5wovPiyf01iCiwszIxjaN8CHKMYkXzZEoaWGLDKEklln2SPcviRVi3jdvnlfeQtf1Dcgycc5RkJiSW/934m07mHabErZK1Jh80mD4GvsPUpeL05T4pwzAapSO7NQd6+oV+heVGgnw7OCc7ZRjSWW+CZ4TZ3Tz1ZpX+CWjEsIxqR/DhjcPBp2cIJPWMRu3gBPjQrhewXCDLOScZoCAYe7DkrtK8zHBX3qrUrLBoL287d7Vcc7C6T2xZLL3iHExJWDf0QQl85vTC6QjpgA5z23Xn/o3vSDfXkr7DbtIP3o2i9XXLYxIyHhqThVU6iOqjPY7ElKbNL6J+OvKFsXErr5JMZ/Ky4FRHqI34Vkrs9B8B0NA+HLcbbwzqZFBc9lMnLjr4bSAeS+W5ITV8d+cJ1tM4crRM7/VB/aXfkyc+M8/aIUxE6W5jCYnb8vy2/jN79OmgaV0iJjTSHorADn1MeaLaCaoPt6wLtgqddzXgzp0n7coRNjjTI9nL1oI6ZFSNLw0TY80BhLWkNb4R0odsaHs1YbAhhUx0Md64yOhBwY/6x7/EIFv+X4sFH7z9feBzJTzaqPtF/ne5zlDb18spL13FU9O4f8b3ZeK514In6q/XoP+f+dYJzlQDiRsOFQidDnm23ULbq7Fst4nTpY2XjDu4OVEoF/xK6qZFdjpMXosuDYKwUi6xEo6Cq3je+GfZMeUkBdCvvEQaerLxldIEh9ha+Y616VlMp6+HuNuwNWgJxKUaQIfg52i8/MloUf/8E8qu1vuvS9sj7hjE65+mKRul+Xg1SJTDhWCK0rGLUOMhoeD1g0HF3ZlklJh6BQ2tI9r12TtXy6jJybJTeyhCJ19au1SnM2/AzAhGWWcSMxsIWkeXbOsFhT1mdJtUpnZ2TSoIX1mqMuyrOPH6CN/JDUP6xCNxZ3xhX93PTi7NloTahbEFj6M X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: f30c32d9-216b-4bef-70e5-08db71a23b5d X-MS-Exchange-CrossTenant-AuthSource: CH2PR10MB4344.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2023 15:22:59.9060 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: VnTJ7ZlqLffNpjK4oyKofm2KrfZl7h/4ymJ/vFUS5xMOtcvx/mB01X7pFmTfw/92/Oxpz3X3BhOfQanIif5/Vw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR10MB6513 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.957,Hydra:6.0.591,FMLib:17.11.176.26 definitions=2023-06-20_11,2023-06-16_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=964 adultscore=0 spamscore=0 bulkscore=0 malwarescore=0 phishscore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2305260000 definitions=main-2306200139 X-Proofpoint-GUID: u-2gaWvSAi7w_Xpi073Q1m3KN73qa5sd X-Proofpoint-ORIG-GUID: u-2gaWvSAi7w_Xpi073Q1m3KN73qa5sd X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Qing Zhao via Gcc-patches From: Qing Zhao Reply-To: Qing Zhao Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1769235782918466109?= X-GMAIL-MSGID: =?utf-8?q?1769235782918466109?= __builtin_object_size should treat struct with TYPE_INCLUDES_FLEXARRAY as flexible size. gcc/ChangeLog: PR tree-optimization/101832 * tree-object-size.cc (addr_object_size): Handle structure/union type when it has flexible size. gcc/testsuite/ChangeLog: PR tree-optimization/101832 * gcc.dg/builtin-object-size-pr101832.c: New test. --- .../gcc.dg/builtin-object-size-pr101832.c | 134 ++++++++++++++++++ gcc/tree-object-size.cc | 23 ++- 2 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c diff --git a/gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c b/gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c new file mode 100644 index 00000000000..60078e11634 --- /dev/null +++ b/gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c @@ -0,0 +1,134 @@ +/* PR 101832: + GCC extension accepts the case when a struct with a C99 flexible array + member is embedded into another struct (possibly recursively). + __builtin_object_size will treat such struct as flexible size. + However, when a structure with non-C99 flexible array member, i.e, trailing + [0], [1], or [4], is embedded into anther struct, the stucture will not + be treated as flexible size. */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include "builtin-object-size-common.h" + +#define expect(p, _v) do { \ + size_t v = _v; \ + if (p == v) \ + __builtin_printf ("ok: %s == %zd\n", #p, p); \ + else {\ + __builtin_printf ("WAT: %s == %zd (expected %zd)\n", #p, p, v); \ + FAIL (); \ + } \ +} while (0); + + +struct A { + int n; + char data[]; +}; + +struct B { + int m; + struct A a; +}; + +struct C { + int q; + struct B b; +}; + +struct A0 { + int n; + char data[0]; +}; + +struct B0 { + int m; + struct A0 a; +}; + +struct C0 { + int q; + struct B0 b; +}; + +struct A1 { + int n; + char data[1]; +}; + +struct B1 { + int m; + struct A1 a; +}; + +struct C1 { + int q; + struct B1 b; +}; + +struct An { + int n; + char data[8]; +}; + +struct Bn { + int m; + struct An a; +}; + +struct Cn { + int q; + struct Bn b; +}; + +volatile void *magic1, *magic2; + +int main (int argc, char *argv[]) +{ + struct B *outer; + struct C *outest; + + /* Make sure optimization can't find some other object size. */ + outer = (void *)magic1; + outest = (void *)magic2; + + expect (__builtin_object_size (&outer->a, 1), -1); + expect (__builtin_object_size (&outest->b, 1), -1); + expect (__builtin_object_size (&outest->b.a, 1), -1); + + struct B0 *outer0; + struct C0 *outest0; + + /* Make sure optimization can't find some other object size. */ + outer0 = (void *)magic1; + outest0 = (void *)magic2; + + expect (__builtin_object_size (&outer0->a, 1), sizeof (outer0->a)); + expect (__builtin_object_size (&outest0->b, 1), sizeof (outest0->b)); + expect (__builtin_object_size (&outest0->b.a, 1), sizeof (outest0->b.a)); + + struct B1 *outer1; + struct C1 *outest1; + + /* Make sure optimization can't find some other object size. */ + outer1 = (void *)magic1; + outest1 = (void *)magic2; + + expect (__builtin_object_size (&outer1->a, 1), sizeof (outer1->a)); + expect (__builtin_object_size (&outest1->b, 1), sizeof (outest1->b)); + expect (__builtin_object_size (&outest1->b.a, 1), sizeof (outest1->b.a)); + + struct Bn *outern; + struct Cn *outestn; + + /* Make sure optimization can't find some other object size. */ + outern = (void *)magic1; + outestn = (void *)magic2; + + expect (__builtin_object_size (&outern->a, 1), sizeof (outern->a)); + expect (__builtin_object_size (&outestn->b, 1), sizeof (outestn->b)); + expect (__builtin_object_size (&outestn->b.a, 1), sizeof (outestn->b.a)); + + DONE (); + return 0; +} diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc index 9a936a91983..a62af050056 100644 --- a/gcc/tree-object-size.cc +++ b/gcc/tree-object-size.cc @@ -633,11 +633,32 @@ addr_object_size (struct object_size_info *osi, const_tree ptr, v = NULL_TREE; break; case COMPONENT_REF: - if (TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE) + /* When the ref is not to an aggregate type, i.e, an array, + a record or a union, it will not have flexible size, + compute the object size directly. */ + if (!AGGREGATE_TYPE_P (TREE_TYPE (v))) { v = NULL_TREE; break; } + /* if the ref is to a record or union type, but the type + does not include a flexible array recursively, compute + the object size directly. */ + if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (v))) + { + if (!TYPE_INCLUDES_FLEXARRAY (TREE_TYPE (v))) + { + v = NULL_TREE; + break; + } + else + { + v = TREE_OPERAND (v, 0); + break; + } + } + /* Now the ref is to an array type. */ + gcc_assert (TREE_CODE (TREE_TYPE (v)) == ARRAY_TYPE); is_flexible_array_mem_ref = array_ref_flexible_size_p (v); while (v != pt_var && TREE_CODE (v) == COMPONENT_REF) if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))