Re: [PAHOLE v4 2/3] dwarf_loader: Add support for DW_TAG_GNU_annotation

David Faust <[email protected]> Thu, 16 Jul 2026 09:12:06 -0700
Newsgroups org.kernel.vger.dwarves,org.kernel.vger.bpf
Message-ID <[email protected]>

On 7/1/26 10:14, Yonghong Song wrote:
> 
> 
> On 6/30/26 1:02 PM, Vineet Gupta wrote:
>> On 6/17/26 11:18 AM, Vineet Gupta wrote:
>>> On 6/3/26 1:08 PM, Yonghong Song wrote:
>>>> For decl tag
>>>> ============
>>>>
>>>> $ cat decl_tag.c
>>>> /* btf_decl_tag test cases.
>>>>     *
>>>>     * btf_decl_tag can be attached to:
>>>>     *   - global (incl. static) variables
>>>>     *   - functions
>>>>     *   - function parameters
>>>>     *   - struct/union types and their members
>>>>     *   - typedefs
>>>>     *
>>>>     * Build:  clang -O2 -target bpf -g -c decl_tag.c -o decl_tag.o
>>>>     *         /home/yhs/work/gcc-build/opt/gcc-16.1/bin/gcc -O2 
>>>> -gbtf -g -c decl_tag.c -o decl_tag.o
>>>>     * Dump:   bpftool btf dump file decl_tag.o
>>>>     */
>>>>
>>>> #define __tag(x) __attribute__((btf_decl_tag(x)))
>>>>
>>>> /* tag on a global variable */
>>>> int global_var __tag("global_var_tag");
>>>>
>>>> /* tag on a static variable */
>>>> static int static_var __tag("static_var_tag");
>>>>
>>>> /* multiple tags on one declaration */
>>>> int multi_tag_var __tag("tag_a") __tag("tag_b");
>>>>
>>>> /* tag on struct type and its members */
>>>> struct foo {
>>>>            int a __tag("member_a_tag");
>>>>            int b __tag("member_b_tag");
>>>> } __tag("struct_foo_tag");
>>>>
>>>> /* tag on a typedef */
>>>> typedef struct foo foo_t1 __tag("typedef_foo_tag");
>>>> typedef struct {int foo2;} foo_t2 __tag("typedef_foo2_tag");
>>>>
>>>> /* tag on a function and its parameters */
>>>> __tag("func_add_tag")
>>>> int add(int x __tag("param_x_tag"), int y __tag("param_y_tag"))
>>>> {
>>>>            return x + y;
>>>> }
>>>>
>>>> /* keep the globals/types alive so they land in BTF */
>>>> int use(foo_t1 *f, foo_t2 *g)
>>>> {
>>>>            return add(global_var + static_var + multi_tag_var, f->a 
>>>> + g->foo2);
>>>> }
>>>>
>>>> $ /home/yhs/work/gcc-build/opt/gcc-16.1/bin/gcc -O2 -gbtf -g -c 
>>>> decl_tag.c -o decl_tag.o
>>>> decl_tag.c:30:1: warning: ‘btf_decl_tag’ attribute does not apply to 
>>>> types [-Wattributes]
>>>>       30 | } __tag("struct_foo_tag");
>>>>          | ^
>>>>
>>> [snip]
>>>
>>>> Three decl tags (struct_foo_tag, typedef_foo_tag and typedef_foo2_tag)
>>>> are missing here:
>>>>
>>>> struct foo {
>>>>            int a __tag("member_a_tag");
>>>>            int b __tag("member_b_tag");
>>>> } __tag("struct_foo_tag");
>>>>
>>>> /* tag on a typedef */
>>>> typedef struct foo foo_t1 __tag("typedef_foo_tag");
>>>> typedef struct {int foo2;} foo_t2 __tag("typedef_foo2_tag");
>>> Semantically what does this mean ? Will the decl tag will be "applied"
>>> where ever the type is instantiated ?
>>
>> So these are dec tags (not type tags) on typedefs.
>> Are these still relevant after the change below for supporting type 
>> tags on typedefs (and gcc has in flight patches to do the same).
>>
>>    commit 5754a48780f516cbc06eeb2a31b1e445ddd9c935
>>    Author: yonghong-song <[email protected]>
>>    Date:   Mon Jun 15 10:51:02 2026 -0700
>>         [Clang][BPF] Support btf_type_tag on typedef underlying types 
>> (#203089)
>>         Emil Tsalapatis suggested to add type tag for typedef like below:
>>         ```
>>           $ cat tag.c
>>           #define __type_tag(x) __attribute__((btf_type_tag(x)))
>>           struct bar { int c; int d; };
>>           typedef struct bar __type_tag("a") bar_t;
>>           int use(bar_t *v)
>>           {
>>             return v->c + v->d;
>>           }
>>         ```
>>         This makes the code simpler -- using `bar_t *v` instead of the 
>> longer
>>         form `struct bar __type_tag("a") *v`.
>>         So the goal is to allow type tag for typedef underlying types. 
>> The
>>         following describes the main changes:
>>
>>
>> And if so, how are they semantically different and what's the use case 
>> fot decl tags on typedefs.
> 
> Decl tags and type tags are different in the above. Decl tags will be something like
> 
>      decl_tag -> typedef -> ...
> 
> Type tags will be something like\
> 
>      typedef -> type_tag -> ...
> 
> You can do both decl tag and type dag for the same typedef
> 
>      decl_tag -> typedef -> type_tag -> ...
> 
> There is a selftest (progs/test_btf_decl_tag.c) which has an example with decl_tag
> for typedef.

Curious about the above commit, in particular "on typedef underlying types".

What is the motivation to only support type_tag specifically on the underlying
type of a typedef but not elsewhere? Similar to only specifically supporting
it in pointers but not elsewhere.

I find it exceedingly strange that in this design, iiuc, one could do e.g.:

  typedef int __typetag("foo") my_int;
  my_int x;

  var("x") -> typedef -> type_tag ("foo") -> int;

but NOT

  int __typetag("foo") x;

  var("x") -> type_tag ("foo") -> int;



I mean, why not just support type_tag on any type? Like cv-quals.


> 
> About the question what is the use case for decl tags for typedef.
> The initial llvm implementation is to have more coverage so we do not need
> to add them later on. I didn't monitor this and not sure whether anybody
> uses it or not.
> 
> But I think gcc should implement
>      typedef -> type_tag -> ...
> if this is the case, I assume it should be easier for gcc to implement
>      decl_tag -> typedef -> ...
> 
>>
>>> OK, opened PR/125862 [1]  for future improvement.
>>>
>>> [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125862
>>
>> If not, we can close this gcc PR as won't fix / not needed.
>>
>> Thx,
>> -Vineet
>