Go to file
Yonghong Song 0d2511fd1d btf: Fix bitfield encoding
The btf bitfield encoding is broken.

For the following example:

  -bash-4.2$ cat t.c
  struct t {
     int a:2;
     int b:1;
     int :3;
     int c:1;
     int d;
     char e:1;
     char f:1;
     int g;
  };
  void test(struct t *t) {
     return;
  }
  -bash-4.2$ clang -S -g -emit-llvm t.c

The output for bpf "little and big" endian results with pahole dwarf2btf
conversion:

  -bash-4.2$ llc -march=bpfel -mattr=dwarfris -filetype=obj t.ll
  -bash-4.2$ pahole -JV t.o
  [1] PTR (anon) type_id=2
  [2] STRUCT t size=16 vlen=7
        a type_id=5 bits_offset=30
        b type_id=6 bits_offset=29
        c type_id=6 bits_offset=25
        d type_id=3 bits_offset=32
        e type_id=7 bits_offset=71
        f type_id=7 bits_offset=70
        g type_id=3 bits_offset=96
  [3] INT int size=4 bit_offset=0 nr_bits=32 encoding=SIGNED
  [4] INT char size=1 bit_offset=0 nr_bits=8 encoding=(none)
  [5] INT int size=1 bit_offset=0 nr_bits=2 encoding=(none)
  [6] INT int size=1 bit_offset=0 nr_bits=1 encoding=(none)
  [7] INT char size=1 bit_offset=0 nr_bits=1 encoding=(none)
  -bash-4.2$ llc -march=bpfeb -mattr=dwarfris -filetype=obj t.ll
  -bash-4.2$ pahole -JV t.o
  [1] PTR (anon) type_id=2
  [2] STRUCT t size=16 vlen=7
        a type_id=5 bits_offset=0
        b type_id=6 bits_offset=2
        c type_id=6 bits_offset=6
        d type_id=3 bits_offset=32
        e type_id=7 bits_offset=64
        f type_id=7 bits_offset=65
        g type_id=3 bits_offset=96
  [3] INT int size=4 bit_offset=0 nr_bits=32 encoding=SIGNED
  [4] INT char size=1 bit_offset=0 nr_bits=8 encoding=(none)
  [5] INT int size=1 bit_offset=0 nr_bits=2 encoding=(none)
  [6] INT int size=1 bit_offset=0 nr_bits=1 encoding=(none)
  [7] INT char size=1 bit_offset=0 nr_bits=1 encoding=(none)

The BTF struct member bits_offset counts bits from the beginning of the
containing entity regardless of endianness, similar to what
DW_AT_bit_offset from DWARF4 does. Such counting is equivalent to the
big endian conversion in the above.

But the little endian conversion is not correct since dwarf generates
DW_AT_bit_offset based on actual bit position in the little endian
architecture.  For example, for the above struct member "a", the dwarf
would generate DW_AT_bit_offset=30 for little endian, and
DW_AT_bit_offset=0 for big endian.

This patch fixed the little endian structure member bits_offset problem
with proper calculation based on dwarf attributes.

With the fix, we get:

  -bash-4.2$ llc -march=bpfel -mattr=dwarfris -filetype=obj t.ll
  -bash-4.2$ pahole -JV t.o
    [1] STRUCT t size=16 vlen=7
        a type_id=5 bits_offset=0
        b type_id=6 bits_offset=2
        c type_id=6 bits_offset=6
        d type_id=2 bits_offset=32
        e type_id=7 bits_offset=64
        f type_id=7 bits_offset=65
        g type_id=2 bits_offset=96
    [2] INT int size=4 bit_offset=0 nr_bits=32 encoding=SIGNED
    [3] INT char size=1 bit_offset=0 nr_bits=8 encoding=(none)
    [4] PTR (anon) type_id=1
    [5] INT int size=1 bit_offset=0 nr_bits=2 encoding=(none)
    [6] INT int size=1 bit_offset=0 nr_bits=1 encoding=(none)
    [7] INT char size=1 bit_offset=0 nr_bits=1 encoding=(none)
  -bash-4.2$ llc -march=bpfeb -mattr=dwarfris -filetype=obj t.ll
  -bash-4.2$ pahole -JV t.o
  [1] PTR (anon) type_id=2
  [2] STRUCT t size=16 vlen=7
        a type_id=5 bits_offset=0
        b type_id=6 bits_offset=2
        c type_id=6 bits_offset=6
        d type_id=3 bits_offset=32
        e type_id=7 bits_offset=64
        f type_id=7 bits_offset=65
        g type_id=3 bits_offset=96
  [3] INT int size=4 bit_offset=0 nr_bits=32 encoding=SIGNED
  [4] INT char size=1 bit_offset=0 nr_bits=8 encoding=(none)
  [5] INT int size=1 bit_offset=0 nr_bits=2 encoding=(none)
  [6] INT int size=1 bit_offset=0 nr_bits=1 encoding=(none)
  [7] INT char size=1 bit_offset=0 nr_bits=1 encoding=(none)
  -bash-4.2$

For both little endian and big endian, we have correct and
same bits_offset for struct members.

We could fix pos->bit_offset, but pos->bit_offset will be inconsistent
to pos->bitfield_offset in the meaning and pos->bitfield_offset is used
to print out pahole data structure:

  -bash-4.2$ llc -march=bpfel -mattr=dwarfris -filetype=obj t.ll
  -bash-4.2$ /bin/pahole t.o
  struct t {
        int                        a:2;                  /*     0:30  4 */
        int                        b:1;                  /*     0:29  4 */
        int                        c:1;                  /*     0:25  4 */
  .....

So this patch just made the change in btf specific routines.

Signed-off-by: Yonghong Song <yhs@fb.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Cc: Alexei Starovoitov <ast@fb.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-09-17 11:44:58 -03:00
cmake/modules cmake: Add comments explaining build_id and fedora/rh detection 2009-06-27 13:32:20 -03:00
lib [LICENSE]: Add COPYING file and add missing license info on some files 2007-12-17 14:15:42 -02:00
man-pages man-pages: Add entry for --hex 2017-09-05 10:13:06 -03:00
ostra [OSTRA]: Change ostra-cg license to GPLv2 2007-12-24 12:25:17 -02:00
rpm/SPECS v1.12 - New Release 2018-08-16 16:15:27 -03:00
CMakeLists.txt v1.12 - New Release 2018-08-16 16:15:27 -03:00
COPYING [LICENSE]: Add COPYING file and add missing license info on some files 2007-12-17 14:15:42 -02:00
MANIFEST MANIFEST: Add missing COPYING file 2018-09-11 11:22:41 -03:00
NEWS v1.12 - New Release 2018-08-16 16:15:27 -03:00
README [CMAKE]: Make the default install prefix be /usr/local 2007-04-19 18:01:47 -03:00
README.DEBUG README.DEBUG: Add an extra step to make the instructions cut'n'exec 2017-12-14 14:15:54 -03:00
README.btf README.btf: Add section on validating the .BTF section via the kernel 2018-08-16 12:05:29 -03:00
README.ctracer ctracer: update README.ctracer, f9 has the dwarves 2008-10-29 08:54:53 -02:00
btf.h btf: Add BTF support 2018-07-25 14:42:06 -03:00
btf_encoder.c btf: Fix bitfield encoding 2018-09-17 11:44:58 -03:00
btf_encoder.h btf: Add BTF support 2018-07-25 14:42:06 -03:00
codiff.c dwarves: Support static class data members 2012-08-20 14:42:17 -03:00
config.h.cmake [DWARVES] Fixes a FIXME relating to a missing elf (libdw) symbol check. 2008-02-12 21:08:49 -02:00
ctf.h libctf: Use the same coding style as the dwarves 2008-09-25 16:01:26 -03:00
ctf_encoder.c dwarves_fprintf: Fix printf types on 64bit linux 2013-03-20 15:56:38 -03:00
ctf_encoder.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
ctf_loader.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
ctfdwdiff ctfdwdiff: Don't ask for variables and inline expansions in pfunct 2009-03-31 19:21:46 -03:00
ctracer.c dwarves_fprintf: Shorten class__fprintf() sig 2016-06-29 16:19:20 -03:00
dtagnames.c dwarves: Use cus__fprintf_load_files_err() in the remaining tools 2016-03-15 14:29:57 -03:00
dutil.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
dutil.h dutil: Add ____ilog2_NaN declaration to silence compiler warning 2016-03-15 11:42:16 -03:00
dwarf_loader.c dwarf_loader: Process DW_AT_count in DW_TAG_subrange_type 2018-08-28 12:40:10 -03:00
dwarves.c dwarves: Fix cus__load_files() success return value 2017-12-14 14:14:56 -03:00
dwarves.h dwarves_fprintf: Find holes on structs embedded in other structs 2016-06-30 16:18:11 -03:00
dwarves_emit.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
dwarves_emit.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
dwarves_fprintf.c dwarves_fprintf: Print cacheline boundaries in multiple union members 2018-07-28 14:25:30 -03:00
dwarves_reorganize.c dwarves_fprintf: Shorten class__fprintf() sig 2016-06-29 16:19:20 -03:00
dwarves_reorganize.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
elf_symtab.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
elf_symtab.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
elfcreator.c Add scncopy - like object copy but tries not to change section content 2010-01-12 14:23:32 -02:00
elfcreator.h Add scncopy - like object copy but tries not to change section content 2010-01-12 14:23:32 -02:00
gobuffer.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
gobuffer.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
hash.h [DWARVES]: Use a hash table for the tags in a CU 2008-02-11 11:47:17 -02:00
libbtf.c btf: Fix bitfield encoding 2018-09-17 11:44:58 -03:00
libbtf.h btf: Fix bitfield encoding 2018-09-17 11:44:58 -03:00
libctf.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
libctf.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
list.h coding style: remove trailing whitespaces, etc 2009-03-14 13:50:36 -03:00
pahole.c btf: Add BTF support 2018-07-25 14:42:06 -03:00
pdwtags.c dwarves: Update e-mail address 2016-06-28 14:24:41 -03:00
pfunct.c pahole: Search and use running kernel vmlinux when no file is passed 2017-11-24 11:24:16 -03:00
pglobal.c dwarves: Use cus__fprintf_load_files_err() in the remaining tools 2016-03-15 14:29:57 -03:00
prefcnt.c dwarves: Use cus__fprintf_load_files_err() in the remaining tools 2016-03-15 14:29:57 -03:00
rbtree.c dwarves: Add an rbtree for the functions in a cu 2009-06-04 14:56:44 -03:00
rbtree.h dwarves: Add an rbtree for the functions in a cu 2009-06-04 14:56:44 -03:00
regtest regtest: Accept --diff instad of plain 'diff' as long option 2012-05-14 19:36:58 -03:00
scncopy.c scncopy: Fix minor problems with --usage. 2010-01-12 16:37:27 -02:00
strings.c dwarves: Stop using 'self' 2012-08-17 18:47:15 -03:00
strings.h dwarves: Stop using 'self' 2014-01-06 16:46:50 -03:00
syscse.c dwarves: Update e-mail address 2016-06-28 14:24:41 -03:00

README

Build instructions:

1. install cmake
2. mkdir build
3. cd build
4. cmake -D__LIB=lib ..
5. make install

Default is to be installed on /usr/local, see rpm spec file for
installing on other places.

Known to work scenarios:

Mandriva Cooker:

cmake 2.4.5-1mdv2007.1
libelfutils1-devel 0.123-1mdv2007.1

Debian Unstable:

cmake 2.4.5-1
libdw-dev 0.123-2

Fedora Core 6:

cmake 2.4.5-2.fc6
elfutils-devel 0.126-1.fc6