]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libctf: fix libctf/testsuite/libctf-lookup/multidim-array on older arches
authorBruce McCulloch <bruce.mcculloch@oracle.com>
Fri, 17 Oct 2025 13:00:25 +0000 (14:00 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Mon, 20 Oct 2025 10:22:46 +0000 (11:22 +0100)
This patch inverts the ordering of nelems on multidimensional arrays on
versions of gcc without the CTF_F_ARRNELEMS flag. This allows those
systems which run older gcc to pass the test without modification to the
multidim-array.lk file.

libctf/ChangeLog:

* testsuite/libctf-lookup/multidim-array.c: Test fixes.

libctf/testsuite/libctf-lookup/multidim-array-ctf.c
libctf/testsuite/libctf-lookup/multidim-array.c
libctf/testsuite/libctf-lookup/multidim-array.lk

index 05b6ebe4fddb382db4b188e9f2668d93f17b5542..3829fda95820acd1178471675d126eda23034cb8 100644 (file)
@@ -1,3 +1,2 @@
 int a[3][5][9];
-int b[1][2];
 
index 2a86f2636c2a354797799e80cd2f261b9e126be5..9e0cc2e99be036ca28b617d6f44042c1c7b988c9 100644 (file)
@@ -1,8 +1,23 @@
+#include "config.h"
 #include <ctf-api.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+static char *
+insert_dimension (char *old_str, int num)
+{
+  char *bracket_ptr = strchr (old_str, '[');
+  if (!bracket_ptr)
+    {
+      if (asprintf (&old_str, "int [%d]", num) < 0)
+       return NULL;
+    }
+  else if (asprintf (&old_str, "int [%d]%s", num, bracket_ptr) < 0)
+    return NULL;
+  return old_str;
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -14,6 +29,7 @@ main (int argc, char *argv[])
   ctf_next_t *it = NULL;
   ctf_id_t type;
   int flagged = 0;
+  const char *name = NULL;
 
   if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL)
     goto open_err;
@@ -23,8 +39,8 @@ main (int argc, char *argv[])
   /* 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)
+  while ((dumpstr = ctf_dump (fp, &dump_state, CTF_SECT_HEADER, NULL, NULL))
+        != NULL)
     {
       if (strstr (dumpstr, "CTF_F_ARRNELEMS") != NULL)
        flagged = 1;
@@ -44,28 +60,49 @@ main (int argc, char *argv[])
       if (ar.ctr_nelems == 3)
        {
          fprintf (stderr, "UNSUPPORTED: compiler has GCC PR114186 fixed but "
-                  "no indicative flag\n");
+                          "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));
+    }
 
-  while ((type = ctf_type_next (fp, &it, NULL, 1)) != -1)
-    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);
+       }
+    }
 
   ctf_dict_close (fp);
   ctf_close (ctf);
 
   return 0;
 
- open_err:
+open_err:
   fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err));
   return 1;
 
- unexpected:
-  fprintf (stderr, "Cannot look up symbol to determine compiler bugginess: %s\n",
+unexpected:
+  fprintf (stderr,
+          "Cannot look up symbol to determine compiler bugginess: %s\n",
           ctf_errmsg (ctf_errno (fp)));
   return 1;
 }
-
index 41b3cd9f033b3cc352d5f0718993a44880026cf9..7d06042691bf0d4ebd7270701b3f1da8eb7af07a 100644 (file)
@@ -1,9 +1,5 @@
 # source: multidim-array-ctf.c
-int
-(long )?unsigned int
 int \[9\]
 int \[5\]\[9\]
 int \[3\]\[5\]\[9\]
-int \[2\]
-int \[1\]\[2\]