[PATCH] D127762: [Clang][AArch64] Add/implement ACLE keywords for SME.
Richard Sandiford via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 3 00:54:01 PDT 2023
rsandifo-arm added a comment.
Thanks for dropping the attribute requirements down to TargetAArch64. But the offsetting requirement was that something somewhere (CodeGen?) must raise an error if code requires SME and SME isn't present. I think that means:
1. SME is not enabled for an `__arm_streaming` or `__arm_locally_streaming` function definition.
2. SME is not enabled for a call to an `__arm_streaming` function.
3. SME is not enabled for an `__arm_shared_za` or `__arm_new_za` function definition.
(Calls to `__arm_shared_za` functions don't need to be listed explicitly, since only `__arm_shared_za` and `__arm_new_za` functions can make such calls.)
In all cases, the check would apply after `__attribute__((target_version))` is taken into account.
Perhaps that's a separate patch though.
================
Comment at: clang/include/clang/Basic/AttrDocs.td:6645
+responsibility to do this. Clang will ensure that the generated code in
+streaming-compatible functions is valid in either mode (PSTATE.SM=0 or
+PSTATE.SM=1). For example, if an ``__arm_streaming_compatible`` function calls a
----------------
================
Comment at: clang/test/Sema/aarch64-sme-func-attrs.c:186
+struct S2_2 : public S {
+// expected-cpp-error at +2 {{virtual function 'shared_za_memberfn' has different attributes ('void () __arm_shared_za __arm_preserves_za') than the function it overrides (which has 'void () __arm_shared_za')}}
+// expected-cpp-note at -11 {{overridden virtual function is here}}
----------------
Thanks, this is indeed the case I was suggesting to test. But my point was that it shouldn't be an error. It's OK for an override to be `__arm_preserves_za` even if the function it overrides isn't. Something that calls `shared_za_member` directly from an `S2_2` object can take advantage of the extra guarantee.
It's the other way that's wrong. If a virtual function is `__arm_preserves_za` then any override must be too.
The principle is similar to covariant return types. E.g.:
```
struct S1 { virtual S1 *f(); };
struct S2 : S1 { S2 *f() override; }; // OK
struct S3 : S2 { S2 *f() override; }; // OK
struct S4 : S3 { S1 *f() override; }; // Error
```
An `__arm_preserves_za` function acts like functions that return `S2 *` in this example, and a non-`__arm_preserves_za` function acts like functions that return `S1 *`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127762/new/
https://reviews.llvm.org/D127762
More information about the cfe-commits
mailing list