aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-decl.c
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
commitb09ad6eae985c6cf3138775de8e712bc116b4166 (patch)
treec4340a2974f343d6b6492995ae6309376e5d9316 /libctf/ctf-decl.c
parent5519536196e670c3c0fb2b138acc44049227e724 (diff)
downloadgdb-b09ad6eae985c6cf3138775de8e712bc116b4166.zip
gdb-b09ad6eae985c6cf3138775de8e712bc116b4166.tar.gz
gdb-b09ad6eae985c6cf3138775de8e712bc116b4166.tar.bz2
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.
Diffstat (limited to 'libctf/ctf-decl.c')
-rw-r--r--libctf/ctf-decl.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/libctf/ctf-decl.c b/libctf/ctf-decl.c
index f18ca96..232ff5d 100644
--- a/libctf/ctf-decl.c
+++ b/libctf/ctf-decl.c
@@ -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)
cd->cd_qualp = prec;
- /* C array declarators are ordered inside out so prepend them. Also by
- convention qualifiers of base types precede the type specifier (e.g.
+ /* By convention qualifiers of base types precede the type specifier (e.g.
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);
else
ctf_list_append (&cd->cd_nodes[prec], cdp);