BTF type tag not emitted to BTF in some cases

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I was trying to use BTF type tags, but I noticed that when I apply it to a
non-builtin type, it isn't emitted in the 'PTR' -> 'TYPE_TAG' -> <TYPE> chain.

Consider the following two cases:

 ; cat tag_good.c
#define __btf_id __attribute__((btf_type_tag("btf_id")))
#define __ref    __attribute__((btf_type_tag("ref")))

struct map_value {
        long __btf_id __ref *ptr;
};

void func(struct map_value *, long *);

int main(void)
{
        struct map_value v = {};

        func(&v, v.ptr);
}

; cat tag_bad.c
#define __btf_id __attribute__((btf_type_tag("btf_id")))
#define __ref    __attribute__((btf_type_tag("ref")))

struct foo {
        int i;
};

struct map_value {
        struct foo __btf_id __ref *ptr;
};

void func(struct map_value *, struct foo *);

int main(void)
{
        struct map_value v = {};

        func(&v, v.ptr);
}

--

In the first case, it is applied to a long, in the second, it is applied to
struct foo.

For the first case, we see:

[1] FUNC_PROTO '(anon)' ret_type_id=2 vlen=0
[2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
[3] FUNC 'main' type_id=1 linkage=global
[4] FUNC_PROTO '(anon)' ret_type_id=0 vlen=2
        '(anon)' type_id=5
        '(anon)' type_id=11
[5] PTR '(anon)' type_id=6
[6] STRUCT 'map_value' size=8 vlen=1
        'ptr' type_id=9 bits_offset=0
[7] TYPE_TAG 'btf_id' type_id=10
[8] TYPE_TAG 'ref' type_id=7
[9] PTR '(anon)' type_id=8
[10] INT 'long' size=8 bits_offset=0 nr_bits=64 encoding=SIGNED
[11] PTR '(anon)' type_id=10
[12] FUNC 'func' type_id=4 linkage=extern

For the second, there is no TYPE_TAG:

 ; ../linux/tools/bpf/bpftool/bpftool btf dump file tag_bad.o
[1] FUNC_PROTO '(anon)' ret_type_id=2 vlen=0
[2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
[3] FUNC 'main' type_id=1 linkage=global
[4] FUNC_PROTO '(anon)' ret_type_id=0 vlen=2
        '(anon)' type_id=5
        '(anon)' type_id=8
[5] PTR '(anon)' type_id=6
[6] STRUCT 'map_value' size=8 vlen=1
        'ptr' type_id=7 bits_offset=0
[7] PTR '(anon)' type_id=9
[8] PTR '(anon)' type_id=9
[9] STRUCT 'foo' size=4 vlen=1
        'i' type_id=2 bits_offset=0
[10] FUNC 'func' type_id=4 linkage=extern

--

Is there anything I am missing here? When I do llvm-dwarfdump for both, I see
that the tag annotation is present for both:

For the good case:

0x00000067:   DW_TAG_pointer_type
                DW_AT_type      (0x00000073 "long")

0x0000006c:     DW_TAG_unknown_6000
                  DW_AT_name    ("btf_type_tag")
                  DW_AT_const_value     ("btf_id")

0x0000006f:     DW_TAG_unknown_6000
                  DW_AT_name    ("btf_type_tag")
                  DW_AT_const_value     ("ref")

For the bad case:

0x00000067:   DW_TAG_pointer_type
                DW_AT_type      (0x00000073 "foo")

0x0000006c:     DW_TAG_unknown_6000
                  DW_AT_name    ("btf_type_tag")
                  DW_AT_const_value     ("btf_id")

0x0000006f:     DW_TAG_unknown_6000
                  DW_AT_name    ("btf_type_tag")
                  DW_AT_const_value     ("ref")

My clang version is a very recent compile:
clang version 15.0.0 (https://github.com/llvm/llvm-project.git 9e08e9298059651e4f42eb608c3de9d4ad8004b2)

Thanks
--
Kartikeya



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux