From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x531.google.com (mail-pg1-x531.google.com [IPv6:2607:f8b0:4864:20::531]) by sourceware.org (Postfix) with ESMTPS id B8E0E3858CD1 for ; Sun, 10 Mar 2024 11:52:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B8E0E3858CD1 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B8E0E3858CD1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::531 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710071572; cv=none; b=T95w6X/kCAQlUVGRFRFV0Ba8qtVqtiTm+UuCT7kC4KciRVKOUlHRtqZBKtMyIqSD1v6ThuK/TB72Hxrk4JKjzWpds+VIrcastNmdKJWbhX75VPJRDRZlyntsA9s8FZsj5YGMDZ4G+vKgN92l78B5f7R49Lfas953d2AihdoC+0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1710071572; c=relaxed/simple; bh=QzwPCJpznqKRHS/JE0Kt4CbUhDA9TNaTcJodkl+MzKU=; h=DKIM-Signature:Message-ID:Date:From:To:Subject:MIME-Version; b=E7SuH1EI4IYiZzMBMKvqJ81liZGDwBaL0vYxGhfIsgjOq60nKpsknTlNmL93P1WZDYrRqUJvtup5fACJXry7zm9KqqHygkWwa45a3dOi8ARnzL8mDG7NAGECbBUBMPBGZsviyH8lGDgx0Q0HSrMkHhqgyoTEZ8IdVG0conR2vvU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pg1-x531.google.com with SMTP id 41be03b00d2f7-5d4d15ec7c5so3059673a12.1 for ; Sun, 10 Mar 2024 04:52:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710071568; x=1710676368; darn=gcc.gnu.org; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=mpuvz/YEs3pAtWho7edIgbW5RDG46XczuxTgT6zfCEY=; b=C9sQbz4irEawqnyPaUbCtGsvSHzpOMBC1KNbJwiEnEKHXfOwBYoaXnN5ay+oRBLZTt PwTc2vQCqGa+9/uWRf1Xa1v707pM8iiTYKCaOlJIBFRDp/iwcPD1BkUElNHF92buD37l HJuJL2XnxVFYe62Jduxc06lTTKK5EJlHx+R2kprHGEBlPHwEbnpxqW0+iDeY2CEbxPUy dbGbpcLInixPY/4Qfuyo/thkHfRPlCAgtr2g48a7sbhgsrtCSI7SNSf1hYvZ+KJslZ8d ulKMoYnYZUykea7yFwVsKCH3rdSv77D8eySeOHP4Umqp8HQ3BjJoX1tJi6XIZo8EdvO+ pB/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710071568; x=1710676368; h=content-disposition:mime-version:subject:cc:to:from:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=mpuvz/YEs3pAtWho7edIgbW5RDG46XczuxTgT6zfCEY=; b=eN+rCUWyUoPY6j33G1inr89P67KVOr7fTVJsuuuB++SO//Y13BmM3VuS8s+MDDeymU VEfDnc75qv74RQjjDBIPlP0A2rgX6Iotx2EICY/ZfezyH/8aV+C8SThX23idiFlV0rJS eORDCPXJ6d35YQI5tDcb/o9pDvqIEfkQhZ/SqxdYNzCJay1tKwseEnVJgLNQ8NiiVDNd BkbtYR0jpbad/yeKa7a7S3q310gwNranm25scmF7mz+/ktXVIQQvLdLaS2Y5u1TpSjrh y9V7P5hIu2YZSfwDpZSzzrRPIunZ5LQBM8ZQhbEG6iJtdSd4BO3VD35fiBYAzR28BFes wv1A== X-Gm-Message-State: AOJu0YwBChlxlnHMhMHVBZEfoYfF36Y0K+BRYqIuoV+ynV4I+QYXuSS6 JrK3H2zFKFhj4zo7+B8rFLa1hdy5e6Xw1UzmrPBExHJwADIZQHI/6DGqlAac X-Google-Smtp-Source: AGHT+IHrzMEJcxSbuUKp3lIkvPqVovWLf5opRIvpPuoM9FCuMTS9rai4AErAU3dgiJv+0Jb+qKXSOw== X-Received: by 2002:a17:903:2282:b0:1dc:540f:c5eb with SMTP id b2-20020a170903228200b001dc540fc5ebmr4887181plh.51.1710071568423; Sun, 10 Mar 2024 04:52:48 -0700 (PDT) Received: from Thaum. (202-161-100-107.tpgi.com.au. [202.161.100.107]) by smtp.gmail.com with ESMTPSA id t2-20020a17090ae50200b0029b77fbeb7fsm5675131pjy.16.2024.03.10.04.52.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 10 Mar 2024 04:52:47 -0700 (PDT) Message-ID: <65ed9f0f.170a0220.64a2e.2144@mx.google.com> X-Google-Original-Message-ID: Date: Sun, 10 Mar 2024 22:52:42 +1100 From: Nathaniel Shead To: gcc-patches@gcc.gnu.org Cc: Jason Merrill , Nathan Sidwell , Patrick Palka Subject: [PATCH] c++/modules: Support target-specific nodes with streaming [PR111224] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE,URIBL_BLACK 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: Bootstrapped and regtested on x86_64-pc-linux-gnu and aarch64-unknown-linux-gnu, OK for trunk? It's worth noting that the AArch64 machines I had available to test with didn't have a new enough glibc to reproduce the ICEs in the PR, but this patch will be necessary (albeit possibly not sufficient) to fix it. -- >8 -- Some targets make use of POLY_INT_CSTs and other custom builtin types, which currently violate some assumptions when streaming. This patch adds support for them, specifically AArch64 SVE types like __fp16. This patch doesn't provide "full" support of AArch64 SVE, however, since for that we would need to support 'target' nodes (tracked in PR108080). PR c++/111224 gcc/cp/ChangeLog: * module.cc (enum tree_tag): Add new tag for builtin types. (trees_out::start): POLY_INT_CSTs can be emitted. (trees_in::start): Likewise. (trees_out::core_vals): Stream POLY_INT_CSTs. (trees_in::core_vals): Likewise. (trees_out::type_node): Handle target-specific builtin types, and vectors with NUM_POLY_INT_COEFFS > 1. (trees_in::tree_node): Likewise. gcc/testsuite/ChangeLog: * g++.dg/modules/pr111224_a.C: New test. * g++.dg/modules/pr111224_b.C: New test. Signed-off-by: Nathaniel Shead --- gcc/cp/module.cc | 70 +++++++++++++++++++---- gcc/testsuite/g++.dg/modules/pr111224_a.C | 17 ++++++ gcc/testsuite/g++.dg/modules/pr111224_b.C | 13 +++++ 3 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/pr111224_a.C create mode 100644 gcc/testsuite/g++.dg/modules/pr111224_b.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 99055523d91..0b5e2e67053 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -2718,6 +2718,7 @@ enum tree_tag { tt_typedef_type, /* A (possibly implicit) typedefed type. */ tt_derived_type, /* A type derived from another type. */ tt_variant_type, /* A variant of another type. */ + tt_builtin_type, /* A custom builtin type. */ tt_tinfo_var, /* Typeinfo object. */ tt_tinfo_typedef, /* Typeinfo typedef. */ @@ -2732,7 +2733,7 @@ enum tree_tag { tt_binfo, /* A BINFO. */ tt_vtable, /* A vtable. */ tt_thunk, /* A thunk. */ - tt_clone_ref, + tt_clone_ref, /* A cloned function. */ tt_entity, /* A extra-cluster entity. */ @@ -5173,7 +5174,6 @@ trees_out::start (tree t, bool code_streamed) break; case FIXED_CST: - case POLY_INT_CST: gcc_unreachable (); /* Not supported in C++. */ break; @@ -5259,7 +5259,6 @@ trees_in::start (unsigned code) case FIXED_CST: case IDENTIFIER_NODE: - case POLY_INT_CST: case SSA_NAME: case TARGET_MEM_REF: case TRANSLATION_UNIT_DECL: @@ -6106,7 +6105,10 @@ trees_out::core_vals (tree t) break; case POLY_INT_CST: - gcc_unreachable (); /* Not supported in C++. */ + if (streaming_p ()) + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) + WT (POLY_INT_CST_COEFF (t, ix)); + break; case REAL_CST: if (streaming_p ()) @@ -6615,8 +6617,9 @@ trees_in::core_vals (tree t) break; case POLY_INT_CST: - /* Not suported in C++. */ - return false; + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) + RT (POLY_INT_CST_COEFF (t, ix)); + break; case REAL_CST: if (const void *bytes = buf (sizeof (real_value))) @@ -8930,6 +8933,32 @@ trees_out::type_node (tree type) return; } + if (tree name = TYPE_NAME (type)) + if (TREE_CODE (name) == TYPE_DECL && DECL_ARTIFICIAL (name)) + { + /* Potentially a custom machine- or OS-specific builtin type. */ + bool found = false; + unsigned ix = 0; + for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t), ix++) + if (TREE_VALUE (t) == type) + { + found = true; + break; + } + if (found) + { + int type_tag = insert (type); + if (streaming_p ()) + { + i (tt_builtin_type); + u (ix); + dump (dumper::TREE) + && dump ("Wrote:%d builtin type %N", type_tag, name); + } + return; + } + } + if (streaming_p ()) { u (tt_derived_type); @@ -9068,8 +9097,8 @@ trees_out::type_node (tree type) if (streaming_p ()) { poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (type); - /* to_constant asserts that only coeff[0] is of interest. */ - wu (static_cast (nunits.to_constant ())); + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) + wu (nunits.coeffs[ix]); } break; } @@ -9630,9 +9659,11 @@ trees_in::tree_node (bool is_use) case VECTOR_TYPE: { - unsigned HOST_WIDE_INT nunits = wu (); + poly_uint64 nunits; + for (unsigned ix = 0; ix != NUM_POLY_INT_COEFFS; ix++) + nunits.coeffs[ix] = wu (); if (!get_overrun ()) - res = build_vector_type (res, static_cast (nunits)); + res = build_vector_type (res, nunits); } break; } @@ -9700,6 +9731,25 @@ trees_in::tree_node (bool is_use) } break; + case tt_builtin_type: + /* A machine- or OS-specific builtin type. */ + { + unsigned ix = u (); + res = registered_builtin_types; + for (; ix && res; res = TREE_CHAIN (res)) + ix--; + if (!res) + set_overrun (); + if (!get_overrun ()) + { + res = TREE_VALUE (res); + int type_tag = insert (res); + dump (dumper::TREE) + && dump ("Read:%d builtin type %N", type_tag, res); + } + } + break; + case tt_tinfo_var: case tt_tinfo_typedef: /* A tinfo var or typedef. */ diff --git a/gcc/testsuite/g++.dg/modules/pr111224_a.C b/gcc/testsuite/g++.dg/modules/pr111224_a.C new file mode 100644 index 00000000000..6c699053cdc --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr111224_a.C @@ -0,0 +1,17 @@ +// PR c++/111224 +// { dg-do compile { target aarch64*-*-* } } +// { dg-require-effective-target aarch64_asm_sve_ok } +// { dg-additional-options "-fmodules-ts -march=armv8.2-a+sve" } + +module; + +// We can't do a header unit of this right now because this +// uses target attributes, that we don't yet support. +// See also PR c++/108080. +#include + +export module M; + +export inline void foo(svbool_t x, svfloat16_t f) { + svabs_f16_x(x, f); +} diff --git a/gcc/testsuite/g++.dg/modules/pr111224_b.C b/gcc/testsuite/g++.dg/modules/pr111224_b.C new file mode 100644 index 00000000000..c18691dcf8a --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr111224_b.C @@ -0,0 +1,13 @@ +// PR c++/111224 +// { dg-module-do link { target aarch64*-*-* } } +// { dg-require-effective-target aarch64_asm_sve_ok } +// { dg-additional-options "-fmodules-ts -fno-module-lazy -march=armv8.2-a+sve" } + +#include +import M; + +int main() { + svbool_t x = svptrue_b8 (); + svfloat16_t f = svdup_n_f16(1.0); + foo(x, f); +} -- 2.43.2