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

Reply via email to