Re: [PAHOLE v4 2/3] dwarf_loader: Add support for DW_TAG_GNU_annotation
Vineet Gupta <[email protected]> Tue, 30 Jun 2026 13:02:23 -0700
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
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.
> 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