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
>