"Kewen.Lin" <li...@linux.ibm.com> writes: > Hi, > > In the recent discussion on how to make some built-in type only valid for > some target features efficiently[1], Andrew mentioned this patch which he > made previously (Thanks!). I confirmed it can help rs6000 related issue, > and noticed PR99657 is still opened, so I think we still want this to > be reviewed.
But does it work for things like: void f(foo_t *x, foo_t *y) { *x = *y; } where no variables are being created with foo_t type? That's not to say we shouldn't have the patch. I'm just not sure it can be the complete solution. Thanks, Richard > > Could some C/C++ FE experts help to review it? > > Thanks in advance! > > BR, > Kewen > > [1] https://gcc.gnu.org/pipermail/gcc/2022-December/240220.html > > on 2021/11/9 18:09, apinski--- via Gcc-patches wrote: >> From: Andrew Pinski <apin...@marvell.com> >> >> This fixes fully where SVE types were being used without sve being enabled. >> Instead of trying to fix it such that we error out during RTL time, it is >> better to error out in front-ends. This expands verify_type_context to >> have a context of auto storage decl which is used for both auto storage >> decls and for indirection context. >> >> A few testcases needed to be updated for the new error message; they were >> already being rejected before hand. >> >> OK? Bootstrapped and tested on aarch64-linux-gnu with no regressions. >> >> PR target/99657 >> gcc/c/ChangeLog: >> >> * c-decl.c (finish_decl): Call verify_type_context >> for all decls and not just global_decls. >> * c-typeck.c (build_indirect_ref): Call verify_type_context >> to check to see if the type is ok to be used. >> >> gcc/ChangeLog: >> >> * config/aarch64/aarch64-sve-builtins.cc (verify_type_context): >> Add TXTC_AUTO_STORAGE support >> * target.h (enum type_context_kind): Add TXTC_AUTO_STORAGE. >> >> gcc/cp/ChangeLog: >> >> * decl.c (cp_finish_decl): Call verify_type_context >> for all decls and not just global_decls. >> * typeck.c (cp_build_indirect_ref_1): Call verify_type_context >> to check to see if the type is ok to be used. >> >> gcc/testsuite/ChangeLog: >> >> * gcc.target/aarch64/sve/acle/general/nosve_1.c: Update test. >> * gcc.target/aarch64/sve/acle/general/nosve_4.c: Likewise. >> * gcc.target/aarch64/sve/acle/general/nosve_5.c: Likewise. >> * gcc.target/aarch64/sve/acle/general/nosve_6.c: Likewise. >> * gcc.target/aarch64/sve/pcs/nosve_2.c: Likewise. >> * gcc.target/aarch64/sve/pcs/nosve_3.c: Likewise. >> * gcc.target/aarch64/sve/pcs/nosve_4.c: Likewise. >> * gcc.target/aarch64/sve/pcs/nosve_5.c: Likewise. >> * gcc.target/aarch64/sve/pcs/nosve_6.c: Likewise. >> * gcc.target/aarch64/sve/pcs/nosve_9.c: New test. >> --- >> gcc/c/c-decl.c | 14 +++++++------- >> gcc/c/c-typeck.c | 2 ++ >> gcc/config/aarch64/aarch64-sve-builtins.cc | 14 ++++++++++++++ >> gcc/cp/decl.c | 10 ++++++---- >> gcc/cp/typeck.c | 4 ++++ >> gcc/target.h | 3 +++ >> .../gcc.target/aarch64/sve/acle/general/nosve_1.c | 1 + >> .../gcc.target/aarch64/sve/acle/general/nosve_4.c | 2 +- >> .../gcc.target/aarch64/sve/acle/general/nosve_5.c | 2 +- >> .../gcc.target/aarch64/sve/acle/general/nosve_6.c | 1 + >> .../gcc.target/aarch64/sve/pcs/nosve_2.c | 2 +- >> .../gcc.target/aarch64/sve/pcs/nosve_3.c | 2 +- >> .../gcc.target/aarch64/sve/pcs/nosve_4.c | 3 +-- >> .../gcc.target/aarch64/sve/pcs/nosve_5.c | 3 +-- >> .../gcc.target/aarch64/sve/pcs/nosve_6.c | 3 +-- >> .../gcc.target/aarch64/sve/pcs/nosve_9.c | 15 +++++++++++++++ >> 16 files changed, 60 insertions(+), 21 deletions(-) >> create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_9.c >> >> diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c >> index 186fa1692c1..b3583622475 100644 >> --- a/gcc/c/c-decl.c >> +++ b/gcc/c/c-decl.c >> @@ -5441,19 +5441,19 @@ finish_decl (tree decl, location_t init_loc, tree >> init, >> >> if (VAR_P (decl)) >> { >> + type_context_kind context = TCTX_AUTO_STORAGE; >> if (init && TREE_CODE (init) == CONSTRUCTOR) >> add_flexible_array_elts_to_size (decl, init); >> >> complete_flexible_array_elts (DECL_INITIAL (decl)); >> >> if (is_global_var (decl)) >> - { >> - type_context_kind context = (DECL_THREAD_LOCAL_P (decl) >> - ? TCTX_THREAD_STORAGE >> - : TCTX_STATIC_STORAGE); >> - if (!verify_type_context (input_location, context, TREE_TYPE (decl))) >> - TREE_TYPE (decl) = error_mark_node; >> - } >> + context = (DECL_THREAD_LOCAL_P (decl) >> + ? TCTX_THREAD_STORAGE >> + : TCTX_STATIC_STORAGE); >> + >> + if (!verify_type_context (input_location, context, TREE_TYPE (decl))) >> + TREE_TYPE (decl) = error_mark_node; >> >> if (DECL_SIZE (decl) == NULL_TREE && TREE_TYPE (decl) != >> error_mark_node >> && COMPLETE_TYPE_P (TREE_TYPE (decl))) >> diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c >> index 782414f8c8c..e926b7c1964 100644 >> --- a/gcc/c/c-typeck.c >> +++ b/gcc/c/c-typeck.c >> @@ -2630,6 +2630,8 @@ build_indirect_ref (location_t loc, tree ptr, >> ref_operator errstring) >> else >> { >> tree t = TREE_TYPE (type); >> + if (!verify_type_context (loc, TCTX_AUTO_STORAGE, t)) >> + return error_mark_node; >> >> ref = build1 (INDIRECT_REF, t, pointer); >> >> diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc >> b/gcc/config/aarch64/aarch64-sve-builtins.cc >> index bc92213665c..1d5083bf9fa 100644 >> --- a/gcc/config/aarch64/aarch64-sve-builtins.cc >> +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc >> @@ -3834,11 +3834,25 @@ bool >> verify_type_context (location_t loc, type_context_kind context, >> const_tree type, bool silent_p) >> { >> + static bool informed = false; >> if (!sizeless_type_p (type)) >> return true; >> >> switch (context) >> { >> + case TCTX_AUTO_STORAGE: >> + if (TARGET_SVE) >> + return true; >> + if (!silent_p && !informed) >> + { >> + informed = true; >> + error_at (loc, "SVE type %qT used without SVE ISA enabled", type); >> + inform (loc, "you can enable SVE using the command-line" >> + " option %<-march%>, or by using the %<target%>" >> + " attribute or pragma"); >> + } >> + return false; >> + >> case TCTX_SIZEOF: >> case TCTX_STATIC_STORAGE: >> if (!silent_p) >> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c >> index 947bbfc6637..1ffd11acae0 100644 >> --- a/gcc/cp/decl.c >> +++ b/gcc/cp/decl.c >> @@ -7975,11 +7975,13 @@ cp_finish_decl (tree decl, tree init, bool >> init_const_expr_p, >> && DECL_INITIALIZED_IN_CLASS_P (decl)) >> check_static_variable_definition (decl, type); >> >> - if (!processing_template_decl && VAR_P (decl) && is_global_var (decl)) >> + if (!processing_template_decl && VAR_P (decl)) >> { >> - type_context_kind context = (DECL_THREAD_LOCAL_P (decl) >> - ? TCTX_THREAD_STORAGE >> - : TCTX_STATIC_STORAGE); >> + type_context_kind context = TCTX_AUTO_STORAGE; >> + if (is_global_var (decl)) >> + context = (DECL_THREAD_LOCAL_P (decl) >> + ? TCTX_THREAD_STORAGE >> + : TCTX_STATIC_STORAGE); >> verify_type_context (input_location, context, TREE_TYPE (decl)); >> } >> >> diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c >> index cb20329ceb5..61122e160a9 100644 >> --- a/gcc/cp/typeck.c >> +++ b/gcc/cp/typeck.c >> @@ -3608,6 +3608,10 @@ cp_build_indirect_ref_1 (location_t loc, tree ptr, >> ref_operator errorstring, >> return TREE_OPERAND (pointer, 0); >> else >> { >> + if (!verify_type_context (loc, TCTX_AUTO_STORAGE, t, >> + !(complain & tf_error))) >> + return error_mark_node; >> + >> tree ref = build1 (INDIRECT_REF, t, pointer); >> >> /* We *must* set TREE_READONLY when dereferencing a pointer to const, >> diff --git a/gcc/target.h b/gcc/target.h >> index d8f45fb99c3..2570b775c5e 100644 >> --- a/gcc/target.h >> +++ b/gcc/target.h >> @@ -217,6 +217,9 @@ const unsigned int VECT_COMPARE_COSTS = 1U << 0; >> /* The contexts in which the use of a type T can be checked by >> TARGET_VERIFY_TYPE_CONTEXT. */ >> enum type_context_kind { >> + /* Creeating objects of type T with auto storage duration. */ >> + TCTX_AUTO_STORAGE, >> + >> /* Directly measuring the size of T. */ >> TCTX_SIZEOF, >> >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_1.c >> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_1.c >> index 09dfacd222d..3ea786fe4b3 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_1.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_1.c >> @@ -7,6 +7,7 @@ f (svbool_t *x, svint8_t *y) >> { >> *x = svptrue_b8 (); /* { dg-error {ACLE function '(svbool_t >> svptrue_b8\(\)|svptrue_b8)' requires ISA extension 'sve'} } */ >> /* { dg-message {note: you can enable 'sve' using the command-line option >> '-march', or by using the 'target' attribute or pragma} "" { target *-*-* } >> .-1 } */ >> + /* { dg-error "SVE type 'svbool_t' {aka '__SVBool_t'} used without SVE >> ISA enabled" "indirect" {target *-*-* } .-2 } */ >> *x = svptrue_b8 (); >> *x = svptrue_b8 (); >> *x = svptrue_b8 (); >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_4.c >> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_4.c >> index 35ab07f1b49..6aef1a77f14 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_4.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_4.c >> @@ -3,6 +3,6 @@ >> void >> f (__SVBool_t *x, __SVBool_t *y) >> { >> - *x = *y; /* { dg-error {this operation requires the SVE ISA extension} } >> */ >> + *x = *y; /* { dg-error {SVE type '__SVBool_t' used without SVE ISA >> enabled} } */ >> *x = *y; >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_5.c >> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_5.c >> index 6e8d951b294..33e2069fcb0 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_5.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_5.c >> @@ -3,6 +3,6 @@ >> void >> f (__SVInt8_t *x, __SVInt8_t *y) >> { >> - *x = *y; /* { dg-error {this operation requires the SVE ISA extension} } >> */ >> + *x = *y; /* { dg-error {SVE type '__SVInt8_t' used without SVE ISA >> enabled} } */ >> *x = *y; >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_6.c >> b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_6.c >> index d91ba40de14..7dc10528a17 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_6.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/nosve_6.c >> @@ -8,5 +8,6 @@ void >> f (svbool_t *x, svint8_t *y) >> { >> *x = svptrue_b8 (); /* { dg-error {ACLE function '(svbool_t >> svptrue_b8\(\)|svptrue_b8)' is incompatible with the use of >> '-mgeneral-regs-only'} } */ >> + /* { dg-error {SVE type 'svbool_t' {aka '__SVBool_t'} used without SVE >> ISA enabled} "" { target *-*-* } .-1 } */ >> *y = svadd_m (*x, *y, 1); >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_2.c >> b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_2.c >> index 663165f892d..0f1bad1734e 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_2.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_2.c >> @@ -10,5 +10,5 @@ svbool_t return_bool (); >> void >> f (svbool_t *ptr) >> { >> - *ptr = return_bool (); /* { dg-error {'return_bool' requires the SVE ISA >> extension} } */ >> + *ptr = return_bool (); /* { dg-error {SVE type 'svbool_t' used without >> SVE ISA enabled} } */ >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_3.c >> b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_3.c >> index 6d5823cfde1..2f9ebd827a7 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_3.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_3.c >> @@ -10,5 +10,5 @@ svbool_t (*return_bool) (); >> void >> f (svbool_t *ptr) >> { >> - *ptr = return_bool (); /* { dg-error {calls to functions of type >> 'svbool_t\(\)' require the SVE ISA extension} } */ >> + *ptr = return_bool (); /* { dg-error {SVE type 'svbool_t' used without >> SVE ISA enabled} } */ >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c >> b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c >> index a248bdbdbd9..979f98c11c8 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_4.c >> @@ -10,6 +10,5 @@ void take_svuint8 (svuint8_t); >> void >> f (svuint8_t *ptr) >> { >> - take_svuint8 (*ptr); /* { dg-error {this operation requires the SVE ISA >> extension} } */ >> - /* { dg-error {'take_svuint8' requires the SVE ISA extension} "" { target >> *-*-* } .-1 } */ >> + take_svuint8 (*ptr); /* { dg-error {SVE type 'svuint8_t' used without SVE >> ISA enabled} } */ >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c >> b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c >> index 6263b5acdec..990e28aae70 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_5.c >> @@ -11,6 +11,5 @@ void take_svuint8_eventually (float, float, float, float, >> void >> f (svuint8_t *ptr) >> { >> - take_svuint8_eventually (0, 0, 0, 0, 0, 0, 0, 0, *ptr); /* { dg-error >> {this operation requires the SVE ISA extension} } */ >> - /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the >> SVE ISA extension} "" { target *-*-* } .-1 } */ >> + take_svuint8_eventually (0, 0, 0, 0, 0, 0, 0, 0, *ptr); /* { dg-error >> {SVE type 'svuint8_t' used without SVE ISA enabled} } */ >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c >> b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c >> index 85b68bb3881..f11de7017a2 100644 >> --- a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_6.c >> @@ -10,6 +10,5 @@ void unprototyped (); >> void >> f (svuint8_t *ptr) >> { >> - unprototyped (*ptr); /* { dg-error {this operation requires the SVE ISA >> extension} } */ >> - /* { dg-error {arguments of type '(svuint8_t|__SVUint8_t)' require the >> SVE ISA extension} "" { target *-*-* } .-1 } */ >> + unprototyped (*ptr); /* { dg-error {SVE type 'svuint8_t' used without >> SVE ISA enabled} } */ >> } >> diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_9.c >> b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_9.c >> new file mode 100644 >> index 00000000000..7b7f322fe8c >> --- /dev/null >> +++ b/gcc/testsuite/gcc.target/aarch64/sve/pcs/nosve_9.c >> @@ -0,0 +1,15 @@ >> +/* { dg-do compile } */ >> +/* { dg-prune-output "compilation terminated" } */ >> + >> +#include <arm_sve.h> >> + >> +#pragma GCC target "+nosve" >> + >> +int >> +f () >> +{ >> + char a[12]; >> + __SVInt8_t freq; /* { dg-error {SVE type '__SVInt8_t' used without SVE >> ISA enabled} } */ >> + return __builtin_bcmp (&freq, &freq, 10); >> +} >> +