diff --git a/ld/ChangeLog b/ld/ChangeLog index 213aed02ec..b939f616f3 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2021-01-05 Nick Alcock + + * testsuite/ld-ctf/enum-forward.c: New test. + * testsuite/ld-ctf/enum-forward.c: New results. + 2021-01-05 Nick Alcock * testsuite/ld-ctf/array.d: Adjust for dumper changes. diff --git a/ld/testsuite/ld-ctf/enum-forward.c b/ld/testsuite/ld-ctf/enum-forward.c new file mode 100644 index 0000000000..e0a64b85c7 --- /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 0000000000..a83651eb4b --- /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/ChangeLog b/libctf/ChangeLog index 4c62cf1f2f..0aaf3067ab 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,3 +1,8 @@ +2021-01-05 Nick Alcock + + * ctf-types.c (ctf_type_aname): Print forwards to unions and enums + properly. + 2021-01-05 Nick Alcock * ctf-impl.h (ctf_dict_t) : New. diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index 6275be0058..4129fbc7b8 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;