aaron.ballman accepted this revision.
aaron.ballman added a comment.

Only thing left for me are the nits I pointed out in the last review, otherwise 
I think this is all set. Giving my LG because I don't think we need another 
round of review for those nits unless you want it



================
Comment at: clang/lib/Sema/ParsedAttr.cpp:241
+  case AT_ObjCGC:
+  case AT_VectorSize:
+    return true;
----------------
rsmith wrote:
> mboehme wrote:
> > rsmith wrote:
> > > This one is weird. Given:
> > > 
> > > ```
> > > [[gnu::vector_size(8)]] int x;
> > > int [[gnu::vector_size(8)]] y;
> > > int *[[gnu::vector_size(8)]]* z;
> > > ```
> > > 
> > > - Clang and GCC accept `x`
> > > - Clang rejects `y` and GCC warns that the attribute is ignored on `y`
> > > - Clang accepts `z` with a warning that GCC would ignore the attribute, 
> > > whereas GCC silently accepts
> > > 
> > > I guess after this patch we'll silently accept `x` (treated as the 
> > > "sliding" behavior) and accept `y` and `z` with a warning that it's 
> > > GCC-incompatible?
> > > This one is weird. Given:
> > > 
> > > ```
> > > [[gnu::vector_size(8)]] int x;
> > > int [[gnu::vector_size(8)]] y;
> > > int *[[gnu::vector_size(8)]]* z;
> > > ```
> > > 
> > > - Clang and GCC accept `x`
> > > - Clang rejects `y` and GCC warns that the attribute is ignored on `y`
> > > - Clang accepts `z` with a warning that GCC would ignore the attribute, 
> > > whereas GCC silently accepts
> > 
> > Actually, for z, Clang gives me not just a warning but also an error: 
> > 
> > ```
> > <source>:1:8: warning: GCC does not allow the 'vector_size' attribute to be 
> > written on a type [-Wgcc-compat]
> > int *[[gnu::vector_size(8)]]* z;
> >        ^
> > <source>:1:8: error: invalid vector element type 'int *'
> > ```
> > 
> > https://godbolt.org/z/E4ss8rzWE
> > 
> > > I guess after this patch we'll silently accept `x` (treated as the 
> > > "sliding" behavior) and accept `y` and `z` with a warning that it's 
> > > GCC-incompatible?
> > 
> > Thanks for pointing this out to me!
> > 
> > Actually, I must not have checked the GCC behavior previously, so I went 
> > too far and gave `vector_size` meaning when placed on `y` instead of just 
> > ignoring it. I’ve now changed the code to ignore the attribute and emit a 
> > warning, like GCC does. (See tests in `vector-gcc-compat.c`.)
> > 
> > It’s particularly surprising to me that GCC allows `vector_size` to be 
> > applied to a pointer type (the `z` case) – particularly so since the 
> > [documentation](https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html) 
> > explicitly states: “The vector_size attribute is only applicable to 
> > integral and floating scalars, although arrays, pointers, and function 
> > return values are allowed in conjunction with this construct.”
> > 
> > I wanted to test whether GCC just silently ignores the attribute when 
> > placed on a pointer or whether it has an effect. Here are some test cases:
> > 
> > https://godbolt.org/z/Ke1E7TnYe
> > 
> > From looking at the generated code, it appears that `vector_size`, when 
> > applied to a pointer type, _does_ have an effect – though a maybe slightly 
> > surprising one: It is applied to the base type, rather than the pointer 
> > type. I suspect that GCC simply treats the C++11 spelling the same as the 
> > `__attribute__` spelling (i.e. it doesn’t apply the stricter C++11 rules on 
> > what the attribute should appertain to), and it seems that both spellings 
> > get applied to the base type of the declaration no matter where they appear 
> > in the declaration (except if the attribute is ignored entirely).
> > 
> > Interestingly, this means that Clang’s warning (“GCC does not allow the 
> > 'vector_size' attribute to be written on a type”) is wrong. Maybe this is 
> > behavior in GCC that has changed since the warning was introduced?
> > 
> > Given all of this, I propose we treat the various cases as follows (and 
> > I’ve implemented this in the code):
> > 
> > * We continue to accept `x` without a warning, just as we do today (same 
> > behavior as GCC)
> > * We allow `y` but warn that the attribute doesn’t have an effect (same 
> > behavior as GCC)
> > * We continue to reject `z`, even though GCC allows it and it has an effect 
> > there. Rationale: a) We reject this today, so this isn’t a regression; b) 
> > this usage is unusual and likely not to occur often in the wild; c) fixing 
> > this to be consistent with GCC will take a non-trivial amount of code, so 
> > I’d like to keep it outside the scope of this change.
> > https://godbolt.org/z/Ke1E7TnYe
> 
> That GCC behavior is shocking. Shocking enough that I think the following 
> approach would make sense:
> 
> 1) For compatibility, emulate the GCC behavior as much as possible for 
> `[[gnu::vector_size]]`, except:
>     - Continue to error rather than only warning in the cases where the 
> attribute does not create a vector type at all, and
>     - Warn on cases like `int *[[gnu::vector_size(N)]]` (and possibly `int *p 
> [[gnu::vector_size(N)]]`) that we're forming a pointer to a vector rather 
> than a vector of pointers.
> 2) Add a separate `[[clang::vector_size(N)]]` attribute that behaves like a 
> type attribute is supposed to: the attribute applies to the type on its left, 
> always (and can't be applied to a declaration).
> 
> (Incidentally, I think we should add a `[[clang::ext_vector_type]]` spelling 
> with behavior (2) too. The .td file claim that ext_vector_type is 
> OpenCL-specific isn't true; it's a general kind of vector type that follows 
> the OpenCL rules but is available across language modes.)
> 
> But... not in this patch. In this patch I think the only priority for the 
> `[[gnu::...]]` attributes is that we don't make things worse (in particular, 
> don't make GCC compatibility worse). And given that this new sliding behavior 
> applies only to `[[clang::...]]` attributes I think we have that covered. So 
> no action required here.
+1 to this :-)


================
Comment at: clang/lib/Sema/ParsedAttr.cpp:224
+  // property is consciously not defined as a flag in Attr.td because we don't
+  // want new attributes to specify it.
+  switch (getParsedKind()) {
----------------
rsmith wrote:
> aaron.ballman wrote:
> > mboehme wrote:
> > > aaron.ballman wrote:
> > > > mboehme wrote:
> > > > > aaron.ballman wrote:
> > > > > > Thoughts on the additional comment? And should we start to issue 
> > > > > > that deprecation warning now (perhaps as a separate follow-up 
> > > > > > commit)?
> > > > > > Thoughts on the additional comment?
> > > > > 
> > > > > Yes, good point, we should point this out explicitly.
> > > > > 
> > > > > I've worded the comment slightly differently: we can definitely 
> > > > > deprecate the "sliding" behavior for attributes in the `clang::` 
> > > > > namespace, as we own them, but there may be compatibility concerns 
> > > > > for other attributes. This may mean that we can never reduce this 
> > > > > list to nothing, but we should try.
> > > > > 
> > > > > > And should we start to issue that deprecation warning now (perhaps 
> > > > > > as a separate follow-up commit)?
> > > > > 
> > > > > We're already doing this (see the tests in 
> > > > > test/SemaCXX/adress-space-placement.cpp), though again only for 
> > > > > attributes in the `clang::` namespace, as we don't really have the 
> > > > > authority to deprecate this usage for other attributes.
> > > > > 
> > > > > I think the other question here is whether, by default, this should 
> > > > > be an error, not a warning, but this would then presumably require a 
> > > > > command-line flag to downgrade the error to a warning if needed (I 
> > > > > believe @rsmith raised this point on 
> > > > > https://reviews.llvm.org/D111548). If we do decide to make this an 
> > > > > error by default, I'd like to do this in a followup change if 
> > > > > possible, as a) this change is already a strict improvement over the 
> > > > > status quo; b) adding a command-line flag with associated tests would 
> > > > > further increase the scope of this change, and c) this change is a 
> > > > > blocker for https://reviews.llvm.org/D111548, which others on my team 
> > > > > are waiting to be able to use.
> > > > > ... but there may be compatibility concerns for other attributes. 
> > > > > This may mean that we can never reduce this list to nothing, but we 
> > > > > should try.
> > > > 
> > > > I would be pretty aggressive there and break compatibility over this, 
> > > > unless the uses were in system headers or something where the break 
> > > > would be too onerous to justify.
> > > > 
> > > > > I think the other question here is whether, by default, this should 
> > > > > be an error, not a warning, but this would then presumably require a 
> > > > > command-line flag to downgrade the error to a warning if needed 
> > > > 
> > > > You put `DefaultError` onto the warning diagnostic to have it 
> > > > automatically upgraded as if the user did `-Werror=whatever-warning`, 
> > > > which allows the user to downgrade it back into a warning with 
> > > > `-Wno-error=whatever-warning`.
> > > > > I think the other question here is whether, by default, this should 
> > > > > be an error, not a warning, but this would then presumably require a 
> > > > > command-line flag to downgrade the error to a warning if needed 
> > > > 
> > > > You put `DefaultError` onto the warning diagnostic to have it 
> > > > automatically upgraded as if the user did `-Werror=whatever-warning`, 
> > > > which allows the user to downgrade it back into a warning with 
> > > > `-Wno-error=whatever-warning`.
> > > 
> > > Oh nice -- I didn't realize it was this easy!
> > > 
> > > I haven't made a change yet because I wanted to give @rsmith an 
> > > opportunity to weigh in -- do you have an opinion on whether this should 
> > > be a warning or an error by default?
> > I'm not certain if @rsmith has opinions here or not, but I think an error 
> > which can be downgraded to a warning is a reasonable approach. We should 
> > hear pretty quickly if this causes significant problems (in system headers 
> > or the like).
> I think I'd prefer for this to be a warning in the initial release with the 
> new behavior, and for us to upgrade it to an error for a subsequent release. 
> I'm not completely comfortable with there being no `[[clang::...]]` placement 
> for these attributes that is accepted by default in both Clang 14 and Clang 
> 15, but somewhat more comfortable with there being no syntax that's accepted 
> in both Clang 14 and Clang 16 by default, even though I think these 
> attributes are in practice mostly used with `__attribute__((...))` syntax.
Okay, that's convincing, thanks!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D126061/new/

https://reviews.llvm.org/D126061

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to