libctf: do not print array declarators backwards

The CTF declarator stack code (used by ctf_type_aname() and thus
ultimately by ctf-dump.c and objdump --ctf etc) contains careful
code to prepend array declarators to the stack it's building up
on the grounds that array declarators are ordered inside out: only
they're not, they're ordered outside in.

This has led to our (non-upstreamed) compiler emitting array declarators
backwards for years, because it looks backwards in the dumper unless
it's actually emitted backwards into the CTF so the dumper can wrongly
reverse it again: but

  int[5][6]

should be an array of 6 int[5]s, not an array of 5 int[6]'s, so even if
the dumper gets it right, actual users calling ctf_array_info are going
to see a completely wrong type graph with the wrong bounds in it.

Fix trivial.

libctf/ChangeLog
2021-01-05  Nick Alcock  <nick.alcock@oracle.com>

	* ctf-decl.c (ctf_decl_push): Don't print array decls backwards.
This commit is contained in:
Nick Alcock 2021-01-05 13:25:56 +00:00
parent 5519536196
commit b09ad6eae9
2 changed files with 6 additions and 3 deletions

@ -1,3 +1,7 @@
2021-01-05 Nick Alcock <nick.alcock@oracle.com>
* ctf-decl.c (ctf_decl_push): Don't print array decls backwards.
2021-01-04 Nicolas Boulenguez <nicolas@debian.org> 2021-01-04 Nicolas Boulenguez <nicolas@debian.org>
PR 27117 PR 27117

@ -152,11 +152,10 @@ ctf_decl_push (ctf_decl_t *cd, ctf_dict_t *fp, ctf_id_t type)
if (prec > cd->cd_qualp && prec < CTF_PREC_ARRAY) if (prec > cd->cd_qualp && prec < CTF_PREC_ARRAY)
cd->cd_qualp = prec; cd->cd_qualp = prec;
/* C array declarators are ordered inside out so prepend them. Also by /* By convention qualifiers of base types precede the type specifier (e.g.
convention qualifiers of base types precede the type specifier (e.g.
const int vs. int const) even though the two forms are equivalent. */ const int vs. int const) even though the two forms are equivalent. */
if (kind == CTF_K_ARRAY || (is_qual && prec == CTF_PREC_BASE)) if (is_qual && prec == CTF_PREC_BASE)
ctf_list_prepend (&cd->cd_nodes[prec], cdp); ctf_list_prepend (&cd->cd_nodes[prec], cdp);
else else
ctf_list_append (&cd->cd_nodes[prec], cdp); ctf_list_append (&cd->cd_nodes[prec], cdp);