aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2021-01-05 13:25:56 +0000
committerNick Alcock <nick.alcock@oracle.com>2021-01-05 14:53:39 +0000
commit91e7ce2fd7b82f3982b453d1c6f4576621bc1c2d (patch)
tree62dcc9d77cb96f81c943367fec427b5c550639c9
parent57f97d0e6dd4dfbb54f2f39c5e59d5860040d0b6 (diff)
downloadgdb-91e7ce2fd7b82f3982b453d1c6f4576621bc1c2d.zip
gdb-91e7ce2fd7b82f3982b453d1c6f4576621bc1c2d.tar.gz
gdb-91e7ce2fd7b82f3982b453d1c6f4576621bc1c2d.tar.bz2
libctf, ld: more dumper improvements
Dump more details about the types found in data object and function info sections (the type ID and recursive info on the type itself, but not on its members). Before now, this was being dumped for entries in the variable section, but not for the closely-related function info and data object sections, which is inconsistent and makes finding the corresponding types in the type section unnecessarily hard. (This also gets rid of code in which bugs have already been found in favour of the same code everything else in the dumper uses to dump types.) While we're doing that, change the recursive type dumper in question to recursively dump info on arrays' element type, just as we do for all types that reference other types. (Arrays are not a kind of reference type in libctf, but perhaps we should change that in future and make ctf_type_reference return the element type.) ld/ChangeLog 2021-01-05 Nick Alcock <nick.alcock@oracle.com> * testsuite/ld-ctf/array.d: Adjust for dumper changes. * testsuite/ld-ctf/data-func-conflicted.d: Likewise. * testsuite/ld-ctf/diag-cttname-null.d: Likewise. * testsuite/ld-ctf/diag-cuname.d: Likewise. * testsuite/ld-ctf/diag-parlabel.d: Likewise. * testsuite/ld-ctf/function.d: Likewise. * testsuite/ld-ctf/slice.d: Likewise. libctf/ChangeLog 2021-01-05 Nick Alcock <nick.alcock@oracle.com> * ctf-dump.c (ctf_dump_objts): Dump by calling ctf_dump_format_type. (ctf_dump_format_type): Don't emit the size for function objects. Dump the element type of arrays like we dump the pointed-to type of pointers, etc.
-rw-r--r--ld/ChangeLog10
-rw-r--r--ld/testsuite/ld-ctf/array.d4
-rw-r--r--ld/testsuite/ld-ctf/data-func-conflicted.d22
-rw-r--r--ld/testsuite/ld-ctf/diag-cttname-null.d2
-rw-r--r--ld/testsuite/ld-ctf/diag-cuname.d2
-rw-r--r--ld/testsuite/ld-ctf/diag-parlabel.d2
-rw-r--r--ld/testsuite/ld-ctf/function.d4
-rw-r--r--ld/testsuite/ld-ctf/slice.d2
-rw-r--r--libctf/ChangeLog7
-rw-r--r--libctf/ctf-dump.c70
10 files changed, 69 insertions, 56 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 21ba58a..a130c6c 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,6 +1,16 @@
2021-01-05 Nick Alcock <nick.alcock@oracle.com>
* testsuite/ld-ctf/array.d: Adjust for dumper changes.
+ * testsuite/ld-ctf/data-func-conflicted.d: Likewise.
+ * testsuite/ld-ctf/diag-cttname-null.d: Likewise.
+ * testsuite/ld-ctf/diag-cuname.d: Likewise.
+ * testsuite/ld-ctf/diag-parlabel.d: Likewise.
+ * testsuite/ld-ctf/function.d: Likewise.
+ * testsuite/ld-ctf/slice.d: Likewise.
+
+2021-01-05 Nick Alcock <nick.alcock@oracle.com>
+
+ * testsuite/ld-ctf/array.d: Adjust for dumper changes.
* testsuite/ld-ctf/conflicting-cycle-1.B-1.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-1.B-2.d: Likewise.
* testsuite/ld-ctf/conflicting-cycle-1.parent.d: Likewise.
diff --git a/ld/testsuite/ld-ctf/array.d b/ld/testsuite/ld-ctf/array.d
index e07d63e..6c3915a 100644
--- a/ld/testsuite/ld-ctf/array.d
+++ b/ld/testsuite/ld-ctf/array.d
@@ -20,8 +20,8 @@ Contents of CTF section .ctf:
Labels:
Data objects:
- digits -> int \[10\]
- digits_names -> char \*\[10\]
+ digits -> 0x[0-9a-f]*: int \[10\] .*
+ digits_names -> 0x[0-9a-f]*: char \*\[10\] .*
Function objects:
diff --git a/ld/testsuite/ld-ctf/data-func-conflicted.d b/ld/testsuite/ld-ctf/data-func-conflicted.d
index 62855f8..e51bb76 100644
--- a/ld/testsuite/ld-ctf/data-func-conflicted.d
+++ b/ld/testsuite/ld-ctf/data-func-conflicted.d
@@ -20,12 +20,12 @@ Contents of CTF section \.ctf:
String section: .*
#...
Data objects:
- bar -> struct var_3
- var_1 -> foo_t
- var_666 -> foo_t \*
+ bar -> 0x[0-9a-f]*: struct var_3 \(size 0x[0-9a-f]*\)
+ var_1 -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_666 -> 0x[0-9a-f]*: foo_t \* \(size 0x[0-9a-f]*\) -> .*
Function objects:
- func_[0-9]* -> void \*\(\*\) \(const char \*restrict, int \(\*\)\(\*\) \(const char \*\)\)
+ func_[0-9]* -> 0x[0-9a-f]*: void \*\(\*\) \(const char \*restrict, int \(\*\)\(\*\) \(const char \*\)\)
#...
Types:
#...
@@ -46,13 +46,13 @@ CTF archive member: .*/data-func-1\.c:
Labels:
Data objects:
- var_[0-9]* -> foo_t
- var_[0-9]* -> foo_t
- var_[0-9]* -> foo_t
- var_[0-9]* -> foo_t
- var_[0-9]* -> foo_t
- var_[0-9]* -> foo_t
- var_[0-9]* -> foo_t
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
+ var_[0-9]* -> 0x[0-9a-f]*: foo_t \(size 0x[0-9a-f]*\) -> .*
#...
Function objects:
diff --git a/ld/testsuite/ld-ctf/diag-cttname-null.d b/ld/testsuite/ld-ctf/diag-cttname-null.d
index 00db425..86a7fd1 100644
--- a/ld/testsuite/ld-ctf/diag-cttname-null.d
+++ b/ld/testsuite/ld-ctf/diag-cttname-null.d
@@ -13,7 +13,7 @@ Contents of CTF section .ctf:
Version: 4 \(CTF_VERSION_3\)
#...
Data objects:
- a -> struct
+ a -> 0x[0-9a-f]*: struct \(size 0x[0-9a-f]*\)
#...
Types:
#...
diff --git a/ld/testsuite/ld-ctf/diag-cuname.d b/ld/testsuite/ld-ctf/diag-cuname.d
index 19a4bfd..20624fd 100644
--- a/ld/testsuite/ld-ctf/diag-cuname.d
+++ b/ld/testsuite/ld-ctf/diag-cuname.d
@@ -21,7 +21,7 @@ Contents of CTF section .ctf:
Labels:
Data objects:
- a -> struct A
+ a -> 0x[0-9a-f]*: struct A \(size 0x[0-9a-f]*\)
#...
Function objects:
diff --git a/ld/testsuite/ld-ctf/diag-parlabel.d b/ld/testsuite/ld-ctf/diag-parlabel.d
index b2b047c..5ad5870 100644
--- a/ld/testsuite/ld-ctf/diag-parlabel.d
+++ b/ld/testsuite/ld-ctf/diag-parlabel.d
@@ -20,7 +20,7 @@ Contents of CTF section .ctf:
Labels:
Data objects:
- a -> struct A
+ a -> 0x[0-9a-f]*: struct A \(size 0x[0-9a-f]*\)
#...
Function objects:
diff --git a/ld/testsuite/ld-ctf/function.d b/ld/testsuite/ld-ctf/function.d
index 241adc2..9bf26a4 100644
--- a/ld/testsuite/ld-ctf/function.d
+++ b/ld/testsuite/ld-ctf/function.d
@@ -18,10 +18,10 @@ Contents of CTF section .ctf:
String section: .*
#...
Function objects:
- foo -> int \(\*\) \(char, int, float, void \*, void \(\*\)\(\*\) \(int\)\)
+ foo -> 0x[0-9a-f]*: int \(\*\) \(char, int, float, void \*, void \(\*\)\(\*\) \(int\)\)
#...
Types:
#...
- 0x[0-9a-f]*: int \(\*\) \(char, int, float, void \*, void \(\*\)\(\*\) \(int\)\) \(size 0x0\)
+ 0x[0-9a-f]*: int \(\*\) \(char, int, float, void \*, void \(\*\)\(\*\) \(int\)\)
*\[0x0\] \(ID 0x[0-9a-f]*\) \(kind 5\) int \(\*\) \(char, int[0-9]*, float, void \*, void \(\*\)\(\*\) \(int\)\) \(aligned at 0x[0-9a-f]*\)
#...
diff --git a/ld/testsuite/ld-ctf/slice.d b/ld/testsuite/ld-ctf/slice.d
index e42ffdf..3967a2d 100644
--- a/ld/testsuite/ld-ctf/slice.d
+++ b/ld/testsuite/ld-ctf/slice.d
@@ -19,7 +19,7 @@ Contents of CTF section .ctf:
String section: .*
#...
Data objects:
- slices -> struct slices
+ slices -> 0x[0-9a-f]*: struct slices \(size 0x[0-9a-f]*\)
#...
Types:
#...
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 99f9022..80f05e9 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,5 +1,12 @@
2021-01-05 Nick Alcock <nick.alcock@oracle.com>
+ * ctf-dump.c (ctf_dump_objts): Dump by calling ctf_dump_format_type.
+ (ctf_dump_format_type): Don't emit the size for function objects.
+ Dump the element type of arrays like we dump the pointed-to type of
+ pointers, etc.
+
+2021-01-05 Nick Alcock <nick.alcock@oracle.com>
+
* ctf-dump.c (ctf_dump_format_type): Add 0x to hex type IDs.
(ctf_dump_header): Add 0x to the hex magic number.
(ctf_dump_str): Add 0x to the hex string offsets.
diff --git a/libctf/ctf-dump.c b/libctf/ctf-dump.c
index ee22f77..f01f225 100644
--- a/libctf/ctf-dump.c
+++ b/libctf/ctf-dump.c
@@ -93,6 +93,8 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag)
do
{
ctf_encoding_t enc;
+ ctf_arinfo_t ar;
+ int kind, unsliced_kind;
const char *nonroot_leader = "";
const char *nonroot_trailer = "";
@@ -123,26 +125,25 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag)
bit = NULL;
if (buf[0] != '\0')
- {
- str = str_append (str, buf);
- str = str_append (str, " ");
- }
+ str = str_append (str, buf);
free (buf);
buf = NULL;
+ unsliced_kind = ctf_type_kind_unsliced (fp, id);
+ kind = ctf_type_kind (fp, id);
/* Slices get a different print representation. */
- if (ctf_type_kind_unsliced (fp, id) == CTF_K_SLICE)
+ if (unsliced_kind == CTF_K_SLICE)
{
ctf_type_encoding (fp, id, &enc);
- if (asprintf (&bit, "[slice 0x%x:0x%x] ",
+ if (asprintf (&bit, " [slice 0x%x:0x%x]",
enc.cte_offset, enc.cte_bits) < 0)
goto oom;
}
- else if (ctf_type_kind (fp, id) == CTF_K_INTEGER)
+ else if (kind == CTF_K_INTEGER)
{
ctf_type_encoding (fp, id, &enc);
- if (asprintf (&bit, "[0x%x:0x%x] ",
+ if (asprintf (&bit, " [0x%x:0x%x]",
enc.cte_offset, enc.cte_bits) < 0)
goto oom;
}
@@ -150,16 +151,27 @@ ctf_dump_format_type (ctf_dict_t *fp, ctf_id_t id, int flag)
free (bit);
bit = NULL;
- if (asprintf (&bit, "(size 0x%lx)%s",
- (unsigned long) ctf_type_size (fp, id),
- nonroot_trailer) < 0)
- goto oom;
+ if (kind != CTF_K_FUNCTION)
+ if (asprintf (&bit, " (size 0x%lx)%s",
+ (unsigned long) ctf_type_size (fp, id),
+ nonroot_trailer) < 0)
+ goto oom;
str = str_append (str, bit);
free (bit);
bit = NULL;
- new_id = ctf_type_reference (fp, id);
+ /* Keep going as long as this type references another. We consider arrays
+ to "reference" their element type. */
+
+ if (kind == CTF_K_ARRAY)
+ {
+ if (ctf_array_info (fp, id, &ar) < 0)
+ goto err;
+ new_id = ar.ctr_contents;
+ }
+ else
+ new_id = ctf_type_reference (fp, id);
if (new_id != CTF_ERR)
str = str_append (str, " ->");
} while (new_id != CTF_ERR);
@@ -383,36 +395,26 @@ ctf_dump_objts (ctf_dict_t *fp, ctf_dump_state_t *state, int functions)
while ((id = ctf_symbol_next (fp, &i, &name, functions)) != CTF_ERR)
{
char *typestr = NULL;
- int err = 0;
- /* Emit the name, if we know it. */
+ /* Emit the name, if we know it. No trailing space: ctf_dump_format_type
+ has a leading one. */
if (name)
{
- if (asprintf (&str, "%s -> ", name) < 0)
+ if (asprintf (&str, "%s ->", name) < 0)
goto oom;
}
else
str = xstrdup ("");
- if ((typestr = ctf_type_aname (fp, id)) == NULL)
+ if ((typestr = ctf_dump_format_type (state->cds_fp, id,
+ CTF_ADD_ROOT)) == NULL)
{
- if (id == 0 || ctf_errno (fp) == ECTF_NONREPRESENTABLE)
- {
- if (asprintf (&typestr, " (%s)", _("type not represented in CTF")) < 0)
- goto oom;
-
- goto out;
- }
-
- if (asprintf (&typestr, _("error: %s"), ctf_errmsg (ctf_errno (fp))) < 0)
- goto oom;
-
- err = -1;
- goto out;
+ ctf_dump_append (state, str);
+ continue; /* Swallow the error. */
}
str = str_append (str, typestr);
- str = str_append (str, "\n");
+ free (typestr);
ctf_dump_append (state, str);
continue;
@@ -420,12 +422,6 @@ ctf_dump_objts (ctf_dict_t *fp, ctf_dump_state_t *state, int functions)
ctf_set_errno (fp, ENOMEM);
ctf_next_destroy (i);
return -1;
- out:
- str = str_append (str, typestr);
- free (typestr);
- ctf_dump_append (state, str);
- ctf_next_destroy (i);
- return err; /* errno is set for us. */
}
return 0;
}