[BPF] Fix a BTF gen bug related to a pointer struct member
authorYonghong Song <yhs@fb.com>
Wed, 1 Jul 2020 14:51:55 +0000 (07:51 -0700)
committerYonghong Song <yhs@fb.com>
Wed, 1 Jul 2020 16:55:01 +0000 (09:55 -0700)
commit3eacfdc72f1aa3ac53eb300116f194d560053ec7
tree083659bd73423afea36bd23bb5d885c036a3e3f8
parent4b0aa5724feaa89a9538dcab97e018110b0e4bc3
[BPF] Fix a BTF gen bug related to a pointer struct member

Currently, BTF generation stops at pointer struct members
if the pointee type is a struct. This is to avoid bloating
generated BTF size. The following is the process to
correctly record types for these pointee struct types.
  - During type traversal stage, when a struct member, which
    is a pointer to another struct, is encountered,
    the pointee struct type, keyed with its name, is
    remembered in a Fixup map.
  - Later, when all type traversal is done, the Fixup map
    is scanned, based on struct name matching, to either
    resolve as pointing to a real already generated type
    or as a forward declaration.

Andrii discovered a bug if the struct member pointee struct
is anonymous. In this case, a struct with empty name is
recorded in Fixup map, and later it happens another anonymous
struct with empty name is defined in BTF. So wrong type
resolution happens.

To fix the problem, if the struct member pointee struct
is anonymous, pointee struct type will be generated in
stead of being put in Fixup map.

Differential Revision: https://reviews.llvm.org/D82976
llvm/lib/Target/BPF/BTFDebug.cpp
llvm/test/CodeGen/BPF/BTF/struct-anon-2.ll [new file with mode: 0644]