Re: [PAHOLE v4 2/3] dwarf_loader: Add support for DW_TAG_GNU_annotation
Yonghong Song <[email protected]> Mon, 27 Jul 2026 20:01:20 -0700
| Newsgroups | org.kernel.vger.dwarves,org.kernel.vger.bpf |
|---|---|
| Message-ID | <[email protected]> |
On 7/16/26 9:12 AM, David Faust wrote:
>
> 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.
The original design is for potential use cases. And we don't think
kernel bpf will handle things like 'var("x") -> type_tag ("foo") -> int;'.
So we didn't allow arbitrary type_tag and only for cases where kernel bpf
may use.
>
>
>> 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