aboutsummaryrefslogtreecommitdiff
path: root/src/debug/dwarf/testdata
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2022-01-25 09:34:35 -0500
committerThan McIntosh <thanm@google.com>2022-01-28 20:07:54 +0000
commit8314544bd6b3c5f0bee89a6bd411ced0aeba1a8c (patch)
tree31616ac8103c08e0d783a54f5aba28b372744f58 /src/debug/dwarf/testdata
parent9ff00398489d9eb1822b3de028cd6ccf5674ebb3 (diff)
downloadgo-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.c17
-rw-r--r--src/debug/dwarf/testdata/bitfields.elf4bin0 -> 2464 bytes
-rw-r--r--src/debug/dwarf/testdata/typedef.elf5bin0 -> 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
new file mode 100644
index 0000000000..2e06e68ce9
--- /dev/null
+++ b/src/debug/dwarf/testdata/bitfields.elf4
Binary files differ
diff --git a/src/debug/dwarf/testdata/typedef.elf5 b/src/debug/dwarf/testdata/typedef.elf5
new file mode 100644
index 0000000000..aec48f6452
--- /dev/null
+++ b/src/debug/dwarf/testdata/typedef.elf5
Binary files differ