yonghong-song added a comment. In D110127#3016371 <https://reviews.llvm.org/D110127#3016371>, @aaron.ballman wrote:
> In D110127#3013876 <https://reviews.llvm.org/D110127#3013876>, @yonghong-song > wrote: > >> You can see that it doesn't matter where the attribute is placed, the >> attribute is always attached to the typedef. >> I think the reason is for declarations, we only allow the btf_tag attribute >> to be placed for record, field, var, func, typedef, >> and "unsigned *" does not qualify, so the attribute is applied to typedef. > > Agreed. If this attribute appertains to the type, then it goes through > SemaType.cpp and may require extra work to encode the information into the > type system. If it appertains to the declaration, then what's in > SemaDeclAttr.cpp is fine, but then I have questions about the use of the > attribute with cast notation from D110116 <https://reviews.llvm.org/D110116> > where this is being used definitely as a type attribute. For typedef use case, it intends to be used as a decl attribute. > One confounding factor here is that `__attribute__` will slide around to > whatever makes sense. You should try your examples with `[[]]` in C2x mode as > well -- the placement of the attribute syntax is strongly tied to what the > attribute applies to. I tried `[[]]` syntax, it does seem better than otherwise, e.g., [$ ~/work/tests/llvm/btf_tag] cat t1.c #define __tag1 [[clang::btf_tag("tag1")]] typedef unsigned __tag1 * __u; __u u; [$~/work/tests/llvm/btf_tag] clang -c -std=c2x t1.c t1.c:2:18: error: 'btf_tag' attribute cannot be applied to types typedef unsigned __tag1 * __u; ^ t1.c:1:18: note: expanded from macro '__tag1' #define __tag1 [[clang::btf_tag("tag1")]] ^ 1 error generated. [$ ~/work/tests/llvm/btf_tag] and [$ ~/work/tests/llvm/btf_tag] cat t1.c #define __tag1 [[clang::btf_tag("tag1")]] typedef unsigned * __u __tag1; __u u; [$ ~/work/tests/llvm/btf_tag] clang -c -std=c2x t1.c [$ ~/work/tests/llvm/btf_tag] If using old `__attribute__` syntax, both above examples will compile successfully. I will change my test to use -std=c2x. >>> I'm asking because this raises other questions. For example: >>> >>> void func(int i); >>> void func(int __attribute__((btf_tag("__user"))) i); >>> >>> Is the second a valid redeclaration of the first? Additionally: >> >> This should be okay as btf_tag is accumulative attribute. > > Okay, this is sounding more and more like a declaration attribute. > >>> __attribute__((overloadable)) void func(int i) { puts("one"); } >>> __attribute__((overloadable)) void func(int >>> __attribute__((btf_tag("__user"))) i) { puts("two"); } >>> >>> Is this a valid overload set because of the type attribute? Along the same >>> lines, does adding this attribute to the type cause any ABI differences in >>> how the type is passed? >> >> btf_tag is for C only so overload function case won't happen. > > That's incorrect -- Clang supports attribute overloadable in C: > https://godbolt.org/z/eThKsn3zM In this case, the overload is not valid and the attribute does not have an impact on overloading decision. [$ ~/work/tests/llvm/btf_tag] cat t.c #include <stdio.h> __attribute__((overloadable)) void func(int i) { puts("int"); } __attribute__((overloadable)) void func(int i __attribute__((btf_tag("tag2")))) { puts("float"); } int main(void) { func(1); } [$ ~/work/tests/llvm/btf_tag] clang -c t.c t.c:4:36: error: redefinition of 'func' __attribute__((overloadable)) void func(int i __attribute__((btf_tag("tag2")))) { puts("float"); } ^ t.c:3:36: note: previous definition is here __attribute__((overloadable)) void func(int i) { puts("int"); } ^ 1 error generated. [$ ~/work/tests/llvm/btf_tag] So overloading is rejected. This is similar to below example with aligned attribute, [$ ~/work/tests/llvm/btf_tag] cat t.c #include <stdio.h> __attribute__((overloadable)) void func(int i) { puts("int"); } __attribute__((overloadable)) void func(int i __attribute__((aligned(8)))) { puts("float"); } int main(void) { func(1); } [$ ~/work/tests/llvm/btf_tag] clang -c t.c t.c:4:36: error: redefinition of 'func' __attribute__((overloadable)) void func(int i __attribute__((aligned(8)))) { puts("float"); } ^ t.c:3:36: note: previous definition is here __attribute__((overloadable)) void func(int i) { puts("int"); } ^ 1 error generated. [$ ~/work/tests/llvm/btf_tag] Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D110127/new/ https://reviews.llvm.org/D110127 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits