]> Cypherpunks repositories - gostls13.git/commit
debug/dwarf: fix problems with handling of bit offsets for bitfields
authorThan McIntosh <thanm@google.com>
Tue, 25 Jan 2022 14:34:35 +0000 (09:34 -0500)
committerThan McIntosh <thanm@google.com>
Fri, 28 Jan 2022 20:07:54 +0000 (20:07 +0000)
commit8314544bd6b3c5f0bee89a6bd411ced0aeba1a8c
tree31616ac8103c08e0d783a54f5aba28b372744f58
parent9ff00398489d9eb1822b3de028cd6ccf5674ebb3
debug/dwarf: fix problems with handling of bit offsets for bitfields

This patch reworks the handling of the DWARF DW_AT_bit_offset and
DW_AT_data_bit_offset attributes to resolve problems arising from
a previous related change (CL 328709).

In CL 328709 the DWARF type reader was updated to look for and use
the DW_AT_data_bit_offset attribute for structure fields, handling
the value of the attribute in the same way as for DW_AT_bit_offset.
This caused problems for clients, since the two attributes have very
different semantics.

This CL effectively reverts CL 328709 and moves to a scheme in which
we detect and report the two attributes separately/independently.

This patch also corrects a problem in the DWARF type reader in the
code that detects and fixes up the type of struct fields corresponding
to zero-length arrays; the code in question was testing the
DW_AT_bit_offset attribute value but assuming DW_AT_data_bit_offset
semantics, meaning that it would fail to fix up cases such as

  typedef struct another_struct {
    unsigned short quix;
    int xyz[0];
    unsigned  x:1;
    long long array[40];
  } t;

The code in question has been changed to avoid using BitOffset and
instead consider only ByteOffset and BitSize.

Fixes #50685.
Updates #46784.

Change-Id: Ic15ce01c851af38ebd81af827973ec49badcab6f
Reviewed-on: https://go-review.googlesource.com/c/go/+/380714
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
api/go1.18.txt
src/debug/dwarf/testdata/bitfields.c [new file with mode: 0644]
src/debug/dwarf/testdata/bitfields.elf4 [new file with mode: 0644]
src/debug/dwarf/testdata/typedef.elf5 [new file with mode: 0644]
src/debug/dwarf/type.go
src/debug/dwarf/type_test.go