v1.19:

- Support split BTF, where a main BTF file, vmlinux, can be used to find types
  and then a kernel module, for instance, can have just what is unique to it.

  For instance, looking for a type in the main vmlinux BTF info:

    $ pahole wmi_notify_handler
    pahole: type 'wmi_notify_handler' not found
    $

  If we look at the 'wmi' module BTF info that is in:

    $ ls -la /sys/kernel/btf/wmi
    -r--r--r--. 1 root root 2866 Nov 18 13:35 /sys/kernel/btf/wmi
    $

    $ pahole /sys/kernel/btf/wmi -C wmi_notify_handler
    typedef void (*wmi_notify_handler)(u32, void *);
    $

  '--btf_base=/sys/kernel/btf/vmlinux' was automatically added in this last
  example, an option that was also introduced in this version where types used in
  the wmi.ko module but present in vmlinux can be found so that there is no
  duplicity of types.

- Update libbpf to get the split BTF support and use some of its functions to
  load BTF and speed up DWARF loading and BTF encoding.

- Support cross-compiled ELF binaries with different endianness

- Support showing typedefs for anonymous types, like structs, unions and enums,
  see the "Align enumerators" entry below for an example, another:

    $ pahole rwlock_t
    typedef struct {
            arch_rwlock_t              raw_lock;             /*     0     8 */

            /* size: 8, cachelines: 1, members: 1 */
            /* last cacheline: 8 bytes */
    } rwlock_t;
    $

- Align enumerators:

    $ pahole ZSTD_strategy
    typedef enum {
            ZSTD_fast    = 0,
            ZSTD_dfast   = 1,
            ZSTD_greedy  = 2,
            ZSTD_lazy    = 3,
            ZSTD_lazy2   = 4,
            ZSTD_btlazy2 = 5,
            ZSTD_btopt   = 6,
            ZSTD_btopt2  = 7,
            } ZSTD_strategy;
    $

- Workaround bugs in the generation of DWARF records for functions in some gcc
  versions that were causing breakage in the encoding of BTF:

   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97060 "Missing DW_AT_declaration=1 in dwarf data"

- Ignore zero-sized ELF symbols instead of erroring out.

- Handle union forward declaration properly in the BTF loader.

- Introduce --numeric_version for use in scripts and Makefiles:

    $ pahole --version
    v1.19
    $ pahole --numeric_version
    119
    $

  To avoid things like this in the kernel's scripts/link-vmlinux.sh:

    pahole_ver=$(${PAHOLE} --version | sed -E 's/v([0-9]+)\.([0-9]+)/\1\2/')

- Try sole pfunct argument as a function name, just like pahole with type names:

    $ pfunct tcp_v4_rcv
    int tcp_v4_rcv(struct sk_buff * skb);
    $

- Speed up pfunct using some of the load techniques used in pahole.

- Discard CUs after BTF encoding as they're not used anymore, greatly reducing
  memory usage and speeding up vmlinux BTF encoding.

- Revamp how per-CPU variables are encoded in BTF.

- Include BTF info for static functions.

- Use BTF's string APIs for strings management, greatly improving performance
  over the tsearch().

- Increase size of DWARF lookup hash table, shaving off about 1 second out of
  about 20 seconds total for Linux BTF dedup.

- Stop BTF encoding when errors are found in some DWARF CU.

- Implement --packed, to show just packed structures, for instance, here are
  the top 5 packed data structures in the Linux kernel:

  $ pahole --sizes --packed | sort -k2 -nr | head -5
  e820_table	64004	0
  boot_params	4096	0
  efi_variable	2084	0
  snd_soc_tplg_pcm	912	0
  ntb_info_regs	800	0
  $

  And here is one of them:

  $ pahole efi_variable
  struct efi_variable {
  	efi_char16_t               VariableName[512];    /*     0  1024 */
  	/* --- cacheline 16 boundary (1024 bytes) --- */
  	efi_guid_t                 VendorGuid;           /*  1024    16 */
  	long unsigned int          DataSize;             /*  1040     8 */
  	__u8                       Data[1024];           /*  1048  1024 */
  	/* --- cacheline 32 boundary (2048 bytes) was 24 bytes ago --- */
  	efi_status_t               Status;               /*  2072     8 */
  	__u32                      Attributes;           /*  2080     4 */

  	/* size: 2084, cachelines: 33, members: 6 */
  	/* last cacheline: 36 bytes */
  } __attribute__((__packed__));
  $

- Fix bug in distros such as OpenSUSE:15.2 where DW_AT_alignment isn't defined.

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
dwarves: Prep v1.19

Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
5 files changed