aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2025-05-30 15:31:36 +0100
committerNick Alcock <nick.alcock@oracle.com>2025-06-04 12:51:19 +0100
commit75e514cfa56c202d4d481626c1f0ba74eb61ff86 (patch)
treec722ad113843674deee4063a4011b652592dbd72
parent246fe7c3353759c377a2643cb0b861131ea95cb5 (diff)
downloadbinutils-75e514cfa56c202d4d481626c1f0ba74eb61ff86.zip
binutils-75e514cfa56c202d4d481626c1f0ba74eb61ff86.tar.gz
binutils-75e514cfa56c202d4d481626c1f0ba74eb61ff86.tar.bz2
Revert "libctf: fix linking of non-root-visible types"
This reverts commit 87b2f673102884d7c69144c85a26ed5dbaa4f86a. It is based on a misconception, that hidden types in the deduplicator input should always be hidden in the output. For cu-mapped links, and final links following cu-mapped links, this is not true: we want to hide inputs if they were conflicting on the output and no more. We will reintroduce the testcase once a better fix is found. libctf/ PR libctf/33047 * ctf-dedup.c (ctf_dedup_emit_type): Don't respect the nonroot flag. * testsuite/libctf-writable/ctf-nonroot-linking.c: Removed. * testsuite/libctf-writable/ctf-nonroot-linking.lk: Removed.
-rw-r--r--libctf/ctf-dedup.c6
-rw-r--r--libctf/testsuite/libctf-writable/ctf-nonroot-linking.c127
-rw-r--r--libctf/testsuite/libctf-writable/ctf-nonroot-linking.lk1
3 files changed, 2 insertions, 132 deletions
diff --git a/libctf/ctf-dedup.c b/libctf/ctf-dedup.c
index 174f353..e442f59 100644
--- a/libctf/ctf-dedup.c
+++ b/libctf/ctf-dedup.c
@@ -2639,7 +2639,7 @@ ctf_dedup_emit_type (const char *hval, ctf_dict_t *output, ctf_dict_t **inputs,
int input_num = CTF_DEDUP_GID_TO_INPUT (id);
int output_num = (uint32_t) -1; /* 'shared' */
int cu_mapped = *(int *)arg;
- int isroot;
+ int isroot = 1;
int is_conflicting;
ctf_next_t *i = NULL;
@@ -2708,11 +2708,9 @@ ctf_dedup_emit_type (const char *hval, ctf_dict_t *output, ctf_dict_t **inputs,
}
name = ctf_strraw (real_input, tp->ctt_name);
- isroot = LCTF_INFO_ISROOT (real_input, tp->ctt_info);
/* Hide conflicting types, if we were asked to: also hide if a type with this
- name already exists and is not a forward, or if this type is hidden on the
- input. */
+ name already exists and is not a forward. */
if (cu_mapped && is_conflicting)
isroot = 0;
else if (name
diff --git a/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c b/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c
deleted file mode 100644
index 6edd189..0000000
--- a/libctf/testsuite/libctf-writable/ctf-nonroot-linking.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Make sure linking a non-root-visible type emits a non-root-visible
- type, rather than silently promoting it to root-visible. Do it by dumping,
- thus also testing the {non-root sigils} you get when dumping
- non-root-visible types. */
-
-#include <ctf-api.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-int
-main (int argc, char *argv[])
-{
- ctf_dict_t *in1;
- ctf_dict_t *fp;
- ctf_dict_t *dump_fp;
- ctf_archive_t *arc1;
- ctf_archive_t *final_arc;
- ctf_sect_t s;
- ctf_encoding_t encoding = { CTF_INT_SIGNED, 0, sizeof (char) };
- unsigned char *buf1, *buf2;
- size_t buf1_sz, buf2_sz;
- ctf_dump_state_t *dump_state = NULL;
- ctf_next_t *i = NULL;
- int err;
-
- /* Linking does not currently work on mingw because of an unreliable tmpfile
- implementation on that platform (see
- https://github.com/msys2/MINGW-packages/issues/18878). Simply skip for
- now. */
-
-#ifdef __MINGW32__
- printf ("UNSUPPORTED: platform bug breaks ctf_link\n");
- return 0;
-#else
-
- if ((fp = ctf_create (&err)) == NULL)
- goto create_err;
-
- if ((in1 = ctf_create (&err)) == NULL)
- goto create_err;
-
- /* A non-root addition. */
-
- if ((ctf_add_integer (in1, CTF_ADD_NONROOT, "foo", &encoding)) == CTF_ERR)
- {
- fprintf (stderr, "Cannot add: %s\n", ctf_errmsg (ctf_errno (in1)));
- return 1;
- }
-
- /* Write it out and read it back in, to turn it into an archive.
- This would be unnecessary if ctf_link_add() were public :( */
- if ((buf1 = ctf_write_mem (in1, &buf1_sz, -1)) == NULL)
- {
- fprintf (stderr, "Cannot serialize: %s\n", ctf_errmsg (ctf_errno (in1)));
- return 1;
- }
-
- s.cts_name = "foo";
- s.cts_data = (void *) buf1;
- s.cts_size = buf1_sz;
- s.cts_entsize = 64; /* Unimportant. */
-
- if ((arc1 = ctf_arc_bufopen (&s, NULL, NULL, &err)) == NULL)
- goto open_err;
-
- ctf_dict_close (in1);
-
- /* Link! Even a one-file link does deduplication. */
-
- if (ctf_link_add_ctf (fp, arc1, "a") < 0)
- goto link_err;
-
- if (ctf_link (fp, 0) < 0)
- goto link_err;
-
- /* Write it out. We need a new buf here, because the archive is still
- using the other buf. */
-
- if ((buf2 = ctf_link_write (fp, &buf2_sz, 4096)) == NULL)
- goto link_err;
-
- /* Read it back in. */
-
- s.cts_data = (void *) buf2;
- s.cts_size = buf2_sz;
-
- if ((final_arc = ctf_arc_bufopen (&s, NULL, NULL, &err)) == NULL)
- goto open_err;
-
- /* Dump the types, and search for the {sigils of non-rootedness}. */
- while ((dump_fp = ctf_archive_next (final_arc, &i, NULL, 0, &err)) != NULL)
- {
- char *dumpstr;
-
- while ((dumpstr = ctf_dump (dump_fp, &dump_state, CTF_SECT_TYPE,
- NULL, NULL)) != NULL)
- {
- if (strchr (dumpstr, '{') != NULL && strchr (dumpstr, '}') != NULL)
- printf ("Non-root type found.\n");
- free (dumpstr);
- }
- ctf_dict_close (dump_fp);
- }
- if (err != ECTF_NEXT_END)
- {
- fprintf (stderr, "Archive iteration error: %s\n", ctf_errmsg (err));
- return 1;
- }
-
- ctf_arc_close (final_arc);
- free (buf1);
- free (buf2);
- ctf_dict_close (fp);
- return 0;
-
- create_err:
- fprintf (stderr, "Cannot create: %s\n", ctf_errmsg (err));
- return 1;
- open_err:
- fprintf (stderr, "Cannot open: %s\n", ctf_errmsg (err));
- return 1;
- link_err:
- fprintf (stderr, "Cannot link: %s\n", ctf_errmsg (ctf_errno (fp)));
- return 1;
-#endif
-}
diff --git a/libctf/testsuite/libctf-writable/ctf-nonroot-linking.lk b/libctf/testsuite/libctf-writable/ctf-nonroot-linking.lk
deleted file mode 100644
index e3edda0..0000000
--- a/libctf/testsuite/libctf-writable/ctf-nonroot-linking.lk
+++ /dev/null
@@ -1 +0,0 @@
-Non-root type found.