[PATCH 13/13] libctf, ld: fix formatting of forwards to unions and enums
Nick Alcock
nick.alcock@oracle.com
Fri Dec 18 19:51:47 GMT 2020
The type printer was unconditionally printing these as if they were
forwards to structs, even if they were forwards to unions or enums.
ld/ChangeLog
2020-12-15 Nick Alcock <nick.alcock@oracle.com>
* testsuite/ld-ctf/enum-forward.c: New test.
* testsuite/ld-ctf/enum-forward.c: New results.
libctf/ChangeLog
2020-12-15 Nick Alcock <nick.alcock@oracle.com>
* ctf-types.c (ctf_type_aname): Print forwards to unions and enums
properly.
---
ld/testsuite/ld-ctf/enum-forward.c | 2 ++
ld/testsuite/ld-ctf/enum-forward.d | 20 ++++++++++++++++++++
libctf/ctf-types.c | 21 ++++++++++++++++++++-
3 files changed, 42 insertions(+), 1 deletion(-)
create mode 100644 ld/testsuite/ld-ctf/enum-forward.c
create mode 100644 ld/testsuite/ld-ctf/enum-forward.d
diff --git a/ld/testsuite/ld-ctf/enum-forward.c b/ld/testsuite/ld-ctf/enum-forward.c
new file mode 100644
index 00000000000..e0a64b85c74
--- /dev/null
+++ b/ld/testsuite/ld-ctf/enum-forward.c
@@ -0,0 +1,2 @@
+enum vibgyor;
+char * (*get_color_name) (enum vibgyor);
diff --git a/ld/testsuite/ld-ctf/enum-forward.d b/ld/testsuite/ld-ctf/enum-forward.d
new file mode 100644
index 00000000000..a83651eb4b8
--- /dev/null
+++ b/ld/testsuite/ld-ctf/enum-forward.d
@@ -0,0 +1,20 @@
+#as:
+#source: enum-forward.c
+#objdump: --ctf=.ctf
+#ld: -shared
+#name: Forwards to enums
+
+.*: +file format .*
+
+Contents of CTF section .ctf:
+
+ Header:
+ Magic number: 0xdff2
+ Version: 4 \(CTF_VERSION_3\)
+#...
+ Type section: .* \(0x48 bytes\)
+#...
+ Data objects:
+ get_color_name -> 0x[0-9a-f]*: \(kind 3\) char \*\*\(\*\) \(enum vibgyor\) \(size 0x[0-9a-f]*\) \(aligned at 0x[0-9a-f]*\) -> 0x[0-9a-f]*: \(kind 5\) char \*\(\*\) \(enum vibgyor\) \(aligned at 0x[0-9a-f]*\)
+
+#...
diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c
index 1b808f6d487..a5bf85b008c 100644
--- a/libctf/ctf-types.c
+++ b/libctf/ctf-types.c
@@ -834,7 +834,6 @@ ctf_type_aname (ctf_dict_t *fp, ctf_id_t type)
}
break;
case CTF_K_STRUCT:
- case CTF_K_FORWARD:
ctf_decl_sprintf (&cd, "struct %s", name);
break;
case CTF_K_UNION:
@@ -843,6 +842,26 @@ ctf_type_aname (ctf_dict_t *fp, ctf_id_t type)
case CTF_K_ENUM:
ctf_decl_sprintf (&cd, "enum %s", name);
break;
+ case CTF_K_FORWARD:
+ {
+ switch (ctf_type_kind_forwarded (fp, cdp->cd_type))
+ {
+ case CTF_K_STRUCT:
+ ctf_decl_sprintf (&cd, "struct %s", name);
+ break;
+ case CTF_K_UNION:
+ ctf_decl_sprintf (&cd, "union %s", name);
+ break;
+ case CTF_K_ENUM:
+ ctf_decl_sprintf (&cd, "enum %s", name);
+ break;
+ default:
+ ctf_set_errno (fp, ECTF_CORRUPT);
+ ctf_decl_fini (&cd);
+ return NULL;
+ }
+ break;
+ }
case CTF_K_VOLATILE:
ctf_decl_sprintf (&cd, "volatile");
break;
--
2.29.2.250.g8336e49d6f.dirty
More information about the Binutils
mailing list