diff options
| author | Than McIntosh <thanm@google.com> | 2022-01-25 09:34:35 -0500 |
|---|---|---|
| committer | Than McIntosh <thanm@google.com> | 2022-01-28 20:07:54 +0000 |
| commit | 8314544bd6b3c5f0bee89a6bd411ced0aeba1a8c (patch) | |
| tree | 31616ac8103c08e0d783a54f5aba28b372744f58 /src/debug/dwarf/testdata | |
| parent | 9ff00398489d9eb1822b3de028cd6ccf5674ebb3 (diff) | |
| download | go-8314544bd6b3c5f0bee89a6bd411ced0aeba1a8c.tar.xz | |
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>
Diffstat (limited to 'src/debug/dwarf/testdata')
| -rw-r--r-- | src/debug/dwarf/testdata/bitfields.c | 17 | ||||
| -rw-r--r-- | src/debug/dwarf/testdata/bitfields.elf4 | bin | 0 -> 2464 bytes | |||
| -rw-r--r-- | src/debug/dwarf/testdata/typedef.elf5 | bin | 0 -> 6016 bytes |
3 files changed, 17 insertions, 0 deletions
diff --git a/src/debug/dwarf/testdata/bitfields.c b/src/debug/dwarf/testdata/bitfields.c new file mode 100644 index 0000000000..05833336c9 --- /dev/null +++ b/src/debug/dwarf/testdata/bitfields.c @@ -0,0 +1,17 @@ +// Copyright 2022 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Linux ELF: +gcc -gdwarf-4 -m64 -c bitfields.c -o bitfields.elf4 +*/ + +typedef struct another_struct { + unsigned short quix; + int xyz[0]; + unsigned x:1; + long long array[40]; +} t_another_struct; +t_another_struct q2; + diff --git a/src/debug/dwarf/testdata/bitfields.elf4 b/src/debug/dwarf/testdata/bitfields.elf4 Binary files differnew file mode 100644 index 0000000000..2e06e68ce9 --- /dev/null +++ b/src/debug/dwarf/testdata/bitfields.elf4 diff --git a/src/debug/dwarf/testdata/typedef.elf5 b/src/debug/dwarf/testdata/typedef.elf5 Binary files differnew file mode 100644 index 0000000000..aec48f6452 --- /dev/null +++ b/src/debug/dwarf/testdata/typedef.elf5 |
