From: Richard Biener <richard.guenther@gmail.com>
To: Richard Biener <richard.guenther@gmail.com>,
gcc-patches@gcc.gnu.org, joseph@codesourcery.com,
polacek@redhat.com, jason@redhat.com, nathan@acm.org,
richard.sandiford@arm.com
Subject: Re: [WIP RFC] Add support for keyword-based attributes
Date: Mon, 17 Jul 2023 11:05:09 +0200 [thread overview]
Message-ID: <CAFiYyc3judXh_WDcH2D-OMqyPDynp8zXCZAuyuyyDJWSNvWGzA@mail.gmail.com> (raw)
In-Reply-To: <mptilajosm6.fsf@arm.com>
On Mon, Jul 17, 2023 at 10:21 AM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> Richard Biener <richard.guenther@gmail.com> writes:
> > On Fri, Jul 14, 2023 at 5:58 PM Richard Sandiford via Gcc-patches
> > <gcc-patches@gcc.gnu.org> wrote:
> >>
> >> Summary: We'd like to be able to specify some attributes using
> >> keywords, rather than the traditional __attribute__ or [[...]]
> >> syntax. Would that be OK?
> >>
> >> In more detail:
> >>
> >> We'd like to add some new target-specific attributes for Arm SME.
> >> These attributes affect semantics and code generation and so they
> >> can't simply be ignored.
> >>
> >> Traditionally we've done this kind of thing by adding GNU attributes,
> >> via TARGET_ATTRIBUTE_TABLE in GCC's case. The problem is that both
> >> GCC and Clang have traditionally only warned about unrecognised GNU
> >> attributes, rather than raising an error. Older compilers might
> >> therefore be able to look past some uses of the new attributes and
> >> still produce object code, even though that object code is almost
> >> certainly going to be wrong. (The compilers will also emit a default-on
> >> warning, but that might go unnoticed when building a big project.)
> >>
> >> There are some existing attributes that similarly affect semantics
> >> in ways that cannot be ignored. vector_size is one obvious example.
> >> But that doesn't make it a good thing. :)
> >>
> >> Also, C++ says this for standard [[...]] attributes:
> >>
> >> For an attribute-token (including an attribute-scoped-token)
> >> not specified in this document, the behavior is implementation-defined;
> >> any such attribute-token that is not recognized by the implementation
> >> is ignored.
> >>
> >> which doubles down on the idea that attributes should not be used
> >> for necessary semantic information.
> >>
> >> One of the attributes we'd like to add provides a new way of compiling
> >> existing code. The attribute doesn't require SME to be available;
> >> it just says that the code must be compiled so that it can run in either
> >> of two modes. This is probably the most dangerous attribute of the set,
> >> since compilers that ignore it would just produce normal code. That
> >> code might work in some test scenarios, but it would fail in others.
> >>
> >> The feeling from the Clang community was therefore that these SME
> >> attributes should use keywords instead, so that the keywords trigger
> >> an error with older compilers.
> >>
> >> However, it seemed wrong to define new SME-specific grammar rules,
> >> since the underlying problem is pretty generic. We therefore
> >> proposed having a type of keyword that can appear exactly where
> >> a standard [[...]] attribute can appear and that appertains to
> >> exactly what a standard [[...]] attribute would appertain to.
> >> No divergence or cherry-picking is allowed.
> >>
> >> For example:
> >>
> >> [[arm::foo]]
> >>
> >> would become:
> >>
> >> __arm_foo
> >>
> >> and:
> >>
> >> [[arm::bar(args)]]
> >>
> >> would become:
> >>
> >> __arm_bar(args)
> >>
> >> It wouldn't be possible to retrofit arguments to a keyword that
> >> previously didn't take arguments, since that could lead to parsing
> >> ambiguities. So when a keyword is first added, a binding decision
> >> would need to be made whether the keyword always takes arguments
> >> or is always standalone.
> >>
> >> For that reason, empty argument lists are allowed for keywords,
> >> even though they're not allowed for [[...]] attributes.
> >>
> >> The argument-less version was accepted into Clang, and I have a follow-on
> >> patch for handling arguments. Would the same thing be OK for GCC,
> >> in both the C and C++ frontends?
> >>
> >> The patch below is a proof of concept for the C frontend. It doesn't
> >> bootstrap due to warnings about uninitialised fields. And it doesn't
> >> have tests. But I did test it locally with various combinations of
> >> attribute_spec and it seemed to work as expected.
> >>
> >> The impact on the C frontend seems to be pretty small. It looks like
> >> the impact on the C++ frontend would be a bit bigger, but not much.
> >>
> >> The patch contains a logically unrelated change: c-common.h set aside
> >> 16 keywords for address spaces, but of the in-tree ports, the maximum
> >> number of keywords used is 6 (for amdgcn). The patch therefore changes
> >> the limit to 8 and uses 8 keywords for the new attributes. This keeps
> >> the number of reserved ids <= 256.
> >
> > If you had added __arm(bar(args)) instead of __arm_bar(args) you would only
> > need one additional keyword - we could set aside a similar one for each
> > target then. I realize that double-nesting of arguments might prove a bit
> > challenging but still.
>
> Yeah, that would work.
>
> > In any case I also think that attributes are what you want and their
> > ugliness/issues are not worse than the ugliness/issues of the keyword
> > approach IMHO.
>
> I guess the ugliness of keywords is the double underscore?
> What are the issues with the keyword approach though?
The issue is the non-standard syntax which will confuse 3rd party
tools like IDEs, static analyzers, etc. I'd also add that esp.
my suggestion to use __arm will likely clash with pre-existing
macros from (some) implementations. That can be solved with
_ArmKWD or choosing a less "common" identifier. A quick
check shows GCC on arm only defines __arm__, not __arm though.
Richard.
> If it's two underscores vs miscompilation then it's not obvious
> that two underscores should lose.
>
> Richard
next prev parent reply other threads:[~2023-07-17 9:05 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-14 15:56 Richard Sandiford
2023-07-14 17:17 ` Jakub Jelinek
2023-07-16 10:50 ` Richard Sandiford
2023-07-17 13:39 ` Jason Merrill
2023-07-17 14:06 ` Richard Sandiford
2023-07-14 21:14 ` Nathan Sidwell
2023-07-16 10:18 ` Richard Sandiford
2023-07-17 6:38 ` Richard Biener
2023-07-17 8:21 ` Richard Sandiford
2023-07-17 9:05 ` Richard Biener [this message]
2023-07-17 13:53 ` Michael Matz
2023-07-21 23:25 ` Joseph Myers
2023-08-16 10:36 ` Richard Sandiford
2023-08-16 13:22 ` Joseph Myers
2023-08-17 11:24 ` [PATCH] c: Add support for [[__extension__ ...]] Richard Sandiford
2023-08-17 17:07 ` Richard Biener
2023-08-17 18:36 ` Richard Sandiford
2023-08-18 9:51 ` Richard Sandiford
2023-08-18 19:51 ` Joseph Myers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFiYyc3judXh_WDcH2D-OMqyPDynp8zXCZAuyuyyDJWSNvWGzA@mail.gmail.com \
--to=richard.guenther@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jason@redhat.com \
--cc=joseph@codesourcery.com \
--cc=nathan@acm.org \
--cc=polacek@redhat.com \
--cc=richard.sandiford@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).