• Eduard Zingerman's avatar
    libbpf: Resolve unambigous forward declarations · 082108fd
    Eduard Zingerman authored
    Resolve forward declarations that don't take part in type graphs
    comparisons if declaration name is unambiguous. Example:
    
    CU #1:
    
    struct foo;              // standalone forward declaration
    struct foo *some_global;
    
    CU #2:
    
    struct foo { int x; };
    struct foo *another_global;
    
    The `struct foo` from CU #1 is not a part of any definition that is
    compared against another definition while `btf_dedup_struct_types`
    processes structural types. The the BTF after `btf_dedup_struct_types`
    the BTF looks as follows:
    
    [1] STRUCT 'foo' size=4 vlen=1 ...
    [2] INT 'int' size=4 ...
    [3] PTR '(anon)' type_id=1
    [4] FWD 'foo' fwd_kind=struct
    [5] PTR '(anon)' type_id=4
    
    This commit adds a new pass `btf_dedup_resolve_fwds`, that maps such
    forward declarations to structs or unions with identical name in case
    if the name is not ambiguous.
    
    The pass is positioned before `btf_dedup_ref_types` so that types
    [3] and [5] could be merged as a same type after [1] and [4] are merged.
    The final result for the example above looks as follows:
    
    [1] STRUCT 'foo' size=4 vlen=1
    	'x' type_id=2 bits_offset=0
    [2] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
    [3] PTR '(anon)' type_id=1
    
    For defconfig kernel with BTF enabled this removes 63 forward
    declarations. Examples of removed declarations: `pt_regs`, `in6_addr`.
    The running time of `btf__dedup` function is increased by about 3%.
    Signed-off-by: default avatarEduard Zingerman <eddyz87@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Reviewed-by: default avatarAlan Maguire <alan.maguire@oracle.com>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20221109142611.879983-3-eddyz87@gmail.com
    082108fd
btf.c 130 KB