From patchwork Fri Feb 24 18:35:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qing Zhao X-Patchwork-Id: 61413 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp1075534wrd; Fri, 24 Feb 2023 10:36:45 -0800 (PST) X-Google-Smtp-Source: AK7set9fmykctVpVQMgPAB1ZcmKxsMKdohAJGcIcJpj8xF8HXOvEKWCO5tr+QGRoTpsvj1IHCzZ1 X-Received: by 2002:aa7:db56:0:b0:4ad:a70c:e010 with SMTP id n22-20020aa7db56000000b004ada70ce010mr16967894edt.41.1677263805619; Fri, 24 Feb 2023 10:36:45 -0800 (PST) Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id m3-20020aa7c2c3000000b004af7265c69csi82012edp.0.2023.02.24.10.36.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 10:36:45 -0800 (PST) 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=K9XOU9NW; 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 EA34B3850432 for ; Fri, 24 Feb 2023 18:36:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EA34B3850432 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677263772; bh=gCGs666XNX/nMV/ViTHXcP61+mxf2U3kod4R88Gm9FM=; 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=K9XOU9NWYnv2eyQjEgpGENDcUVUQ5GA9NzEz/0L627IYhv55ewgvGWrg7JgWlucQV v5XGYPlOsZxglxyPVdR+jPlWzocT5bX7HT10zP3cCHGjfQkG1x07eCtQHj559prscm 5s5ODqII/zwAQ1+ellL0CD0QEOBdV9WHim3vpdW4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 8B69D3857C45 for ; Fri, 24 Feb 2023 18:35:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8B69D3857C45 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 31OHhwvC019998; Fri, 24 Feb 2023 18:35:21 GMT Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3ntp9twxrs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 24 Feb 2023 18:35:21 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 31OHQ39b030233; Fri, 24 Feb 2023 18:35:20 GMT Received: from nam02-bn1-obe.outbound.protection.outlook.com (mail-bn1nam02lp2047.outbound.protection.outlook.com [104.47.51.47]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3ntn49umj4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 24 Feb 2023 18:35:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZjKcajF7ZcTitCv1ORlm2z1b0nh/za0vTYQ7oQxDDeaY2FbWnGdUswsHdHPTw+gFYoHOZ1ZYYsK8wxA+uA865JHlgfyTblWiMiwetFCEHMiD4qPRu9snIad/6mKYgJzZvVtDASQgovq46YaK/R41OAMrIIOY2iygcbxt21O+g6Y2v1orx/9UwSMMqxU+GEbyZhhYshfD7ApoI7zURg3in60BrDmZdyhyRfEYzimGBvmTmne7FTJN89RcfKeU4ZAfrmKd8ygP2zS60x7IgtCWakqKY0pwHNh/XumYLph1cqfeMxKqOznpapfeQjgs4VvsJCMXr0K0lNQu1UDlEslxYw== 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=gCGs666XNX/nMV/ViTHXcP61+mxf2U3kod4R88Gm9FM=; b=CPzwNnRAliE6ZUHgwayjelV2RQGsgw/ehPO3cJ4oEL2Q2W/Ircmls2phSIuWv7oB4ID8sGVsorylyaM1WgL6hWtth2fXuNv+QLBwtMpOhPTyd6gOUdUIE8EcqR2Vu+ZFvgdt+6UhdktbKoq43Z1iN04rGE8/JdR4hKaJm5UKR3e38nJBvhUvsDoA9v+KAIvfJkuBoV++cLL9nufBO3ADPPSfGKhXAXua3j8d5Cia5N454PrJORf0fA5Xzsy62YZ8664oylg6stU6iUaFmFgkQBhwJzplNaFes6VzdYyDv+DziiBxzrxK8px6LeBjwGdy3WQU9QHJEo1YiYQIaJTx+w== 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 PH7PR10MB5856.namprd10.prod.outlook.com (2603:10b6:510:131::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6156.7; Fri, 24 Feb 2023 18:35:17 +0000 Received: from CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::7030:ed2e:20d0:cd5b]) by CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::7030:ed2e:20d0:cd5b%7]) with mapi id 15.20.6156.007; Fri, 24 Feb 2023 18:35:17 +0000 To: joseph@codesourcery.com, rguenther@suse.de Cc: siddhesh@gotplt.org, keescook@chromium.org, gcc-patches@gcc.gnu.org, Qing Zhao Subject: [v4][PATCH 1/2] Handle component_ref to a structre/union field including C99 FAM [PR101832] Date: Fri, 24 Feb 2023 18:35:04 +0000 Message-Id: <20230224183505.4112295-2-qing.zhao@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20230224183505.4112295-1-qing.zhao@oracle.com> References: <20230224183505.4112295-1-qing.zhao@oracle.com> X-ClientProxiedBy: AM4P190CA0009.EURP190.PROD.OUTLOOK.COM (2603:10a6:200:56::19) To CH2PR10MB4344.namprd10.prod.outlook.com (2603:10b6:610:af::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PR10MB4344:EE_|PH7PR10MB5856:EE_ X-MS-Office365-Filtering-Correlation-Id: 3dba05db-0339-4cc7-e03c-08db1695e01e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: bA1nzlz/XTjIO5gYlXM5w78xJfXc5eaAgK14OZvB2XXCH/KpEVgmGBsMj3BmoE0vVdR6S769zb4Xdq/fD+lIWN7kEFbvMCcUqM+zfpEfwiUXapmL/NtwjLdeh3mD74stzpD/3SVPnfhJB4XDEd5cfGjH1mN1ETidV8ZW2PBUxKsypigBsC3l5izIqf8uwUdbwXtdh/3JXSjo2hjfRyLkGQ4+F4vQjGOXnZnS4qMRjxOwZGDIOaoPhPPADnNrgb8vFcIshsBJc57KO4lfZITdQwdsa6Wc+pjiWQkU52i1xQ8qNRv3O9JmtpofpMpQWLP7wHC9q3SPFid2VDMTRUkl15AlWSQ2/Pi0N0MJt0X0z91OyAjFlNjNWuBI2k8J7D5mRdRYv6lws6RQ+rAR3r9oXcRBlQrlgbKBSMGO0QxQeQ7c1MLpqmxdfI72EE9AG/0tFmn8zl74sdFbYFIX/CT9QLJjeycNuw2+dFEIIbpk5PT/WOP/gtdXcy5om7odszSiSsEYhKQMvyCEUxRFwdAN7OeCeXE5iuviKLUSoiEMiLKk7mUoMMbux6zCe3TL3jGeMBHB6R7LI6NvtacIqQPwsxVbP65NaSJ2NBG3C7s1Yx3O1LtpFHDGMdVuGmdl3RRF 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:(13230025)(396003)(39860400002)(366004)(376002)(346002)(136003)(451199018)(36756003)(26005)(6666004)(6506007)(6512007)(1076003)(186003)(38100700002)(83380400001)(2616005)(107886003)(5660300002)(41300700001)(8676002)(66946007)(4326008)(66476007)(66556008)(8936002)(2906002)(30864003)(44832011)(478600001)(316002)(6486002)(86362001)(84970400001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Gi78L1/GgCodf+EF8J9JdVDCM1VbCe4LNKcu/0CKZnlg86PH1nTs+q5d1y+25aNQ20nSWriPBVqg5NM5zzwhBpGeWtQCle8v6vuLwm9v7+kknCjRqdz2kDW1IRPs7fkBD/6jk17e+JWAhv1iQC/tqkH7fVOpkBpetGc4CGZLdNIA64mfU8K1xchJu6UK0h1ezUKoNDdF+plyiaXhdOivJMzqh+nuguIRIX86KmEkGuhDf7EIdYsNC333BsG7kD5DvzSEYfc517iMyVoKCQ1i6yYIy9arIb0+eHvRPGIH2tQ4jPQAINtHfcHKur99nzYTvS78k6AEyGRjXYA4j04zJtBdqEZyLlaenr1nJv1UiDuYL05tVV1WDcdKeQB1/iaNt/8ujr4XlfKNVDsMowCpMcyQTic5JoN854TUdXoixHmCpwy0KJpT69XiPbcnkzP+a6nLCae9rvzeAu0JcpMJ5JOkmTpJctluJQNZRyKviAe1uJ9GN8SRNm6XGjKvcbCQmAoQJgMWx8wu0hNDH9i5slCh+pe4kHhpDkEDa5QhfFGrQUB3oL5Mow098jeCRhPxWky+vhTe+fq+WNLDGlzOarLXd8zpO/Of137MRii8erbdr3kXyTDrUMvQDdDjECVUYJIOioztnaLzJ5vRkECjkZEXR8b/klLQoWgyWmSlcu1DyWJ+1ue+WQmqJR9AKdNOuhxuEs/RDra62HOiGeAaCBWPX/IlFtgvO1MdMQ96eaw5GN8htv0TwjHIHYd1hAZZMwU8DArxqtUfg/9ZmduCH/njp4DuE4E0J7dbea9qAlqDo9G6JVVLVzmRVXO65gFFCSMntiYe5zMqUBH5sTC9Oh3ScgYzTsiu6B2aVXmApluL8RlodTimnOmSwkyb/2eUHMOPkVc5Um+WjTfjQROqBegdspRdpFgQ+5BC4pky06cRTM8n44ue7+eM9S5R154EInLLIgKZ3gswoXTRgXFB0ll2THgIxIbCSTCS6vSvMRvAbDiZPW2s7Sd6GoBjneCdzR5h9Y+wTKHvqU5eDtFaaZtlUNbHJbsyDhdgka01vyc536tVemS+mOhm2pjWzvribuQYyYHbNENPyXjt86fv8aH6y0wISA8/3ER8/7+5aaig4OnUmxKEaufRZUXzolNxFiu11kIrO9deUG/9INpVECvXzci6BRdQ9RhCV4KnuIoGPgxiHCphdPDLbsOw2ntfuoZ97eI1TT35YB013o+G3GE7S9odG7EWNCaU1yt13nTC1YritZoKcv1zMqmGIwmK9CjXww9LTO1PvQrBq8vtO9L5ns0mGrzeyPcMN8J9gEHZil8Q+KiRislADZxACYA0iO4OTJkApJ2ZV9UPt6W4DAFgmw5r1Smqp5oN8vnE7h3Yyu/qWaKLDek3uIv7WUgDiBrcLoEEzODsVBoHy18Z6XnGw/QIwE1LM+sy8zGlgYlBstjxlYZIx3u2Z2MctS4iJn/CMY1g2SlxjqbuSD2gl+N7eVyZgJMOJ0jEC6bZRXaZ2oiRimr7exCh0mbMorz1JE20zRAavyS6Y/U6N7fKWyhEqoCvRUXyitXNkWgcNs/i2Bdt7vg79VNqwioPQZVy X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: YEa7XRpXEZQ3/DA/RFs4tNPWN8NDHVFQ4WQ5CX8RKORJDSA0dCJDsMyNJsk07PjVt6nbdagICWOp4P9mjdSMIMctOtHvQkLu2rFWDhRVteKIyxapPWngXzQIq0/r/9ndVf853HtNqsmUq8A4IkOoozXw7/srVn7Vzf3CTXLO7jYndxMUFgYfkB5IjTCuEEsCv9fGNU37eYhiaOn7AUp4xDG8vWdbcYg/KNVVqxdd3FTfYL1PxsNwaJDe8wx8z18uw4TzMVOaOzKd8+uqL00+a/RQKNxHw+69Yn73bhkddAInN7n4wPybJIyUnBMJipSK8D7Vogz8tuF2Gf92bSLnFn3LEcI1zDXg9wPXVAjOqQ+ZDcoT/QMempN6Mu7yqKuzMzquMq2aOoq8hEVzHqO2utgs3lQxxS0OHs7vBfcOmf6vDUUxKtDIizBQVAPtZMzzx+nIZbIL48LlioC19Py1xTLEN8n2yjTmQll/muT8B8RSpQt9t23e31CMVmS46u/J/kqLKX+6E03n3jX9AshfVtxp8yxGKT0P28hL35qDbXnsb/RD7E9JS1yk6ypdnKBR51p+I8bZj0D9AzydyfN85VVcL+/UbGVcZCvKwKQkl6lVadz3EMb97PUJZYtCiBQWpmTBTfPQNsQ1kPumdPE0R9jAaZD6DpTU6kxMlyFu7EDvaoJO/PaeS5gXkgOd1aMBjkD4GAV+fIHGE35W0X53352aIYDM1/uiROZlr7IzhLE0mAslw5YZ1JN7YmYXrxCXqjcm+zYStAsR/+fGMMX2hZzEtlZlsqsem3v9RZvedVKVrISHdsJ18oFIWzaW0Y8HqSjQXycS+tp7XhG1nPiEdsazA5rPHjDpkJYtD9xsqbsAZEJDhdC4fFuJaJj6b1wJ X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3dba05db-0339-4cc7-e03c-08db1695e01e X-MS-Exchange-CrossTenant-AuthSource: CH2PR10MB4344.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2023 18:35:17.1458 (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: eYAWlHl741YQ9wcjsHZsqX9PraDRJZ4orqRL4J9ynkw4P3jX/lwUOdcopJSpeMpA9P6TZwpHCUB2CJMA+75laA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB5856 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.170.22 definitions=2023-02-24_14,2023-02-24_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 phishscore=0 suspectscore=0 malwarescore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2302240146 X-Proofpoint-GUID: 1XucgJf4EeIOWjk76QdLBL8HSDH7ZBy8 X-Proofpoint-ORIG-GUID: 1XucgJf4EeIOWjk76QdLBL8HSDH7ZBy8 X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP 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?1758738572194202019?= X-GMAIL-MSGID: =?utf-8?q?1758738572194202019?= GCC extension accepts the case when a struct with a C99 flexible array member is embedded into another struct or union (possibly recursively). __builtin_object_size should treat such struct as flexible size. gcc/c/ChangeLog: PR tree-optimization/101832 * c-decl.cc (finish_struct): Set TYPE_INCLUDE_FLEXARRAY for struct/union type. gcc/cp/ChangeLog: PR tree-optimization/101832 * module.cc (trees_out::core_bools): Stream out new bit type_include_flexarray. (trees_in::core_bools): Stream in new bit type_include_flexarray. gcc/ChangeLog: PR tree-optimization/101832 * print-tree.cc (print_node): Print new bit type_include_flexarray. * tree-core.h (struct tree_type_common): New bit type_include_flexarray. * tree-object-size.cc (addr_object_size): Handle structure/union type when it has flexible size. * tree-streamer-in.cc (unpack_ts_type_common_value_fields): Stream in new bit type_include_flexarray. * tree-streamer-out.cc (pack_ts_type_common_value_fields): Stream out new bit type_include_flexarray. * tree.h (TYPE_INCLUDE_FLEXARRAY): New macro TYPE_INCLUDE_FLEXARRAY. gcc/testsuite/ChangeLog: PR tree-optimization/101832 * gcc.dg/builtin-object-size-pr101832.c: New test. --- gcc/c/c-decl.cc | 12 ++ gcc/cp/module.cc | 2 + gcc/print-tree.cc | 5 + .../gcc.dg/builtin-object-size-pr101832.c | 134 ++++++++++++++++++ gcc/tree-core.h | 4 +- gcc/tree-object-size.cc | 79 +++++++---- gcc/tree-streamer-in.cc | 1 + gcc/tree-streamer-out.cc | 1 + gcc/tree.h | 6 + 9 files changed, 215 insertions(+), 29 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/builtin-object-size-pr101832.c diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 08078eadeb8..f589a2f5192 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -9284,6 +9284,18 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, /* Set DECL_NOT_FLEXARRAY flag for FIELD_DECL x. */ DECL_NOT_FLEXARRAY (x) = !is_flexible_array_member_p (is_last_field, x); + /* Set TYPE_INCLUDE_FLEXARRAY for the context of x, t + * when x is an array. */ + if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE) + TYPE_INCLUDE_FLEXARRAY (t) = flexible_array_member_type_p (TREE_TYPE (x)) ; + /* Recursively set TYPE_INCLUDE_FLEXARRAY for the context of x, t + when x is the last field. */ + else if ((TREE_CODE (TREE_TYPE (x)) == RECORD_TYPE + || TREE_CODE (TREE_TYPE (x)) == UNION_TYPE) + && TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (x)) + && is_last_field) + TYPE_INCLUDE_FLEXARRAY (t) = true; + if (DECL_NAME (x) || RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))) saw_named_field = true; diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index ac2fe66b080..c750361b704 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -5371,6 +5371,7 @@ trees_out::core_bools (tree t) WB (t->type_common.lang_flag_5); WB (t->type_common.lang_flag_6); WB (t->type_common.typeless_storage); + WB (t->type_common.type_include_flexarray); } if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) @@ -5551,6 +5552,7 @@ trees_in::core_bools (tree t) RB (t->type_common.lang_flag_5); RB (t->type_common.lang_flag_6); RB (t->type_common.typeless_storage); + RB (t->type_common.type_include_flexarray); } if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) diff --git a/gcc/print-tree.cc b/gcc/print-tree.cc index 1f3afcbbc86..efacdb7686f 100644 --- a/gcc/print-tree.cc +++ b/gcc/print-tree.cc @@ -631,6 +631,11 @@ print_node (FILE *file, const char *prefix, tree node, int indent, && TYPE_CXX_ODR_P (node)) fputs (" cxx-odr-p", file); + if ((code == RECORD_TYPE + || code == UNION_TYPE) + && TYPE_INCLUDE_FLEXARRAY (node)) + fputs (" include-flexarray", file); + /* The transparent-union flag is used for different things in different nodes. */ if ((code == UNION_TYPE || code == RECORD_TYPE) 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-core.h b/gcc/tree-core.h index acd8deea34e..705d5702b9c 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -1718,7 +1718,9 @@ struct GTY(()) tree_type_common { unsigned empty_flag : 1; unsigned indivisible_p : 1; unsigned no_named_args_stdarg_p : 1; - unsigned spare : 15; + /* TYPE_INCLUDE_FLEXARRAY flag for RECORD_TYPE and UNION_TYPE. */ + unsigned int type_include_flexarray : 1; + unsigned spare : 14; alias_set_type alias_set; tree pointer_to; diff --git a/gcc/tree-object-size.cc b/gcc/tree-object-size.cc index 9a936a91983..22b3c72ea6e 100644 --- a/gcc/tree-object-size.cc +++ b/gcc/tree-object-size.cc @@ -633,45 +633,68 @@ 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 array, a record or a union, it + will not have flexible size, compute the object size + directly. */ + if ((TREE_CODE (TREE_TYPE (v)) != ARRAY_TYPE) + && (TREE_CODE (TREE_TYPE (v)) != RECORD_TYPE) + && (TREE_CODE (TREE_TYPE (v)) != UNION_TYPE)) { v = NULL_TREE; break; } - 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))) - != UNION_TYPE - && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) - != QUAL_UNION_TYPE) - break; - else - v = TREE_OPERAND (v, 0); - if (TREE_CODE (v) == COMPONENT_REF - && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) - == RECORD_TYPE) + if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE + || TREE_CODE (TREE_TYPE (v)) == UNION_TYPE) + /* if the record or union does not include a flexible array + recursively, compute the object size directly. */ { - /* compute object size only if v is not a - flexible array member. */ - if (!is_flexible_array_mem_ref) + if (!TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (v))) { v = NULL_TREE; break; } - v = TREE_OPERAND (v, 0); + else + v = TREE_OPERAND (v, 0); } - while (v != pt_var && TREE_CODE (v) == COMPONENT_REF) - if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) - != UNION_TYPE - && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) - != QUAL_UNION_TYPE) - break; - else - v = TREE_OPERAND (v, 0); - if (v != pt_var) - v = NULL_TREE; else - v = pt_var; + { + /* Now the ref is to an 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))) + != UNION_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) + != QUAL_UNION_TYPE) + break; + else + v = TREE_OPERAND (v, 0); + if (TREE_CODE (v) == COMPONENT_REF + && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) + == RECORD_TYPE) + { + /* compute object size only if v is not a + flexible array member. */ + if (!is_flexible_array_mem_ref) + { + v = NULL_TREE; + break; + } + v = TREE_OPERAND (v, 0); + } + while (v != pt_var && TREE_CODE (v) == COMPONENT_REF) + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) + != UNION_TYPE + && TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0))) + != QUAL_UNION_TYPE) + break; + else + v = TREE_OPERAND (v, 0); + if (v != pt_var) + v = NULL_TREE; + else + v = pt_var; + } break; default: v = pt_var; diff --git a/gcc/tree-streamer-in.cc b/gcc/tree-streamer-in.cc index d4dc30f048f..c19ede0631d 100644 --- a/gcc/tree-streamer-in.cc +++ b/gcc/tree-streamer-in.cc @@ -390,6 +390,7 @@ unpack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) TYPE_TRANSPARENT_AGGR (expr) = (unsigned) bp_unpack_value (bp, 1); TYPE_FINAL_P (expr) = (unsigned) bp_unpack_value (bp, 1); TYPE_CXX_ODR_P (expr) = (unsigned) bp_unpack_value (bp, 1); + TYPE_INCLUDE_FLEXARRAY (expr) = (unsigned) bp_unpack_value (bp, 1); } else if (TREE_CODE (expr) == ARRAY_TYPE) TYPE_NONALIASED_COMPONENT (expr) = (unsigned) bp_unpack_value (bp, 1); diff --git a/gcc/tree-streamer-out.cc b/gcc/tree-streamer-out.cc index d107229da5c..73e4b4e547c 100644 --- a/gcc/tree-streamer-out.cc +++ b/gcc/tree-streamer-out.cc @@ -357,6 +357,7 @@ pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) bp_pack_value (bp, flag_wpa && TYPE_CANONICAL (expr) ? TYPE_CXX_ODR_P (TYPE_CANONICAL (expr)) : TYPE_CXX_ODR_P (expr), 1); + bp_pack_value (bp, TYPE_INCLUDE_FLEXARRAY (expr), 1); } else if (TREE_CODE (expr) == ARRAY_TYPE) bp_pack_value (bp, TYPE_NONALIASED_COMPONENT (expr), 1); diff --git a/gcc/tree.h b/gcc/tree.h index 92ac0e6a214..ab1cdc3dc85 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -778,6 +778,12 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, #define TYPE_NO_NAMED_ARGS_STDARG_P(NODE) \ (TYPE_CHECK (NODE)->type_common.no_named_args_stdarg_p) +/* True if this RECORD_TYPE or UNION_TYPE includes a flexible array member + at the last field recursively. */ +#define TYPE_INCLUDE_FLEXARRAY(NODE) \ + (TYPE_CHECK (NODE)->type_common.type_include_flexarray) + + /* In an IDENTIFIER_NODE, this means that assemble_name was called with this string as an argument. */ #define TREE_SYMBOL_REFERENCED(NODE) \ From patchwork Fri Feb 24 18:35:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qing Zhao X-Patchwork-Id: 61414 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp1075624wrd; Fri, 24 Feb 2023 10:36:57 -0800 (PST) X-Google-Smtp-Source: AK7set8k55tOTejshPJfYUHdPCGbr+tfrlExJpNq6JQL/mN8ZHfTEbw7T10QkeSk9TlXtTMWuLwW X-Received: by 2002:a17:906:9692:b0:885:a62c:5a5c with SMTP id w18-20020a170906969200b00885a62c5a5cmr16964395ejx.46.1677263817070; Fri, 24 Feb 2023 10:36:57 -0800 (PST) Received: from sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id fr22-20020a170906891600b008dc4b2079f5si6731273ejc.398.2023.02.24.10.36.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Feb 2023 10:36:57 -0800 (PST) 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="BQK1TT/H"; 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 23485384DD27 for ; Fri, 24 Feb 2023 18:36:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 23485384DD27 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677263778; bh=exjmrdkb75D3MPmpyV4rZPVI4B9athxBtCJP8SkDdks=; 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=BQK1TT/Hlpb2R8yYw4CqKFRvoHzzuE/xFaDAMjvDjzXh6VXql6RWinss+zSeI46UQ Irri+BIJjEYU8ZS2P/MhMLXpevTNVtYv5nXyBWXx3ejBSp7IsPYAyNxMzCuTQ/+4Zr kBbhbMdh61St7+r4Ky+U8EhIX4kGYkQfHwf6kz3g= 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 A3CD9385B53C for ; Fri, 24 Feb 2023 18:35:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A3CD9385B53C Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 31OHiJs8020513; Fri, 24 Feb 2023 18:35:28 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 3ntpjadqck-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 24 Feb 2023 18:35:28 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.5/8.17.1.5) with ESMTP id 31OHVAph031608; Fri, 24 Feb 2023 18:35:27 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2041.outbound.protection.outlook.com [104.47.66.41]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3ntn49yfbw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 24 Feb 2023 18:35:27 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kQZZZz8sh2E1ak3hDwhDvyEnQ8V3hTxKYXGOnkw4/5Z8qrCmCIBBwjTZpBD9Elxk6e55/bgrP3JVG2frt4fYct9POBnf08Y5hkkw5VHPlC10RZ3TgcoYed3c0YdE1wUlbkCB/DKsKmKVDrxjKGZ9VN6ZR3SQrSUMTWC64Q7Ez/oh/VqXogKTuRNLRs7wRepW7+FYr+WlYxaaZ8NBcAzDJgljYyxczPzP35+uWVPP6R7YpbAxPLfqpceMr/CawFyGB13YVuogaSe0nXBMXFF2YjBfwXL6B08luIUPTge7fkPevsyYBPVOqFLuRnWolf/45P7au4BUf2fVaYHZ4PbhQw== 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=exjmrdkb75D3MPmpyV4rZPVI4B9athxBtCJP8SkDdks=; b=cJ4NrdaOW8NQCUrN10/T4zBR7Z8Q/edxXu2wSZln9BqtJkM9aJpXdVjJXSIE22joAiPa0xLmT0DjjXHYzvZ7G+4w+gsYPLRdoquUUzH69EK6MlhsOfHP5NbWS6PKEu7MX9X8z9wmE34kGE+kyGjizBMN7L/gZYyHQz9PsMDVxVy9butoyO6jP4r9BJT6ErIY/7wNVCxMYvu30h1D/HXYg6HOdRbNrjVgYXdSgcQyzlhyV9XI4mN3k2B485mFgifWqzo2Y02s/8lPeZgklUaIrNYKOM+EakHCQ3Bn9HsvAxYfJu0AzyULtBShX9XsRn9G8sn2WGE4aHUNm+4kNI0qnQ== 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 SN7PR10MB7004.namprd10.prod.outlook.com (2603:10b6:806:328::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6156.11; Fri, 24 Feb 2023 18:35:24 +0000 Received: from CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::7030:ed2e:20d0:cd5b]) by CH2PR10MB4344.namprd10.prod.outlook.com ([fe80::7030:ed2e:20d0:cd5b%7]) with mapi id 15.20.6156.007; Fri, 24 Feb 2023 18:35:24 +0000 To: joseph@codesourcery.com, rguenther@suse.de Cc: siddhesh@gotplt.org, keescook@chromium.org, gcc-patches@gcc.gnu.org, Qing Zhao Subject: [V4][PATCH 2/2] Update documentation to clarify a GCC extension Date: Fri, 24 Feb 2023 18:35:05 +0000 Message-Id: <20230224183505.4112295-3-qing.zhao@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20230224183505.4112295-1-qing.zhao@oracle.com> References: <20230224183505.4112295-1-qing.zhao@oracle.com> X-ClientProxiedBy: AS4P191CA0030.EURP191.PROD.OUTLOOK.COM (2603:10a6:20b:5d9::16) To CH2PR10MB4344.namprd10.prod.outlook.com (2603:10b6:610:af::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH2PR10MB4344:EE_|SN7PR10MB7004:EE_ X-MS-Office365-Filtering-Correlation-Id: 2db99ddb-0504-4817-b4cb-08db1695e46f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3h2WyvSv1hTrp1+Z1FL/g2Oz5/75nh9diDxmypR6Cb1oKLIXbthLeM+BfP5Ak5iMs/KPqJbDf/YHXjkI8pmHORm9Z2MGfxl05SsPKwAuLM87hA0AB1ua+Y+O75lSjjmkMya+23OPKfzY8xbLLGM5Fi3SysgrVW4iwttyGzQ//frVtdDnZFBZIOG2PD1NsyGk6AcPboI8NPUdoUkTDYa+EDSxxW9CPZHwD713qG28LKd7LatEOgrtLz5Hz1nGIB7IX6cg8Wm1PyK/5Mi5zq+KnKxix8EIUJthJEI5wn5G67az2fjV+fYFSq6qaqiIxo3zPJK8SS/kPuVVqszEa14I22VbmHhW4XiRsM1y2lncl8gLQldPcf8JSK5YEQ4xmMHjFF5OWDQnwI20nYXNrzwTpPR77C0CzCHE+arLxxi7DugrhHlxabC2xmwK0ui20i9wRrhr/TZ59tqOS+CBQnrHMlbcWM2iWuLVTXKSt2NmGAatG72F+2ggrZd7sfdDXgIKppqtlb37Hhf7FFmge5UZ01jATMopOJkETvmDCxeD0raiow5JIsjeoEMWGzb4sTDQ7D8lnKb6gCGUXzDBRZTylqTyOhNBAeOc8Bhk2SC2u5uZdx7a1j5Su+cCNGTemb2E 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:(13230025)(136003)(366004)(346002)(39860400002)(396003)(376002)(451199018)(86362001)(107886003)(478600001)(6486002)(6666004)(2616005)(1076003)(186003)(6506007)(26005)(6512007)(36756003)(83380400001)(38100700002)(41300700001)(66476007)(2906002)(4326008)(66556008)(66946007)(8676002)(5660300002)(44832011)(8936002)(84970400001)(316002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 41k0df6XB6us2fuRH85d0ywj8cUn8W5gTP365d44AMlj+k/dAIzJAMbqKO1YlQD2O448+EntCtAKgz6nMlVDTmRRYYfxmcIWJ5k/lvzeaSRG3h8YPWgwQ9DUmLofbzefuSLvJRJq9Ydl2V4SGYBHS5yImfVhKxXQbX+P+l1GzHesLhPOnnIY6xaGG1gKnaiNJMa56DOFZdhmCNcmQ0W+nAbYAK3t8SeHfNgu8IpNPdsI0Wh08Pf8Lws1kQutewWpdPtJTy1nw3nJLPmRETSadG3iOJuV90W75KvsoNjBdIDxslYze4cF+fxuK6WyW/C72DBD4c9rn9jgG1PnDEepaULIuRS3iw+FQIgWJfmaAWkahKTTXoy+/U4JiuXDEuZzMl5OIg+ly46xio79NS2wfwLiiEkc2G006PAy+xVRTg7qEXP4DBO9fKF997GZUIe9tuCoOKbzD7EBbwSxwqM8edQ8OuteCFk08eo+PYvKfa8nbqiK3tIrzPEFtgiZxFqgM4pCx6WWVrlaCKRGiVBf7HQC3Nh0uiCx/7Dav4PBVqQqk/le8cbS0z4JsnQT+5Oev/MQvxjwpJ/T+fcPBoPk+JSgJqzhWG9E8epk3z5VgGIaVKIIgj220+sjNXBeKC1hZuMhPRyAOv5+WgseT4jExR7ukqvt3jhYQuzNRhF4UNC45ZBYcBHD8B9qnxCO4wllyYL+0wkaio1C1M/vQNS/ALtNrzDF3WaFwDQg68WoMmPa9/z58MrnrT/9P0o053WKi5KJNZoD4Cb2Ats2jwGVxjxIZGld8o+IxrDZx2ZhyxF15Es0A6k6jFBegYHAYylCt+0g64K35ZWf3/T7JEkhS7mwh3TSV1dTvW08dcxtLBVEXB5QnVw17PNn62WskpCO7ok77FBH7/qhN6oNLB/Htokftp32rjY97kg+/buLE8Yf2spxHCBN6mFaQXlLPVZtxZq5UhFodjz5O2+ods/MzgKCVdea93vHDbmWCTCDg1whQib0+OU46IL8T5ANKI/qiafh+QkJs5Jgs+WiMqvaFJKA4xlP3abuQ4dIm3FBJf+3qBr+vrfplvdMz03gDySd2a55cER2JWvpcAUj4R0aKcMD7Cxmj+InPltvm3deJO5nOVTWyAZwpjPPl5TsTt91i/7RqwEH7fX32XH6IUzQQ0NaYoWO4qK/brmDYMJAYj+OlDMlaEEePB5583GDLwvY7Zxqd7nPSWLDGuiStjxqYYNuRsA4vdFLfeL1ngMkGA7q/Wfmu/DAyivQj/UtQS2zSo+mp7lWxEKimsgHampIldnZ1CZr5cPD8s6uqMj1o3PNNOEleop4FvgdUNAohC8wQ0iGWeuPqUzXjYdFNN58i8eEJlbn4ZqIFAhKjFF4RxXzVQApHDBcDI7y0L4F1c++4tVtHG+LeHTL6r+I02RrWLdj5/pMgrPoS8bdkJbi1MQZwJh0mngIU2FGAl1dYqQoOM6EM9yOSrtgEv04rTN7WYH3e7ZHjwHd8qWUY15EA2oJYskQbqJNIRsJraVwvd/2GeajgQMDlJANRIUV+vFir76gKSWYROLWwK3UlGUNebDhEA7Dm6grsldSGg6gKoLm X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Re9O1M7mzI6wyaExnTtd8FTCCJdraW9JJS0vaBmrp1TFeSBvZw7MxBYybZi9C6WrnxH4ESMmskDwtqCqR19D7uXFoLgfRXxweJV7dDyVjAar6/YMskGWKd4aTdLDzz4lTzIEH/r1ROSr8jhp+r6l5y+r9KsDZNfiMcedPdmsefwnEPM1bSxRohH8/illM5Q1bH3AFfSPqH0NgolUxuJC5ei7sJtlsN2HUZT4O8Z09omHyDRrvi2R2cZIXlMDSs1glCBU/HVM/9iEbYxyaQ6onGeKoOJ4tfmHKue8/Sm8yGKFKuXvI8OntDDHTmlTtJRaiZUIWbM7bZF4ShQBDu5X5moTgBB70OntyAumJENURtDDgaqaYFeYROr6VdrBkEn4F1Xj0jBBsVnV7SajJh+sNZ7gRgui//NKr04i4JN4ojiCaiOidxvx155ko7l7M1rHmfqEs1YF/tVJwQcDIGlkwGOH/cOYTel9HxiWeXDOcEfL92S/dqUTtLLSU34aHX2G3UtpYbhKHXcYQY/WkSC7vHxPnX2GFYHHSlsb499Bd7zo3AhSogAxEhsJcNJ8LMrhDmECWI9BQYuS00z7R3VLqJc4ajWPyBW4uu+VBbBCOuAkBtEBUQpsKsPvozuPw6Z4U4AORlHZm9l3/bhVgzOnKNe7s33FwwKzBT7sfaqmcile0xwunmfmX3tx9sErtJqJ/66QUFeqMz9HMl01P1UB0Qx9WVZMA7LPB/dP/gQLahFZMvPRJG/2PQYnCJ5trv+aN4iVUqhqvB6X1edxUSto2lkb/W9hrETWAtXyzqhf89D8FxBvKe3nkCcO5Y8cRuWTHaC5NShCfKyPp4F2OKH3fOX4y6TcJxlXYKacn/Hb86ksAhBlbvzJmsDgS/FBXZtH X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2db99ddb-0504-4817-b4cb-08db1695e46f X-MS-Exchange-CrossTenant-AuthSource: CH2PR10MB4344.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2023 18:35:24.3720 (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: f1TMcUmg4aHhAfDQsA/+djw8DudgjvS3Un+uqUuZ7CKrPDqSBSJOtcgX0/OeRjX3eyg8H2GJq2rmer8ji9F+ZQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR10MB7004 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.170.22 definitions=2023-02-24_14,2023-02-24_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 phishscore=0 malwarescore=0 mlxscore=0 spamscore=0 adultscore=0 bulkscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2302240146 X-Proofpoint-ORIG-GUID: K-krQQUDUagH5koq5shIoRrbAB0vgyos X-Proofpoint-GUID: K-krQQUDUagH5koq5shIoRrbAB0vgyos 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_H2, SPF_HELO_NONE, SPF_NONE, TXREP 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?1758738584262880673?= X-GMAIL-MSGID: =?utf-8?q?1758738584262880673?= on a structure with a C99 flexible array member being nested in another structure. "GCC extension accepts a structure containing an ISO C99 "flexible array member", or a union containing such a structure (possibly recursively) to be a member of a structure. There are two situations: * The structure with a C99 flexible array member is the last field of another structure, for example: struct flex { int length; char data[]; }; union union_flex { int others; struct flex f; }; struct out_flex_struct { int m; struct flex flex_data; }; struct out_flex_union { int n; union union_flex flex_data; }; In the above, both 'out_flex_struct.flex_data.data[]' and 'out_flex_union.flex_data.f.data[]' are considered as flexible arrays too. * The structure with a C99 flexible array member is the middle field of another structure, for example: struct flex { int length; char data[]; }; struct mid_flex { int m; struct flex flex_data; int n; }; In the above, 'mid_flex.flex_data.data[]' is allowed to be extended flexibly to the padding. E.g, up to 4 elements. However, relying on space in struct padding is a bad programming practice, compilers do not handle such extension consistently, Any code relying on this behavior should be modified to ensure that flexible array members only end up at the ends of structures. Please use warning option '-Wgnu-variable-sized-type-not-at-end' to identify all such cases in the source code and modify them. This extension will be deprecated from gcc in the next release. " gcc/c-family/ChangeLog: * c.opt: New option -Wgnu-variable-sized-type-not-at-end. gcc/c/ChangeLog: * c-decl.cc (finish_struct): Issue warnings for new option. gcc/ChangeLog: * doc/extend.texi: Document GCC extension on a structure containing a flexible array member to be a member of another structure. gcc/testsuite/ChangeLog: * gcc.dg/variable-sized-type-flex-array.c: New test. --- gcc/c-family/c.opt | 5 ++ gcc/c/c-decl.cc | 7 +++ gcc/doc/extend.texi | 48 ++++++++++++++++++- .../gcc.dg/variable-sized-type-flex-array.c | 31 ++++++++++++ 4 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 3333cddeece..660ac07f3d4 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -737,6 +737,11 @@ Wformat-truncation= C ObjC C++ LTO ObjC++ Joined RejectNegative UInteger Var(warn_format_trunc) Warning LangEnabledBy(C ObjC C++ LTO ObjC++,Wformat=, warn_format >= 1, 0) IntegerRange(0, 2) Warn about calls to snprintf and similar functions that truncate output. +Wgnu-variable-sized-type-not-at-end +C C++ Var(warn_variable_sized_type_not_at_end) Warning +Warn about structures or unions with C99 flexible array members are not +at the end of a structure. + Wif-not-aligned C ObjC C++ ObjC++ Var(warn_if_not_aligned) Init(1) Warning Warn when the field in a struct is not aligned. diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index f589a2f5192..c5b54f07965 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -9296,6 +9296,13 @@ finish_struct (location_t loc, tree t, tree fieldlist, tree attributes, && is_last_field) TYPE_INCLUDE_FLEXARRAY (t) = true; + if (warn_variable_sized_type_not_at_end + && !is_last_field + && TYPE_INCLUDE_FLEXARRAY (TREE_TYPE (x))) + warning_at (DECL_SOURCE_LOCATION (x), + OPT_Wgnu_variable_sized_type_not_at_end, + "variable sized type not at the end of a struct"); + if (DECL_NAME (x) || RECORD_OR_UNION_TYPE_P (TREE_TYPE (x))) saw_named_field = true; diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index c1122916255..e278148c332 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -1748,7 +1748,53 @@ Flexible array members may only appear as the last member of a A structure containing a flexible array member, or a union containing such a structure (possibly recursively), may not be a member of a structure or an element of an array. (However, these uses are -permitted by GCC as extensions.) +permitted by GCC as extensions, see details below.) +@end itemize + +GCC extension accepts a structure containing an ISO C99 @dfn{flexible array +member}, or a union containing such a structure (possibly recursively) +to be a member of a structure. + +There are two situations: + +@itemize @bullet +@item +The structure with a C99 flexible array member is the last field of another +structure, for example: + +@smallexample +struct flex @{ int length; char data[]; @}; +union union_flex @{ int others; struct flex f; @}; + +struct out_flex_struct @{ int m; struct flex flex_data; @}; +struct out_flex_union @{ int n; union union_flex flex_data; @}; +@end smallexample + +In the above, both @code{out_flex_struct.flex_data.data[]} and +@code{out_flex_union.flex_data.f.data[]} are considered as flexible arrays too. + + +@item +The structure with a C99 flexible array member is the middle field of another +structure, for example: + +@smallexample +struct flex @{ int length; char data[]; @}; + +struct mid_flex @{ int m; struct flex flex_data; int n; @}; +@end smallexample + +In the above, @code{mid_flex.flex_data.data[]} is allowed to be extended +flexibly to the padding. E.g, up to 4 elements. + +However, relying on space in struct padding is a bad programming practice, +compilers do not handle such extension consistently, Any code relying on +this behavior should be modified to ensure that flexible array members +only end up at the ends of structures. + +Please use warning option @option{-Wgnu-variable-sized-type-not-at-end} to +identify all such cases in the source code and modify them. This extension +will be deprecated from gcc in the next release. @end itemize Non-empty initialization of zero-length diff --git a/gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c b/gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c new file mode 100644 index 00000000000..e3f65c5ed07 --- /dev/null +++ b/gcc/testsuite/gcc.dg/variable-sized-type-flex-array.c @@ -0,0 +1,31 @@ +/* Test for -Wgnu-variable-sized-type-not-at-end on structure/union with + C99 flexible array members being embedded into another structure. */ +/* { dg-do compile } */ +/* { dg-options "-Wgnu-variable-sized-type-not-at-end" } */ + +struct flex { int n; int data[]; }; +struct out_flex_end { int m; struct flex flex_data; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +struct out_flex_mid { struct flex flex_data; int m; }; /* { dg-warning "variable sized type not at the end of a struct" } */ +/* since the warning has been issued for out_flex_mid, no need to + issue warning again when it is included in another structure/union. */ +struct outer_flex_mid { struct out_flex_mid out_flex_data; int p; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +union flex_union_mid { int a; struct outer_flex_mid b; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ + + +struct flex0 { int n; int data[0]; }; +struct out_flex_end0 { int m; struct flex0 flex_data; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +struct out_flex_mid0 { struct flex0 flex_data; int m; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +struct outer_flex_mid0 { struct out_flex_mid0 out_flex_data; int p; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +union flex_union_mid0 { int a; struct outer_flex_mid0 b; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ + +struct flex1 { int n; int data[1]; }; +struct out_flex_end1 { int m; struct flex1 flex_data; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +struct out_flex_mid1 { struct flex1 flex_data; int m; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +struct outer_flex_mid1 { struct out_flex_mid1 out_flex_data; int p; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +union flex_union_mid1 { int a; struct outer_flex_mid1 b; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ + +struct flexn { int n; int data[8]; }; +struct out_flex_endn { int m; struct flexn flex_data; }; /* { dg-bogus "variable sized type not at the end of a struct" } */ +struct out_flex_midn { struct flexn flex_data; int m; }; /* { dg-bogus"variable sized type not at the end of a struct" } */ +struct outer_flex_midn { struct out_flex_midn out_flex_data; int p; }; /* { dg-bogus"variable sized type not at the end of a struct" } */ +union flex_union_midn { int a; struct outer_flex_midn b; }; /* { dg-bogus "variable sized type not at the end of a struct" } */