aboutsummaryrefslogtreecommitdiff
path: root/libctf/testsuite/libctf-lookup
diff options
context:
space:
mode:
Diffstat (limited to 'libctf/testsuite/libctf-lookup')
-rw-r--r--libctf/testsuite/libctf-lookup/big-struct-corruption.c118
-rw-r--r--libctf/testsuite/libctf-lookup/big-struct-corruption.lk3
-rw-r--r--libctf/testsuite/libctf-lookup/big-struct-ctf.c72
-rw-r--r--libctf/testsuite/libctf-lookup/multidim-array-ctf.c3
-rw-r--r--libctf/testsuite/libctf-lookup/multidim-array.c71
-rw-r--r--libctf/testsuite/libctf-lookup/multidim-array.lk9
6 files changed, 276 insertions, 0 deletions
diff --git a/libctf/testsuite/libctf-lookup/big-struct-corruption.c b/libctf/testsuite/libctf-lookup/big-struct-corruption.c
new file mode 100644
index 0000000..2cc05be
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/big-struct-corruption.c
@@ -0,0 +1,118 @@
+/* Determine whether libctf/33339 is fixed, if and only if GCC PR 121411 is also
+ fixed. */
+
+#include "config.h"
+#include <ctf-api.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Determine whether the passed-in struct's member's offsets ever descend. */
+static int
+offsets_ascending (ctf_dict_t *fp, ctf_id_t type)
+{
+ ctf_next_t *it = NULL;
+ ssize_t offset, last_offset = 0;
+
+ while ((offset = ctf_member_next (fp, type, &it, NULL, NULL, 0)) >= 0)
+ {
+ if (offset < last_offset)
+ return 0;
+ last_offset = offset;
+ }
+ if (ctf_errno (fp) != ECTF_NEXT_END)
+ {
+ fprintf (stderr, "Cannot check member offsets: %s\n",
+ ctf_errmsg (ctf_errno (fp)));
+ exit (0);
+ }
+
+ return 1;
+}
+
+int
+main (int argc, char *argv[])
+{
+ ctf_archive_t *ctf;
+ ctf_dict_t *fp;
+ ctf_id_t type;
+ int err;
+
+ if (argc != 3)
+ {
+ fprintf (stderr, "Syntax: %s PROGRAM OBJ\n", argv[0]);
+ exit(1);
+ }
+
+ /* Check for bugginess of compiler. */
+
+ if ((ctf = ctf_open (argv[2], NULL, &err)) == NULL)
+ {
+ fprintf (stderr, "Cannot open compiler object file %s: %s\n",
+ argv[2], ctf_errmsg (err));
+ exit (1);
+ }
+
+ /* Verify that offsets only ascend. */
+
+ if ((fp = ctf_arc_lookup_symbol_name (ctf, "huge_used", &type, &err)) == NULL)
+ {
+ fprintf (stderr, "UNSUPPORTED: compiler does not provide expected symbol.\n");
+ exit (0);
+ }
+
+ if (!offsets_ascending (fp, type))
+ {
+ fprintf (stderr, "UNSUPPORTED: GCC bug PR121411 detected.\n");
+ exit (0);
+ }
+
+ ctf_dict_close (fp);
+ ctf_close (ctf);
+
+ /* Check if test is disabled (e.g. on 32-bit). */
+
+ if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL)
+ {
+ fprintf (stderr, "Cannot open linked binary test file %s: %s\n",
+ argv[1], ctf_errmsg (err));
+ exit (1);
+ }
+
+ if ((fp = ctf_arc_lookup_symbol_name (ctf, "test_disabled", &type, &err)) != NULL)
+ {
+ fprintf (stderr, "UNSUPPORTED: test not necessary on 32-bit targets.\n");
+ exit (0);
+ }
+
+ if ((fp = ctf_arc_lookup_symbol_name (ctf, "big_used", &type, &err)) == NULL)
+ {
+ fprintf (stderr, "big struct symbol not found.\n");
+ exit (1);
+ }
+
+ if (!offsets_ascending (fp, type))
+ {
+ fprintf (stderr, "large struct offsets incorrect.\n");
+ exit (1);
+ }
+ ctf_dict_close (fp);
+
+ if ((fp = ctf_arc_lookup_symbol_name (ctf, "huge_used", &type, &err)) == NULL)
+ {
+ fprintf (stderr, "huge struct symbol not found.\n");
+ exit (1);
+ }
+
+ if (!offsets_ascending (fp, type))
+ {
+ fprintf (stderr, "huge struct offsets incorrect.\n");
+ exit (1);
+ }
+
+ ctf_dict_close (fp);
+ ctf_close (ctf);
+
+ fprintf (stderr, "Large and huge structs working fine.\n");
+ exit (0);
+}
diff --git a/libctf/testsuite/libctf-lookup/big-struct-corruption.lk b/libctf/testsuite/libctf-lookup/big-struct-corruption.lk
new file mode 100644
index 0000000..980cb0b
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/big-struct-corruption.lk
@@ -0,0 +1,3 @@
+# source: big-struct-ctf.c
+# link: objects
+Large and huge structs working fine.
diff --git a/libctf/testsuite/libctf-lookup/big-struct-ctf.c b/libctf/testsuite/libctf-lookup/big-struct-ctf.c
new file mode 100644
index 0000000..fc99a3e
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/big-struct-ctf.c
@@ -0,0 +1,72 @@
+#if defined (__SIZEOF_PTRDIFF_T__) && __SIZEOF_PTRDIFF_T__ > 4
+
+#define CONCAT_(a,b) a ## b
+#define CONCAT(a,b) CONCAT_(a, b)
+#define COUNT(name) CONCAT(name, __COUNTER__)
+#define MEMBNAME const char COUNT(memb)[1024 * 1024]
+#define MEMB10 \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME; \
+ MEMBNAME;
+
+#define MEMB100 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10 \
+ MEMB10
+
+#define MEMB1000 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100 \
+ MEMB100
+
+#define MEMB10000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000 \
+ MEMB1000
+
+struct big
+{
+ MEMB1000;
+};
+
+struct huge
+{
+ MEMB10000;
+};
+
+struct big big_used;
+struct huge huge_used;
+
+#else
+
+int test_disabled;
+
+#endif
diff --git a/libctf/testsuite/libctf-lookup/multidim-array-ctf.c b/libctf/testsuite/libctf-lookup/multidim-array-ctf.c
new file mode 100644
index 0000000..05b6ebe
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/multidim-array-ctf.c
@@ -0,0 +1,3 @@
+int a[3][5][9];
+int b[1][2];
+
diff --git a/libctf/testsuite/libctf-lookup/multidim-array.c b/libctf/testsuite/libctf-lookup/multidim-array.c
new file mode 100644
index 0000000..2a86f26
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/multidim-array.c
@@ -0,0 +1,71 @@
+#include <ctf-api.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main (int argc, char *argv[])
+{
+ ctf_archive_t *ctf;
+ ctf_dict_t *fp;
+ int err;
+ ctf_dump_state_t *dump_state = NULL;
+ char *dumpstr;
+ ctf_next_t *it = NULL;
+ ctf_id_t type;
+ int flagged = 0;
+
+ if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL)
+ goto open_err;
+ 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. */
+
+ while ((type = ctf_type_next (fp, &it, NULL, 1)) != -1)
+ printf ("%s\n", ctf_type_aname (fp, type));
+
+ ctf_dict_close (fp);
+ ctf_close (ctf);
+
+ return 0;
+
+ 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",
+ ctf_errmsg (ctf_errno (fp)));
+ return 1;
+}
+
diff --git a/libctf/testsuite/libctf-lookup/multidim-array.lk b/libctf/testsuite/libctf-lookup/multidim-array.lk
new file mode 100644
index 0000000..41b3cd9
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/multidim-array.lk
@@ -0,0 +1,9 @@
+# source: multidim-array-ctf.c
+int
+(long )?unsigned int
+int \[9\]
+int \[5\]\[9\]
+int \[3\]\[5\]\[9\]
+int \[2\]
+int \[1\]\[2\]
+