Re: A question about BTF naming convention

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

 



Alan Maguire <alan.maguire@xxxxxxxxxx> 于2024年6月26日周三 18:19写道:
>
> On 26/06/2024 08:29, Totoro W wrote:
> > Hi folks,
> >
> > This is my first time to ask questions in this mailing list. I'm the
> > author of https://github.com/tw4452852/zbpf which is a framework to
> > write BPF programs with Zig toolchain.
> > During the development, as the BTF is totally generated by the Zig
> > toolchain, some naming conventions will make the BTF verifier refuse
> > to load.
> > Right now I have to patch the libbpf to do some fixup before loading
> > into the kernel
> > (https://github.com/tw4452852/libbpf_zig/blob/main/0001-temporary-WA-for-invalid-BTF-info-generated-by-Zig.patch).
> > Even though this just work-around the issue, I'm still curious about
> > the current naming sanitation, I want to know some background about
> > it.
> > If possible, could we relax this to accept more languages (like Zig)
> > to write BPF programs? Thanks in advance.
> >
> > For reference, here the BTF generated by Zig for this program
> > (https://github.com/tw4452852/zbpf/blob/main/samples/perf_event.zig)
> >
> > [1] PTR '*[4]u8' type_id=3
>
> The problem here as Eduard mentioned is that the zig compiler appears to
> be generating unneeded names for pointers, and then you're working
> around this in zbpf, is that right?
Yes, you're right, I kind of workaround this issue in zbpf.

> It's not clear to me what that
> pointer name adds - I suspect it's saying it's a pointer to an array of
> 4 u8s, but we get that from the fact it's a PTR to type_id 3 - an ARRAY
> with element type 'u8' (type id 2) and nr_elems=4, no name is needed. So
> the name doesn't add any information it seems; or at least the info the
> name provides can be reconstructed from the BTF without having the name.
Your guess is right.

>
> So the root problem here appears to be the zig compiler's BTF
> generation. If there are some language constraints that require some
> sort of name annotation for pointers, couldn't that be done via BTF type
> tags or via some other compatible mechanism?
>
> So I think we need to understand whether the BTF incompatibilities arise
> due to genuine language features or if they are the result of
> incorrectly-generated BTF during zig compilation. I dug around a bit in
> the zig github repo but could only find BTF parsing code, not code for
> BTF generation. Finding where the BTF is generated in the zig toolchain
> and understanding why it is generating names for pointers is the first
> step here I think.
Currently, for the BPF platform, Zig uses LLVM as backend. So the BTF
generation is done
by LLVM (https://github.com/llvm/llvm-project/blob/37eb9c9632fb5e82827d1a0559f2279e9a9f1969/llvm/lib/Target/BPF/BTFDebug.cpp)
with debug meta information provided by the Zig toolchain
(https://github.com/ziglang/zig/blob/master/src/codegen/llvm.zig)

>
> Alan
>
>
> > [2] INT 'u8' size=1 bits_offset=0 nr_bits=8 encoding=(none)
> > [3] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=4
> > [4] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none)
> > [5] PTR '*u32' type_id=6
> > [6] INT 'u32' size=4 bits_offset=0 nr_bits=32 encoding=(none)
> > [7] STRUCT 'map.Map.Def' size=24 vlen=3
> >         'type' type_id=1 bits_offset=0
> >         'key' type_id=5 bits_offset=64
> >         'value' type_id=5 bits_offset=128
> > [8] VAR 'events' type_id=7, linkage=global
> > [9] PTR '*[2]u8' type_id=10
> > [10] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=2
> > [11] PTR '*[1]u8' type_id=12
> > [12] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=1
> > [13] STRUCT 'map.Map.Def' size=32 vlen=4
> >         'type' type_id=9 bits_offset=0
> >         'key' type_id=5 bits_offset=64
> >         'value' type_id=5 bits_offset=128
> >         'max_entries' type_id=11 bits_offset=192
> > [14] VAR 'my_pid' type_id=13, linkage=global
> > [15] FUNC_PROTO '(anon)' ret_type_id=16 vlen=1
> >         '(anon)' type_id=17
> > [16] INT 'c_int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
> > [17] PTR '*perf_event.test_perf_event_array__opaque_478' type_id=18
> > [18] STRUCT 'perf_event.test_perf_event_array__opaque_478' size=0 vlen=0
> > [19] FUNC 'test_perf_event_array' type_id=15 linkage=global
> > [20] FUNC_PROTO '(anon)' ret_type_id=21 vlen=1
> >         '(anon)' type_id=21
> > [21] INT 'usize' size=8 bits_offset=0 nr_bits=64 encoding=(none)
> > [22] FUNC 'getauxvalImpl' type_id=20 linkage=global
> > [23] ARRAY '(anon)' type_id=2 index_type_id=4 nr_elems=3
> > [24] VAR '_license' type_id=23, linkage=global
> > [25] DATASEC '.maps' size=0 vlen=2
> >         type_id=8 offset=0 size=24 (VAR 'events')
> >         type_id=14 offset=0 size=32 (VAR 'my_pid')
> > [26] DATASEC 'license' size=0 vlen=1
> >         type_id=24 offset=0 size=4 (VAR '_license')
> >
> >
> > Regards.
> >





[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