public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug debug/111735] New: incorrect BTF representation of forward-declared enums
@ 2023-10-09 11:37 gprocida at google dot com
  2023-12-05 23:05 ` [Bug debug/111735] " david.faust at oracle dot com
  2023-12-19 18:00 ` cvs-commit at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: gprocida at google dot com @ 2023-10-09 11:37 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111735

            Bug ID: 111735
           Summary: incorrect BTF representation of forward-declared enums
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gprocida at google dot com
  Target Milestone: ---

The BTF_FWD_KIND node can only distinguish between struct and union types.
(Non-standard) forward-declared enum types need to be represented in some
different fashion.

I queried this on LKML in July 2020 and was told that then current way to
represent such types is as BTF_KIND_ENUM with vlen = 0. This is in fact what
both Clang and pahole -J do. I think Clang produces slightly better output than
pahole (leaving size as 0). 

test input:

$ cat /tmp/xx.c
enum Foo;
enum Foo* foo;

compilation command:

$ gcc -gbtf -c /tmp/xx.c -o /tmp/xx.o

unexpected output:

$ bpftool btf dump file /tmp/xx.o format raw 
[1] FWD 'Foo' fwd_kind=struct
[2] PTR '(anon)' type_id=1
[3] VAR 'foo' type_id=2, linkage=global
[4] DATASEC '.bss' size=0 vlen=1
        type_id=3 offset=0 size=8 (VAR 'foo')

possible expected output (size=0):

$ clang-15 -target bpf -g -c /tmp/xx.c -o /tmp/xx.o
$ pahole -J /tmp/xx.o
$ bpftool btf dump file /tmp/xx.o format raw | grep Foo
[2] ENUM 'Foo' encoding=UNSIGNED size=0 vlen=0

other possible expected output (size=4):

$ gcc -g -c /tmp/xx.c -o /tmp/xx.o
$ pahole -J /tmp/xx.o
$ bpftool btf dump file /tmp/xx.o format raw | grep Foo
[1] ENUM 'Foo' encoding=UNSIGNED size=4 vlen=0

GCC version:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/13/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 13.2.0-4'
--with-bugurl=file:///usr/share/doc/gcc-13/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,m2 --prefix=/usr
--with-gcc-major-version-only --program-suffix=-13
--program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id
--libexecdir=/usr/libexec --without-included-gettext --enable-threads=posix
--libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new --enable-gnu-unique-object
--disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib
--enable-libphobos-checking=release --with-target-system-zlib=auto
--enable-objc-gc=auto --enable-multiarch --disable-werror --enable-cet
--with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32
--enable-multilib --with-tune=generic
--enable-offload-targets=nvptx-none=/build/gcc-13-oyarai/gcc-13-13.2.0/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-13-oyarai/gcc-13-13.2.0/debian/tmp-gcn/usr
--enable-offload-defaulted --without-cuda-driver --enable-checking=release
--build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
--with-build-config=bootstrap-lto-lean --enable-link-serialization=28
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.2.0 (Debian 13.2.0-4)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug debug/111735] incorrect BTF representation of forward-declared enums
  2023-10-09 11:37 [Bug debug/111735] New: incorrect BTF representation of forward-declared enums gprocida at google dot com
@ 2023-12-05 23:05 ` david.faust at oracle dot com
  2023-12-19 18:00 ` cvs-commit at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: david.faust at oracle dot com @ 2023-12-05 23:05 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111735

David Faust <david.faust at oracle dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |david.faust at oracle dot com

--- Comment #1 from David Faust <david.faust at oracle dot com> ---
Sorry for the delay, somehow I missed this until now.

Confirmed... though this really ought to be further discussed and
formalized with the kernel BPF folks. As of now, btf.rst does not
specify any representation at all for forward-declared enums. And,
it lists in 'encoding requirements' for BTF_KIND_ENUM that 'size'
must be one of 1/2/4/8, so in a sense this de-facto representation
is not really valid.

IMO it would be better to adjust the BTF_KIND_FWD definition to
support forward-declared enums. CTF for example encodes the kind
of the forward in the 'type' field of its KIND_FWD, which in BTF
is simply unused. Anyway, that can be raised for discussion on
the bpf list.

In the meanwhile, it should not be problematic to adapt GCC to
follow clang and pahole in emitting KIND_ENUM with vlen=0.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug debug/111735] incorrect BTF representation of forward-declared enums
  2023-10-09 11:37 [Bug debug/111735] New: incorrect BTF representation of forward-declared enums gprocida at google dot com
  2023-12-05 23:05 ` [Bug debug/111735] " david.faust at oracle dot com
@ 2023-12-19 18:00 ` cvs-commit at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-12-19 18:00 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111735

--- Comment #2 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by David Faust <dfaust@gcc.gnu.org>:

https://gcc.gnu.org/g:1502d724df85163b14b04e8f67072ca88eac411d

commit r14-6716-g1502d724df85163b14b04e8f67072ca88eac411d
Author: David Faust <david.faust@oracle.com>
Date:   Tue Dec 12 13:55:59 2023 -0800

    btf: change encoding of forward-declared enums [PR111735]

    The BTF specification does not formally define a representation for
    forward-declared enum types such as:

      enum Foo;

    Forward-declarations for struct and union types are represented by
    BTF_KIND_FWD, which has a 1-bit flag distinguishing the two.

    The de-facto standard format used by other tools like clang and pahole
    is to represent forward-declared enums as BTF_KIND_ENUM with vlen=0,
    i.e. as a regular enum type with no enumerators.  This patch changes
    GCC to adopt that format, and makes a couple of minor cleanups in
    btf_asm_type ().

    gcc/

            PR debug/111735
            * btfout.cc (btf_fwd_to_enum_p): New.
            (btf_asm_type_ref): Special case references to enum forwards.
            (btf_asm_type): Special case enum forwards. Rename btf_size_type to
            btf_size, and change chained ifs switching on btf_kind into else
ifs.

    gcc/testsuite/

            PR debug/111735
            * gcc.dg/debug/btf/btf-forward-2.c: New test.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-12-19 18:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-09 11:37 [Bug debug/111735] New: incorrect BTF representation of forward-declared enums gprocida at google dot com
2023-12-05 23:05 ` [Bug debug/111735] " david.faust at oracle dot com
2023-12-19 18:00 ` cvs-commit at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).