btf_encoder: Don't special case packed enums

BTF data can represent packed enums correctly without any special
handling from pahole side. Previously pahole's own `enum vscope` would
be omitted causing problems.

Original commit tried to generate correct struct bitfield member type if
the member is an enum. This was dated before kind_flag implementation.
Later, kind_flag support was added and now pahole always generates BTF
with kind_flag = 1 for structures with bitfield, where bitfield size is
encoded in btf_member, so this workaround is not needed any more.
Removing this "hack" makes handling it easier to handle packed enums
correctly.

Repro:

  $ cat test/packed_enum.c
  enum packed_enum {
          VALUE1,
          VALUE2,
          VALUE3
  } __attribute__((packed));

  struct s {
          int x;
          enum packed_enum e;
          int y;
  };

  int main()
  {
          struct s s;
          return 0;
  }

  $ gcc -g -c test/packed_enum.c -o test/packed_enum.o

  $ ~/local/pahole/build/pahole -JV test/packed_enum.o
  File test/packed_enum.o:
  [1] INT (anon) size=1 bit_offset=0 nr_bits=8 encoding=SIGNED
  [2] STRUCT s kind_flag=0 size=12 vlen=3
          x type_id=3 bits_offset=0
          e type_id=1 bits_offset=32
          y type_id=3 bits_offset=64
  [3] INT int size=4 bit_offset=0 nr_bits=32 encoding=SIGNED

  $ ~/local/pahole/build/pahole -F dwarf test/packed_enum.o
  struct s {
          int                        x;                    /*     0     4 */
          enum packed_enum           e;                    /*     4     1 */

          /* XXX 3 bytes hole, try to pack */

          int                        y;                    /*     8     4 */

          /* size: 12, cachelines: 1, members: 3 */
          /* sum members: 9, holes: 1, sum holes: 3 */
          /* last cacheline: 12 bytes */
  };

  $ ~/local/pahole/build/pahole -F btf test/packed_enum.o
  struct s {
          int                        x;                    /*     0     4 */
          nameless base type!        e;                    /*     4     1 */

          /* XXX 3 bytes hole, try to pack */

          int                        y;                    /*     8     4 */

          /* size: 12, cachelines: 1, members: 3 */
          /* sum members: 9, holes: 1, sum holes: 3 */
          /* last cacheline: 12 bytes */
  };

Notice how pahole's log doesn't have a mention of encoding 'packed_enum'
(anonymous integer is generated instead), which causes 'nameless base
type!' output above.

Fix this change:

  $ ~/local/pahole/build/pahole -JV test/packed_enum.o
  File test/packed_enum.o:
  [1] ENUM packed_enum size=1 vlen=3
          VALUE1 val=0
          VALUE2 val=1
          VALUE3 val=2
  [2] STRUCT s kind_flag=0 size=12 vlen=3
          x type_id=3 bits_offset=0
          e type_id=1 bits_offset=32
          y type_id=3 bits_offset=64
  [3] INT int size=4 bit_offset=0 nr_bits=32 encoding=SIGNED

  $ ~/local/pahole/build/pahole -F btf test/packed_enum.o
  struct s {
          int                        x;                    /*     0     4 */
          enum packed_enum           e;                    /*     4     1 */

          /* XXX 3 bytes hole, try to pack */

          int                        y;                    /*     8     4 */

          /* size: 12, cachelines: 1, members: 3 */
          /* sum members: 9, holes: 1, sum holes: 3 */
          /* last cacheline: 12 bytes */
  };

  $ PAHOLE=~/local/pahole/build/pahole ./btfdiff test/packed_enum.o

Also verified on pahole, kernel and glibc:

  $ PAHOLE=~/local/pahole/build/pahole ./btfdiff ~/local/btf/pahole.debug
  $ PAHOLE=~/local/pahole/build/pahole ./btfdiff ~/local/btf/libc-2.28.so.debug
  $ PAHOLE=~/local/pahole/build/pahole ./btfdiff ~/local/btf/vmlinux4

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: Yonghong Song <yhs@fb.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@fb.com>
Cc: bpf@vger.kernel.org
Cc: dwarves@vger.kernel.org
Fixes: b18354f64c ("btf: Generate correct struct bitfield member types")
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Andrii Nakryiko 2019-02-25 17:19:27 -08:00 committed by Arnaldo Carvalho de Melo
parent 8f4f280163
commit a9afcc65fc
1 changed files with 0 additions and 9 deletions

View File

@ -116,15 +116,6 @@ static int32_t enumeration_type__encode(struct btf_elf *btfe, struct tag *tag)
struct enumerator *pos;
int32_t type_id;
/* if enumerator bit_size is not 32, generate an int type instead. */
if (etype->size != 32) {
struct base_type bt = {};
bt.bit_size = etype->size;
bt.is_signed = true;
return btf_elf__add_base_type(btfe, &bt);
}
type_id = btf_elf__add_enum(btfe, etype->namespace.name, etype->size, etype->nr_members);
if (type_id < 0)
return type_id;