[resent, since it looks like my Oracle address isn't a subscriber to this list, only my home address, and the reply was probably getting held up in moderation and/or thrown out for being sent via the wrong mailserver...]
On 25 Feb 2026, David Faust verbalised: > Hi Roger, > > On 2/25/26 13:06, Roger Sayle wrote: >> >> The contents of ctf.h have diverged between GCC's version and binutils' >> version, which means that "combined tree" builds are currently broken. >> This patch copies the definition of CTF_F_ARRNELEMS from binutils to >> restore combined-tree builds, using GCC's ctf.h with the libctf >> in binutils. >> >> This patch has been tested with a combined-tree build targeting >> aarch64-elf on a x86_64-pc-linux-gnu host. Ok for mainline? > > Thanks for the patch. I think Nick (added) was just looking at this > problem too, and was thinking rather to remove it (and the code using it) > from binutils. > We definitely better avoid doing both at once... Nick? Argh! Sorry about this. The CTF_F_ARRNELEMS flag turned out to be a bad idea. It was meant to go into GCC at the same time as PR debug/114186 was fixed, to signify that a dict was generated by a GCC with that bug fixed, so we we could dump CTF for dicts before and after that bugfix correctly, but it never did go into GCC. It's of marginal use anyway because even if we did dump it correctly, type graph traversals would still have differed... I have a patch that removes the flag from binutils (written by Bruce a couple of weeks ago) -- I'll throw it through my test matrix and get it pushed. Attached for your delectation and so you can try a combined tree build with this applied and see if it works (I'll post it properly to binutils@ before committing too). 8<------------------------------>8 From: Bruce McCulloch <[email protected]> Subject: [PATCH] Remove CTF_F_ARRNELEMS flag Date: Thu, 5 Feb 2026 12:50:28 -0800 X-Mailer: git-send-email 2.47.3 Content-Transfer-Encoding: 8bit Content-Type: text/plain This patch removes the constraint that a CTF_F_ARRNELEMS flag has to be present in order to reverse the elements of an array when dumping. The flag was never added to GCC, and having this requirement causes more problems than it solves. A quick recap of the issue: Given an array int foo[1][2][3], the expected graph is: int foo[1][2][3] -> int foo[2][3] -> int foo[3] -> int foo Prior to GCC PR114186, the emitted graph would be: int foo[1][2][3] -> int foo[1][2] -> int foo[1] -> int foo Following GCC PR114186, before the libctf fix, the output was: int foo[3][2][1] -> int foo[3][2] -> int foo[3] -> int foo So the underlying type graph was correct, but the ordering of elements was incorrect. With this fix, we emit correct ordering of the type graph, with no requirements for the compiler to signal that it has GCC PR114186. Bruce McCulloch --- include/ChangeLog: * ctf.h (CTF_F_ARRNELEMS): Remove. (CTF_F_MAX): Adjust accordingly. libctf/ChangeLog: * ctf-decl.c (ctf_decl_push): Remove flag check. * ctf-dump.c (ctf_dump_header): Remove flag printing. * testsuite/libctf-lookup/multidim-array.c: Remove flag check. --- include/ctf.h | 3 +- libctf/ctf-decl.c | 3 +- libctf/ctf-dump.c | 8 +-- .../testsuite/libctf-lookup/multidim-array.c | 58 ++----------------- 4 files changed, 7 insertions(+), 65 deletions(-) diff --git a/include/ctf.h b/include/ctf.h index 29f281d71a0..e28a37d4658 100644 --- a/include/ctf.h +++ b/include/ctf.h @@ -213,9 +213,8 @@ typedef struct ctf_header #define CTF_F_NEWFUNCINFO 0x2 /* New v3 func info section format. */ #define CTF_F_IDXSORTED 0x4 /* Index sections already sorted. */ #define CTF_F_DYNSTR 0x8 /* Strings come from .dynstr. */ -#define CTF_F_ARRNELEMS 0x10 /* Array elems no longer reversed. */ #define CTF_F_MAX (CTF_F_COMPRESS | CTF_F_NEWFUNCINFO | CTF_F_IDXSORTED \ - | CTF_F_DYNSTR | CTF_F_ARRNELEMS) + | CTF_F_DYNSTR) typedef struct ctf_lblent { diff --git a/libctf/ctf-decl.c b/libctf/ctf-decl.c index 59dfaefc292..e25935aca1d 100644 --- a/libctf/ctf-decl.c +++ b/libctf/ctf-decl.c @@ -158,8 +158,7 @@ ctf_decl_push (ctf_decl_t *cd, ctf_dict_t *fp, ctf_id_t type) As of gcc-14.2.0, arrays must also be prepended in order to dump with the dimensions properly ordered. */ - if ((is_qual && prec == CTF_PREC_BASE) || ((kind == CTF_K_ARRAY) && - (fp->ctf_openflags & (CTF_F_ARRNELEMS)))) + if ((is_qual && prec == CTF_PREC_BASE) || (kind == CTF_K_ARRAY)) ctf_list_prepend (&cd->cd_nodes[prec], cdp); else ctf_list_append (&cd->cd_nodes[prec], cdp); diff --git a/libctf/ctf-dump.c b/libctf/ctf-dump.c index 561d17ff7a2..0037cc50d23 100644 --- a/libctf/ctf-dump.c +++ b/libctf/ctf-dump.c @@ -326,7 +326,7 @@ ctf_dump_header (ctf_dict_t *fp, ctf_dump_state_t *state) if (fp->ctf_openflags > 0) { - if (asprintf (&flagstr, "%s%s%s%s%s%s%s%s%s", + if (asprintf (&flagstr, "%s%s%s%s%s%s%s", fp->ctf_openflags & CTF_F_COMPRESS ? "CTF_F_COMPRESS": "", (fp->ctf_openflags & CTF_F_COMPRESS) @@ -343,12 +343,6 @@ ctf_dump_header (ctf_dict_t *fp, ctf_dump_state_t *state) && (fp->ctf_openflags & ~(CTF_F_COMPRESS | CTF_F_NEWFUNCINFO | CTF_F_IDXSORTED)) ? ", " : "", - fp->ctf_openflags & CTF_F_ARRNELEMS - ? "CTF_F_ARRNELEMS" : "", - fp->ctf_openflags & (CTF_F_ARRNELEMS) - && (fp->ctf_openflags & ~(CTF_F_COMPRESS | CTF_F_NEWFUNCINFO - | CTF_F_IDXSORTED | CTF_F_ARRNELEMS)) - ? ", " : "", fp->ctf_openflags & CTF_F_DYNSTR ? "CTF_F_DYNSTR" : "") < 0) goto err; diff --git a/libctf/testsuite/libctf-lookup/multidim-array.c b/libctf/testsuite/libctf-lookup/multidim-array.c index 9e0cc2e99be..fdbce52734e 100644 --- a/libctf/testsuite/libctf-lookup/multidim-array.c +++ b/libctf/testsuite/libctf-lookup/multidim-array.c @@ -36,60 +36,10 @@ main (int argc, char *argv[]) if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL) goto open_err; - /* First, check for signs that the compiler is fixed but not emitting the - relevant flag yet. This combination is not expected to work right. */ - - while ((dumpstr = ctf_dump (fp, &dump_state, CTF_SECT_HEADER, NULL, NULL)) - != NULL) - { - if (strstr (dumpstr, "CTF_F_ARRNELEMS") != NULL) - flagged = 1; - free (dumpstr); - } - - if (!flagged) - { - ctf_arinfo_t ar; - - if ((type = ctf_lookup_by_symbol_name (fp, "a")) == CTF_ERR) - goto unexpected; - - if (ctf_array_info (fp, type, &ar) < 0) - goto unexpected; - - if (ar.ctr_nelems == 3) - { - fprintf (stderr, "UNSUPPORTED: compiler has GCC PR114186 fixed but " - "no indicative flag\n"); - return 0; - } - } - - /* Now check for the actual bug. */ - if (flagged) - { - while ((type = ctf_type_next (fp, &it, NULL, 1)) != -1) - if (ctf_type_kind (fp, type) == CTF_K_ARRAY) - printf ("%s\n", ctf_type_aname (fp, type)); - } - - else - { - while ((type = ctf_symbol_next (fp, &it, &name, 0)) != CTF_ERR) - { - char *outstr = strdup ("int "); - while (ctf_type_kind (fp, type) == CTF_K_ARRAY) - { - ctf_arinfo_t ar; - if (ctf_array_info (fp, type, &ar) < 0) - goto unexpected; - outstr = insert_dimension (outstr, ar.ctr_nelems); - printf ("%s\n", outstr); - type = ar.ctr_contents; - } - free (outstr); - } - } + /* This is expected to fail with GCC prior to PR114186. */ + while ((type = ctf_type_next (fp, &it, NULL, 1)) != -1) + if (ctf_type_kind (fp, type) == CTF_K_ARRAY) + printf ("%s\n", ctf_type_aname (fp, type)); ctf_dict_close (fp); ctf_close (ctf);
