From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by sourceware.org (Postfix) with ESMTPS id 817AF3858C5E for ; Wed, 21 Jun 2023 06:59:14 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 817AF3858C5E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1687330754; x=1718866754; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=70JNCRGJKguj2jjNQB23RxOetdvE/hqiqk72v/lTn10=; b=GlXO0vOwbXYfMV4TpgadBCSkOPlKwIti1xeBEq/V46cbv0Ek1MnbMFOi shJbBZPGsPyp6zKiN7bd5eUW1v5GWPD00KNN8curQLC77M7KzbswGxUOv 3iDB/2cLz+cfJggHKE6Rp1hJGK3B2Ad5NGQ+19e2Rz9n82rdoElcXHu1T vbcnSGBZJGpmgFcg7D557rp52pVmim9TXIsZn8GvIvdVmT9Qo31LfCzc1 wB5DSaNgz/+Ry9IxJrnul5Tv4k3U/iVkJz+lx3TM/QdBaKXythDeGXtLL ITNocs6RgvRQBXZNTiDG3YxU5Tu0OhSSTzoKJubGOJgeZVcRc6XJN5anC Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="362629280" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="362629280" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Jun 2023 23:59:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10747"; a="664544165" X-IronPort-AV: E=Sophos;i="6.00,259,1681196400"; d="scan'208";a="664544165" Received: from fmsmsx602.amr.corp.intel.com ([10.18.126.82]) by orsmga003.jf.intel.com with ESMTP; 20 Jun 2023 23:59:12 -0700 Received: from fmsmsx602.amr.corp.intel.com (10.18.126.82) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 20 Jun 2023 23:59:10 -0700 Received: from fmsedg602.ED.cps.intel.com (10.1.192.136) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Frontend Transport; Tue, 20 Jun 2023 23:59:10 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.177) by edgegateway.intel.com (192.55.55.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.23; Tue, 20 Jun 2023 23:59:10 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZAe44af+ehw8G1ECs4jKKaI7klD30euS1p1K6Opvx9fvth5ucEU2qW+5W45nB/uMZuBXojtcu8gDfPXZufX807uozQjqUWQonGOBK1D4bI8EW4j7+i6WIhW+WdhWJK7B8l8xvyigvk45OeRMlCXYVFh9QTYI+4Wiv2ggXUQ13vIr4SkK+G8O22H8o83uPg9JlomVG65JK0q6oCBEgl8o6Le3vdM/hUhylUQOhHxtYY8mRuqwVl+wTYiXPZkCa5aKuWlsqCdQDDSd5lLWu5Wb38GGX/qq+WnVfqwYIPpcf0o2+0ViwFhkP0f72uxBpMLrQNe6eZ7OyIYBAn18Z+Q4ug== 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=MLsCQ2r78GH1X8JC0ISjc4+Nm4QhlLPlZZQUtjT15kw=; b=SDqGU1/u0AISNbJzJd7C+tkOmDrEQG0vf3vEd6F8jeaqi8UuyGvkXwNHJFr6Mp+xpDs/nGRzSmTsnehPQPO87q/KQe61E4V7+nzHQOnHSFKh0pOMm3iKZSD0eMulHPw3R+OPmDGI3ozZ7SCzQZCVuDZeOV5wBurqPtzZ5RvUCmgb7afUBStLVev/7nEgQJoHTSA9wjvf6g8lCWFqdznE8pbl0O9ssN/01WtW/loYn+JnvVF8ijsK4oVMk0r4ws5rtdfxm1WwdOaOHVDKax1y6/1haLMHAp7BB5MnKp3E1voVcL7BfEhUjNeIekzPaX5Yd7GOn832HbOaMWxAQnEAww== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from MW5PR11MB5908.namprd11.prod.outlook.com (2603:10b6:303:194::10) by IA1PR11MB7173.namprd11.prod.outlook.com (2603:10b6:208:41b::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6521.23; Wed, 21 Jun 2023 06:59:08 +0000 Received: from MW5PR11MB5908.namprd11.prod.outlook.com ([fe80::127c:f4cc:e699:8f73]) by MW5PR11MB5908.namprd11.prod.outlook.com ([fe80::127c:f4cc:e699:8f73%6]) with mapi id 15.20.6521.023; Wed, 21 Jun 2023 06:59:08 +0000 From: "Li, Pan2" To: Jakub Jelinek CC: "gcc-patches@gcc.gnu.org" , "juzhe.zhong@rivai.ai" , "rdapp.gcc@gmail.com" , "jeffreyalaw@gmail.com" , "Wang, Yanzhang" , "kito.cheng@gmail.com" , "rguenther@suse.de" Subject: RE: [PATCH] RISC-V: Fix out of range memory access of machine mode table Thread-Topic: [PATCH] RISC-V: Fix out of range memory access of machine mode table Thread-Index: AQHZoo1G5H0Lv2r9XkuUWLbdvLdQGK+R2HQAgABIDhCAARQ0EIAAIaEAgABlIPCAABZlgIABA1Zw Date: Wed, 21 Jun 2023 06:59:08 +0000 Message-ID: References: <20230619080710.1536456-1-pan2.li@intel.com> <20230619090548.1574008-1-pan2.li@intel.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MW5PR11MB5908:EE_|IA1PR11MB7173:EE_ x-ms-office365-filtering-correlation-id: 2c09187e-c588-4cad-82c8-08db7225027e x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 3X4SrfUPwT+jUMi0L3a6dDcYgMiCOJKEpbiSor0e+UH3dviubkjtPOO+1p8+V4s4EsTjocXPgkC89XAd2yiAguJpEhysMBUWCp2jYg4hIbVn/l/uq4gJFwvCetQbUDKtEBMhzcCIDPpjNpe3maNzmLfAFjrvGBewcFx/S091iW++u66/4CP5Ptd64AG2lYCP9zd8xjNXL2WUE4lcI9uQYe49E4xFxV7wfEbiJ5ctVGKrRsk+bAJZwVUZlvwOPmmDBwv+xweByolKG7TSxbfJm/zI7W9ZuUjY1V7Bhsd6eO8mDJ8jf9p50E8kvwJeRZM/u0TNx73tFEr1ggJhuj24ZptEwbGlpu2q9iFaaUP15L9tvrADK7wqDtVqtdciu/3y/sztQzyLocxgxELrxtDJPcH+5a5STDQUvB3A+xD2DxxjAf4js9FhIsn4GqmS5t+tAOiiEQSFS8jcioL5SIHXSdl8RfDoFmRI68TdPSmR6tiPJQ508fLm6XAWMvOgzILU7rwSAfoaE8w/SBoiiEFc84+Ne4VM7gAbWowyEh2Wfxw9dSOBK0Wy6ql6P426kS3zj9R4bRNO54DA7rXjHQU7qUIhrgv3VuKrA61zZ+Hq/L4PgrZS52bBI60AAZjC8bD1 x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MW5PR11MB5908.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230028)(136003)(366004)(396003)(346002)(376002)(39860400002)(451199021)(8676002)(8936002)(2906002)(5660300002)(52536014)(54906003)(55016003)(316002)(41300700001)(71200400001)(6916009)(4326008)(66476007)(66556008)(76116006)(66946007)(64756008)(66446008)(33656002)(7696005)(478600001)(38100700002)(38070700005)(86362001)(122000001)(186003)(83380400001)(6506007)(9686003)(82960400001)(53546011)(26005);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?GhuRo76gd42+FscPLe4ImezXHGpN4L6PosT4ODaUzIpTy1AdCOwNcFXHEFd8?= =?us-ascii?Q?bqAqLMxDxrIbpsZ+l8t9CGglp6jjuSU2nS0/+vl+SGl1t6dw6Ma3NhSSswSE?= =?us-ascii?Q?kW567lzgI8nErJ5fMwYoOilkrXVytrySHj27jeynDJDCQWs716328u1LeJPU?= =?us-ascii?Q?n5eEoJLE1KppTb4C4nYSNMQeSvWKPj/5MUGutZnqVjD3Vvtw9pZFRXgMl3K7?= =?us-ascii?Q?YkNiFHwJcvsfIinPQRMalkxZ5skJfftehNGZWlyM/8pDg1HuExhQFbTfX554?= =?us-ascii?Q?mBaEdUXicqrRrq/uC3VMBIjvBrccXugQ7dEwBr6K1Xk6I29ZzAjkQwbD0i1r?= =?us-ascii?Q?JtCPC6xnKofi5IlTBjsbNiw4/+3hYJ6BZl7+JbhRChOeyY0Uf8aVdYhafqo/?= =?us-ascii?Q?NTcSFIhy1E7xTunwpvtn/1JaqRQ8TKevvhf3JgT+UsyPwl6xquK+6p7Lj3LK?= =?us-ascii?Q?q4l1nBL2e9+bJjfw2M5Lyu0Y2es9aR9A3TrUQahZqf0M+Lde5WejM3eRtsMg?= =?us-ascii?Q?0j+Mv7+Xbp1u6iVU+ZdpNl3qrQoJUdkzw881cvJDsi6sqSgEuguTDOX7Xjdm?= =?us-ascii?Q?9EIoFyUtLKw9f2hwBYryvqpAy4ZZpbCMrJpBPrN5OLyOreAlQZehiQPZY7Gz?= =?us-ascii?Q?pAPeIPFPl6ZN7Mp4oXZY91O/xzjyZlSNjQOYnK4VLK0sgKIfD1n+y9L2LUsw?= =?us-ascii?Q?3gQO9KaCX2HRZjb1YEkEbwvNRO/27jXxWn6N/27HAX6ydj5m9bP/FLoT710D?= =?us-ascii?Q?4BCywM3p81u4xaTwXSbYpyqmskr+0a636JKmyxQgBfNaIufpXCmBcXMrzmMA?= =?us-ascii?Q?f15OSHlCfAvFKjsGCiubVX27et0tjqPR4fOiJsvGwx/EYNecf5eECsnYF1Wo?= =?us-ascii?Q?g4Bq3MsT6INhAsD+mxXwHMAkYFKVf3UhahXLzLgHHGc8pzIwKjAMiIVMs6Q5?= =?us-ascii?Q?4FW4QT++eprDZFZog7oQ6wxScFYYWfF9eMjWU93hXObk443anN2syro53We4?= =?us-ascii?Q?PUY0rhUW+E75kvYzaXVV3b/KY6LfEFm8/fate0mMSEqp1TefNIm4OMw6jWKD?= =?us-ascii?Q?JcWWMrOt4AxESqh2ej315ynzjXA8YulGS8SUOCX3er8BbkQPZLvs5YXacbaz?= =?us-ascii?Q?L3xdDHTEsAzkDWMhmcX0wx/zu6h8YRYrcWB9NAN/H6mUscNkD6OJs9HT6qJT?= =?us-ascii?Q?vSdOLHB5OLc8RcXsYDfheKHaRXwfqbHEZnj7M4xfEwjU1rEeYjfyJvzfGaef?= =?us-ascii?Q?xGFvkrlV4+COGqfF1128HpCQB/txpLevBX5KnoAoM5tBjXA+m/yrJCXlwJLb?= =?us-ascii?Q?rKEBp6C74DK+FW9FDUfPI56p7NkT2KrOw3ODj99+av2Ui5aK97FTE8FmnLLV?= =?us-ascii?Q?ksJgRdnRlphrII+GEKP0UwhtRgJjCjQD72Ac1kXioWiEMqxD6ui8001nsZbK?= =?us-ascii?Q?nxSNSzxvPE04ZkVbvBEHCxNr6O2+GuX/XuiHQKrOEozhNUxlbY6Q1+yt43IF?= =?us-ascii?Q?p4yMcIqGl41NbRaVtDP7hXm5Pui3TXseHwqvjqU21gdt2TL5NYPZ96cYeX+B?= =?us-ascii?Q?DfSkdr6DiDlcDixES8A=3D?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MW5PR11MB5908.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2c09187e-c588-4cad-82c8-08db7225027e X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Jun 2023 06:59:08.3981 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: SbbkiiklvpZvK2PHBut8W1CsHPzZ9WOAnBbNQR7bUHxfOoOgdd6ORvpZk6smGU72J3tTVqZTxP7Tr/ufvAFY3g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR11MB7173 X-OriginatorOrg: intel.com X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_MSPIKE_H3,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 List-Id: Thanks Jakub for the useful comments, go thru the mail list and have a refi= nement version as below. But I not sure if I understand correct about addin= g new field named mode_bits in struct lto_file_decl_data, looks unnecessary= up to a point. Thanks again for your coaching with patient. diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc index 2cb83406db5..2a0720b4e6f 100644 --- a/gcc/lto-streamer-in.cc +++ b/gcc/lto-streamer-in.cc @@ -1985,8 +1985,6 @@ lto_input_mode_table (struct lto_file_decl_data *file= _data) internal_error ("cannot read LTO mode table from %s", file_data->file_name); =20 - unsigned char *table =3D ggc_cleared_vec_alloc (1 << 8); - file_data->mode_table =3D table; const struct lto_simple_header_with_strings *header =3D (const struct lto_simple_header_with_strings *) data; int string_offset; @@ -1998,16 +1996,22 @@ lto_input_mode_table (struct lto_file_decl_data *fi= le_data) header->string_size, vNULL); bitpack_d bp =3D streamer_read_bitpack (&ib); =20 + unsigned mode_bits =3D bp_unpack_value (&bp, 5); + unsigned char *table =3D ggc_cleared_vec_alloc (1 << mode= _bits); + + file_data->mode_table =3D table; + file_data->mode_bits =3D mode_bits; + table[VOIDmode] =3D VOIDmode; table[BLKmode] =3D BLKmode; unsigned int m; - while ((m =3D bp_unpack_value (&bp, 8)) !=3D VOIDmode) + while ((m =3D bp_unpack_value (&bp, mode_bits)) !=3D VOIDmode) { enum mode_class mclass =3D bp_unpack_enum (&bp, mode_class, MAX_MODE_CLASS); poly_uint16 size =3D bp_unpack_poly_value (&bp, 16); poly_uint16 prec =3D bp_unpack_poly_value (&bp, 16); - machine_mode inner =3D (machine_mode) bp_unpack_value (&bp, 8); + machine_mode inner =3D (machine_mode) bp_unpack_value (&bp, mode_bit= s); poly_uint16 nunits =3D bp_unpack_poly_value (&bp, 16); unsigned int ibit =3D 0, fbit =3D 0; unsigned int real_fmt_len =3D 0; diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc index 5ab2eb4301e..77250ee2385 100644 --- a/gcc/lto-streamer-out.cc +++ b/gcc/lto-streamer-out.cc @@ -3196,6 +3196,11 @@ lto_write_mode_table (void) if (inner_m !=3D m) streamer_mode_table[(int) inner_m] =3D 1; } + + /* Pack the mode_bits value within 5 bits (up to 31) of the beginning. = */ + unsigned mode_bits =3D ceil_log2 (MAX_MACHINE_MODE); + bp_pack_value (&bp, mode_bits, 5); + /* First stream modes that have GET_MODE_INNER (m) =3D=3D m, so that we can refer to them afterwards. */ for (int pass =3D 0; pass < 2; pass++) @@ -3205,11 +3210,11 @@ lto_write_mode_table (void) machine_mode m =3D (machine_mode) i; if ((GET_MODE_INNER (m) =3D=3D m) ^ (pass =3D=3D 0)) continue; - bp_pack_value (&bp, m, 8); + bp_pack_value (&bp, m, mode_bits); bp_pack_enum (&bp, mode_class, MAX_MODE_CLASS, GET_MODE_CLASS (m)); bp_pack_poly_value (&bp, GET_MODE_SIZE (m), 16); bp_pack_poly_value (&bp, GET_MODE_PRECISION (m), 16); - bp_pack_value (&bp, GET_MODE_INNER (m), 8); + bp_pack_value (&bp, GET_MODE_INNER (m), mode_bits); bp_pack_poly_value (&bp, GET_MODE_NUNITS (m), 16); switch (GET_MODE_CLASS (m)) { @@ -3229,7 +3234,7 @@ lto_write_mode_table (void) } bp_pack_string (ob, &bp, GET_MODE_NAME (m), true); } - bp_pack_value (&bp, VOIDmode, 8); + bp_pack_value (&bp, VOIDmode, mode_bits); =20 streamer_write_bitpack (&bp); =20 diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h index fc7133d07ba..443f0cd616e 100644 --- a/gcc/lto-streamer.h +++ b/gcc/lto-streamer.h @@ -604,6 +604,8 @@ struct GTY(()) lto_file_decl_data int order_base; =20 int unit_base; + + unsigned mode_bits; }; =20 typedef struct lto_file_decl_data *lto_file_decl_data_ptr; diff --git a/gcc/tree-streamer.cc b/gcc/tree-streamer.cc index ed65a7692e3..a28ef9c7920 100644 --- a/gcc/tree-streamer.cc +++ b/gcc/tree-streamer.cc @@ -35,7 +35,7 @@ along with GCC; see the file COPYING3. If not see During streaming in, we translate the on the disk mode using this table. For normal LTO it is set to identity, for ACCEL_COMPILER depending on the mode_table content. */ -unsigned char streamer_mode_table[1 << 8]; +unsigned char streamer_mode_table[MAX_MACHINE_MODE]; =20 /* Check that all the TS_* structures handled by the streamer_write_* and streamer_read_* routines are exactly ALL the structures defined in diff --git a/gcc/tree-streamer.h b/gcc/tree-streamer.h index 170d61cf20b..10718b03640 100644 --- a/gcc/tree-streamer.h +++ b/gcc/tree-streamer.h @@ -75,7 +75,7 @@ void streamer_write_tree_body (struct output_block *, tre= e); void streamer_write_integer_cst (struct output_block *, tree); =20 /* In tree-streamer.cc. */ -extern unsigned char streamer_mode_table[1 << 8]; +extern unsigned char streamer_mode_table[MAX_MACHINE_MODE]; void streamer_check_handled_ts_structures (void); bool streamer_tree_cache_insert (struct streamer_tree_cache_d *, tree, hashval_t, unsigned *); @@ -108,15 +108,19 @@ inline void bp_pack_machine_mode (struct bitpack_d *bp, machine_mode mode) { streamer_mode_table[mode] =3D 1; - bp_pack_enum (bp, machine_mode, 1 << 8, mode); + int last =3D 1 << ceil_log2 (MAX_MACHINE_MODE); + + bp_pack_enum (bp, machine_mode, last, mode); } =20 inline machine_mode bp_unpack_machine_mode (struct bitpack_d *bp) { - return (machine_mode) - ((class lto_input_block *) - bp->stream)->mode_table[bp_unpack_enum (bp, machine_mode, 1 << 8)]; + int last =3D 1 << ceil_log2 (MAX_MACHINE_MODE); + lto_input_block *input_block =3D (class lto_input_block *) bp->stream; + int index =3D bp_unpack_enum (bp, machine_mode, last); + + return (machine_mode) input_block->mode_table[index]; } =20 #endif /* GCC_TREE_STREAMER_H */ Pan -----Original Message----- From: Jakub Jelinek =20 Sent: Tuesday, June 20, 2023 11:26 PM To: Li, Pan2 Cc: gcc-patches@gcc.gnu.org; juzhe.zhong@rivai.ai; rdapp.gcc@gmail.com; jef= freyalaw@gmail.com; Wang, Yanzhang ; kito.cheng@gm= ail.com; rguenther@suse.de Subject: Re: [PATCH] RISC-V: Fix out of range memory access of machine mode= table On Tue, Jun 20, 2023 at 02:08:07PM +0000, Li, Pan2 via Gcc-patches wrote: > Thanks Jakub for the explanation, I have a try like below patch but I am = not quite sure it is expected, and where should I put the assertion. >=20 > > If yes, it needs to > > be unsigned short, if not, we should add an assertion (e.g. on streamin= g > > in the LTO table) that MAX_MACHINE_MODE <=3D 256. >=20 > diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc > index 2cb83406db5..93ef97ec5d3 100644 > --- a/gcc/lto-streamer-in.cc > +++ b/gcc/lto-streamer-in.cc > @@ -1985,8 +1985,6 @@ lto_input_mode_table (struct lto_file_decl_data *fi= le_data) > internal_error ("cannot read LTO mode table from %s", > file_data->file_name); > =20 > - unsigned char *table =3D ggc_cleared_vec_alloc (1 << 8)= ; > - file_data->mode_table =3D table; > const struct lto_simple_header_with_strings *header > =3D (const struct lto_simple_header_with_strings *) data; > int string_offset; > @@ -1994,6 +1992,9 @@ lto_input_mode_table (struct lto_file_decl_data *fi= le_data) > string_offset =3D sizeof (*header) + header->main_size; > =20 > lto_input_block ib (data + sizeof (*header), header->main_size, NULL); > + unsigned char *table =3D ggc_cleared_vec_alloc ( > + 1 << ib.mode_bits); > + file_data->mode_table =3D table; > data_in =3D lto_data_in_create (file_data, data + string_offset, > header->string_size, vNULL); > bitpack_d bp =3D streamer_read_bitpack (&ib); Your ib.mode_bits is again the same ceil_log2 (MAX_MACHINE_MODE) value. You need to stream that value out in lto-streamer-out.cc as perhaps the first thing in the bitpack and stream it back here, so some mode_bits =3D bp_unpack_value (&bp, 5); or so (perhaps 4 would be enough if we only support up to 15 bits for mode)= . I.e. tell the offloading compiler what value had the host compiler when streaming LTO out. Then move those 3 lines from the above after that. I'd put it next to mode_table, so file_data->mode_bits. The=20 unsigned char *table =3D ggc_cleared_vec_alloc ( 1 << ib.mode_bits); formatting is wrong, ( shouldn't if at all possible be the last character on a line. In this case, > --- a/gcc/lto-streamer.h > +++ b/gcc/lto-streamer.h > @@ -352,6 +352,8 @@ public: > =20 > const char *data; > const unsigned char *mode_table; > + /* Indicates how many bits of one machine mode will have. */ > + const unsigned int mode_bits =3D ceil_log2 (MAX_MACHINE_MODE) ; As I said earlier, I'd put it elsewhere. The formatting is wrong (no space before semicolon) and please don't add NSDMIs in structures which don't have them already. > inline machine_mode > bp_unpack_machine_mode (struct bitpack_d *bp) > { > - return (machine_mode) > - ((class lto_input_block *) > - bp->stream)->mode_table[bp_unpack_enum (bp, machine_mode, 1 << 8)]; > + lto_input_block *input_block =3D (class lto_input_block *)bp->stream; Wrong formatting again, there shouldn't be two consecutive spaces in there.= On the other hand, there should be a space between *) and bp. > + int index =3D bp_unpack_enum (bp, machine_mode, input_block->mode_bits= ); > + > + return (machine_mode)input_block->mode_table[index]; And here similarly. Jakub