Re: [PAHOLE v4 2/3] dwarf_loader: Add support for DW_TAG_GNU_annotation
Yonghong Song <[email protected]> Wed, 1 Jul 2026 10:14:25 -0700
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
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.
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