]> Git Repo - binutils.git/blob - libctf/ctf-link.c
libctf: add a deduplicator-specific type mapping table
[binutils.git] / libctf / ctf-link.c
1 /* CTF linking.
2    Copyright (C) 2019-2021 Free Software Foundation, Inc.
3
4    This file is part of libctf.
5
6    libctf is free software; you can redistribute it and/or modify it under
7    the terms of the GNU General Public License as published by the Free
8    Software Foundation; either version 3, or (at your option) any later
9    version.
10
11    This program is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14    See the GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; see the file COPYING.  If not see
18    <http://www.gnu.org/licenses/>.  */
19
20 #include <ctf-impl.h>
21 #include <string.h>
22
23 #if defined (PIC)
24 #pragma weak ctf_open
25 #endif
26
27 /* CTF linking consists of adding CTF archives full of content to be merged into
28    this one to the current file (which must be writable) by calling
29    ctf_link_add_ctf.  Once this is done, a call to ctf_link will merge the type
30    tables together, generating new CTF files as needed, with this one as a
31    parent, to contain types from the inputs which conflict.  ctf_link_add_strtab
32    takes a callback which provides string/offset pairs to be added to the
33    external symbol table and deduplicated from all CTF string tables in the
34    output link; ctf_link_shuffle_syms takes a callback which provides symtab
35    entries in ascending order, and shuffles the function and data sections to
36    match; and ctf_link_write emits a CTF file (if there are no conflicts
37    requiring per-compilation-unit sub-CTF files) or CTF archives (otherwise) and
38    returns it, suitable for addition in the .ctf section of the output.  */
39
40 /* Return the name of the compilation unit this CTF dict or its parent applies
41    to, or a non-null string otherwise: prefer the parent.  Used in debugging
42    output.  Sometimes used for outputs too.  */
43 const char *
44 ctf_link_input_name (ctf_dict_t *fp)
45 {
46   if (fp->ctf_parent && fp->ctf_parent->ctf_cuname)
47     return fp->ctf_parent->ctf_cuname;
48   else if (fp->ctf_cuname)
49     return fp->ctf_cuname;
50   else
51     return "(unnamed)";
52 }
53
54 /* Return the cuname of a dict, or the string "unnamed-CU" if none.  */
55
56 static const char *
57 ctf_unnamed_cuname (ctf_dict_t *fp)
58 {
59   const char *cuname = ctf_cuname (fp);
60
61   if (!cuname)
62     cuname = "unnamed-CU";
63
64   return cuname;
65 }
66
67 /* The linker inputs look like this.  clin_fp is used for short-circuited
68    CU-mapped links that can entirely avoid the first link phase in some
69    situations in favour of just passing on the contained ctf_dict_t: it is
70    always the sole ctf_dict_t inside the corresponding clin_arc.  If set, it
71    gets assigned directly to the final link inputs and freed from there, so it
72    never gets explicitly freed in the ctf_link_input.  */
73 typedef struct ctf_link_input
74 {
75   const char *clin_filename;
76   ctf_archive_t *clin_arc;
77   ctf_dict_t *clin_fp;
78   int n;
79 } ctf_link_input_t;
80
81 static void
82 ctf_link_input_close (void *input)
83 {
84   ctf_link_input_t *i = (ctf_link_input_t *) input;
85   if (i->clin_arc)
86     ctf_arc_close (i->clin_arc);
87   free (i);
88 }
89
90 /* Like ctf_link_add_ctf, below, but with no error-checking, so it can be called
91    in the middle of an ongoing link.  */
92 static int
93 ctf_link_add_ctf_internal (ctf_dict_t *fp, ctf_archive_t *ctf,
94                            ctf_dict_t *fp_input, const char *name)
95 {
96   ctf_link_input_t *input = NULL;
97   char *dupname = NULL;
98
99   if ((input = calloc (1, sizeof (ctf_link_input_t))) == NULL)
100     goto oom;
101
102   if ((dupname = strdup (name)) == NULL)
103     goto oom;
104
105   input->clin_arc = ctf;
106   input->clin_fp = fp_input;
107   input->clin_filename = dupname;
108   input->n = ctf_dynhash_elements (fp->ctf_link_inputs);
109
110   if (ctf_dynhash_insert (fp->ctf_link_inputs, dupname, input) < 0)
111     goto oom;
112
113   return 0;
114  oom:
115   free (input);
116   free (dupname);
117   return ctf_set_errno (fp, ENOMEM);
118 }
119
120 /* Add a file, memory buffer, or unopened file (by name) to a link.
121
122    You can call this with:
123
124     CTF and NAME: link the passed ctf_archive_t, with the given NAME.
125     NAME alone: open NAME as a CTF file when needed.
126     BUF and NAME: open the BUF (of length N) as CTF, with the given NAME.  (Not
127     yet implemented.)
128
129     Passed in CTF args are owned by the dictionary and will be freed by it.
130     The BUF arg is *not* owned by the dictionary, and the user should not free
131     its referent until the link is done.
132
133     The order of calls to this function influences the order of types in the
134     final link output, but otherwise is not important.
135
136     Private for now, but may in time become public once support for BUF is
137     implemented.  */
138
139 static int
140 ctf_link_add (ctf_dict_t *fp, ctf_archive_t *ctf, const char *name,
141               void *buf _libctf_unused_, size_t n _libctf_unused_)
142 {
143   if (buf)
144     return (ctf_set_errno (fp, ECTF_NOTYET));
145
146   if (!((ctf && name && !buf)
147         || (name && !buf && !ctf)
148         || (buf && name && !ctf)))
149     return (ctf_set_errno (fp, EINVAL));
150
151   /* We can only lazily open files if libctf.so is in use rather than
152      libctf-nobfd.so.  This is a little tricky: in shared libraries, we can use
153      a weak symbol so that -lctf -lctf-nobfd works, but in static libraries we
154      must distinguish between the two libraries explicitly.  */
155
156 #if defined (PIC)
157   if (!buf && !ctf && name && !ctf_open)
158     return (ctf_set_errno (fp, ECTF_NEEDSBFD));
159 #elif NOBFD
160   if (!buf && !ctf && name)
161     return (ctf_set_errno (fp, ECTF_NEEDSBFD));
162 #endif
163
164   if (fp->ctf_link_outputs)
165     return (ctf_set_errno (fp, ECTF_LINKADDEDLATE));
166   if (fp->ctf_link_inputs == NULL)
167     fp->ctf_link_inputs = ctf_dynhash_create (ctf_hash_string,
168                                               ctf_hash_eq_string, free,
169                                               ctf_link_input_close);
170
171   if (fp->ctf_link_inputs == NULL)
172     return (ctf_set_errno (fp, ENOMEM));
173
174   return ctf_link_add_ctf_internal (fp, ctf, NULL, name);
175 }
176
177 /* Add an opened CTF archive or unopened file (by name) to a link.
178    If CTF is NULL and NAME is non-null, an unopened file is meant:
179    otherwise, the specified archive is assumed to have the given NAME.
180
181     Passed in CTF args are owned by the dictionary and will be freed by it.
182
183     The order of calls to this function influences the order of types in the
184     final link output, but otherwise is not important.  */
185
186 int
187 ctf_link_add_ctf (ctf_dict_t *fp, ctf_archive_t *ctf, const char *name)
188 {
189   return ctf_link_add (fp, ctf, name, NULL, 0);
190 }
191
192 /* Return a per-CU output CTF dictionary suitable for the given CU, creating and
193    interning it if need be.  */
194
195 _libctf_nonnull_((1,2))
196 static ctf_dict_t *
197 ctf_create_per_cu (ctf_dict_t *fp, const char *cu_name)
198 {
199   ctf_dict_t *cu_fp;
200   const char *ctf_name = NULL;
201   char *dynname = NULL;
202
203   /* First, check the mapping table and translate the per-CU name we use
204      accordingly.  */
205
206   if (fp->ctf_link_in_cu_mapping)
207     {
208       if ((ctf_name = ctf_dynhash_lookup (fp->ctf_link_in_cu_mapping,
209                                           cu_name)) == NULL)
210         ctf_name = cu_name;
211     }
212
213   if (ctf_name == NULL)
214     ctf_name = cu_name;
215
216   if ((cu_fp = ctf_dynhash_lookup (fp->ctf_link_outputs, ctf_name)) == NULL)
217     {
218       int err;
219
220       if ((cu_fp = ctf_create (&err)) == NULL)
221         {
222           ctf_err_warn (fp, 0, err, _("cannot create per-CU CTF archive for "
223                                       "input CU %s"), cu_name);
224           ctf_set_errno (fp, err);
225           return NULL;
226         }
227
228       if ((dynname = strdup (ctf_name)) == NULL)
229         goto oom;
230       if (ctf_dynhash_insert (fp->ctf_link_outputs, dynname, cu_fp) < 0)
231         goto oom;
232
233       ctf_import_unref (cu_fp, fp);
234       ctf_cuname_set (cu_fp, cu_name);
235       ctf_parent_name_set (cu_fp, _CTF_SECTION);
236     }
237   return cu_fp;
238
239  oom:
240   free (dynname);
241   ctf_dict_close (cu_fp);
242   ctf_set_errno (fp, ENOMEM);
243   return NULL;
244 }
245
246 /* Add a mapping directing that the CU named FROM should have its
247    conflicting/non-duplicate types (depending on link mode) go into a dict
248    named TO.  Many FROMs can share a TO.
249
250    We forcibly add a dict named TO in every case, even though it may well
251    wind up empty, because clients that use this facility usually expect to find
252    every TO dict present, even if empty, and malfunction otherwise.  */
253
254 int
255 ctf_link_add_cu_mapping (ctf_dict_t *fp, const char *from, const char *to)
256 {
257   int err;
258   char *f = NULL, *t = NULL;
259   ctf_dynhash_t *one_out;
260
261   if (fp->ctf_link_in_cu_mapping == NULL)
262     fp->ctf_link_in_cu_mapping = ctf_dynhash_create (ctf_hash_string,
263                                                      ctf_hash_eq_string, free,
264                                                      free);
265   if (fp->ctf_link_in_cu_mapping == NULL)
266     goto oom;
267
268   if (fp->ctf_link_out_cu_mapping == NULL)
269     fp->ctf_link_out_cu_mapping = ctf_dynhash_create (ctf_hash_string,
270                                                       ctf_hash_eq_string, free,
271                                                       (ctf_hash_free_fun)
272                                                       ctf_dynhash_destroy);
273   if (fp->ctf_link_out_cu_mapping == NULL)
274     goto oom;
275
276   f = strdup (from);
277   t = strdup (to);
278   if (!f || !t)
279     goto oom;
280
281   /* Track both in a list from FROM to TO and in a list from TO to a list of
282      FROM.  The former is used to create TUs with the mapped-to name at need:
283      the latter is used in deduplicating links to pull in all input CUs
284      corresponding to a single output CU.  */
285
286   if ((err = ctf_dynhash_insert (fp->ctf_link_in_cu_mapping, f, t)) < 0)
287     {
288       ctf_set_errno (fp, err);
289       goto oom_noerrno;
290     }
291
292   /* f and t are now owned by the in_cu_mapping: reallocate them.  */
293   f = strdup (from);
294   t = strdup (to);
295   if (!f || !t)
296     goto oom;
297
298   if ((one_out = ctf_dynhash_lookup (fp->ctf_link_out_cu_mapping, t)) == NULL)
299     {
300       if ((one_out = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
301                                          free, NULL)) == NULL)
302         goto oom;
303       if ((err = ctf_dynhash_insert (fp->ctf_link_out_cu_mapping,
304                                      t, one_out)) < 0)
305         {
306           ctf_dynhash_destroy (one_out);
307           ctf_set_errno (fp, err);
308           goto oom_noerrno;
309         }
310     }
311   else
312     free (t);
313
314   if (ctf_dynhash_insert (one_out, f, NULL) < 0)
315     {
316       ctf_set_errno (fp, err);
317       goto oom_noerrno;
318     }
319
320   return 0;
321
322  oom:
323   ctf_set_errno (fp, errno);
324  oom_noerrno:
325   free (f);
326   free (t);
327   return -1;
328 }
329
330 /* Set a function which is called to transform the names of archive members.
331    This is useful for applying regular transformations to many names, where
332    ctf_link_add_cu_mapping applies arbitrarily irregular changes to single
333    names.  The member name changer is applied at ctf_link_write time, so it
334    cannot conflate multiple CUs into one the way ctf_link_add_cu_mapping can.
335    The changer function accepts a name and should return a new
336    dynamically-allocated name, or NULL if the name should be left unchanged.  */
337 void
338 ctf_link_set_memb_name_changer (ctf_dict_t *fp,
339                                 ctf_link_memb_name_changer_f *changer,
340                                 void *arg)
341 {
342   fp->ctf_link_memb_name_changer = changer;
343   fp->ctf_link_memb_name_changer_arg = arg;
344 }
345
346 /* Set a function which is used to filter out unwanted variables from the link.  */
347 int
348 ctf_link_set_variable_filter (ctf_dict_t *fp, ctf_link_variable_filter_f *filter,
349                               void *arg)
350 {
351   fp->ctf_link_variable_filter = filter;
352   fp->ctf_link_variable_filter_arg = arg;
353   return 0;
354 }
355
356 /* Check if we can safely add a variable with the given type to this dict.  */
357
358 static int
359 check_variable (const char *name, ctf_dict_t *fp, ctf_id_t type,
360                 ctf_dvdef_t **out_dvd)
361 {
362   ctf_dvdef_t *dvd;
363
364   dvd = ctf_dynhash_lookup (fp->ctf_dvhash, name);
365   *out_dvd = dvd;
366   if (!dvd)
367     return 1;
368
369   if (dvd->dvd_type != type)
370     {
371       /* Variable here.  Wrong type: cannot add.  Just skip it, because there is
372          no way to express this in CTF.  Don't even warn: this case is too
373          common.  (This might be the parent, in which case we'll try adding in
374          the child first, and only then give up.)  */
375       ctf_dprintf ("Inexpressible duplicate variable %s skipped.\n", name);
376     }
377
378   return 0;                                   /* Already exists.  */
379 }
380
381 /* Link one variable named NAME of type TYPE found in IN_FP into FP.  */
382
383 static int
384 ctf_link_one_variable (ctf_dict_t *fp, ctf_dict_t *in_fp, const char *name,
385                        ctf_id_t type, int cu_mapped)
386 {
387   ctf_dict_t *per_cu_out_fp;
388   ctf_id_t dst_type = 0;
389   ctf_dvdef_t *dvd;
390
391   /* See if this variable is filtered out.  */
392
393   if (fp->ctf_link_variable_filter)
394     {
395       void *farg = fp->ctf_link_variable_filter_arg;
396       if (fp->ctf_link_variable_filter (in_fp, name, type, farg))
397         return 0;
398     }
399
400   /* If this type is mapped to a type in the parent dict, we want to try to add
401      to that first: if it reports a duplicate, or if the type is in a child
402      already, add straight to the child.  */
403
404   if ((dst_type = ctf_dedup_type_mapping (fp, in_fp, type)) == CTF_ERR)
405     return -1;                                  /* errno is set for us.  */
406
407   if (dst_type != 0)
408     {
409       if (!ctf_assert (fp, ctf_type_isparent (fp, dst_type)))
410         return -1;                              /* errno is set for us.  */
411
412       if (check_variable (name, fp, dst_type, &dvd))
413         {
414           /* No variable here: we can add it.  */
415           if (ctf_add_variable (fp, name, dst_type) < 0)
416             return -1;                          /* errno is set for us.  */
417           return 0;
418         }
419
420       /* Already present?  Nothing to do.  */
421       if (dvd && dvd->dvd_type == dst_type)
422         return 0;
423     }
424
425   /* Can't add to the parent due to a name clash, or because it references a
426      type only present in the child.  Try adding to the child, creating if need
427      be.  If we can't do that, skip it.  Don't add to a child if we're doing a
428      CU-mapped link, since that has only one output.  */
429
430   if (cu_mapped)
431     {
432       ctf_dprintf ("Variable %s in input file %s depends on a type %lx hidden "
433                    "due to conflicts: skipped.\n", name,
434                    ctf_unnamed_cuname (in_fp), type);
435       return 0;
436     }
437
438   if ((per_cu_out_fp = ctf_create_per_cu (fp, ctf_unnamed_cuname (in_fp))) == NULL)
439     return -1;                                  /* errno is set for us.  */
440
441   /* If the type was not found, check for it in the child too.  */
442   if (dst_type == 0)
443     {
444       if ((dst_type = ctf_dedup_type_mapping (per_cu_out_fp,
445                                               in_fp, type)) == CTF_ERR)
446         return -1;                              /* errno is set for us.   */
447
448       if (dst_type == 0)
449         {
450           ctf_err_warn (fp, 1, 0, _("type %lx for variable %s in input file %s "
451                                     "not found: skipped"), type, name,
452                         ctf_unnamed_cuname (in_fp));
453           /* Do not terminate the link: just skip the variable.  */
454           return 0;
455         }
456     }
457
458   if (check_variable (name, per_cu_out_fp, dst_type, &dvd))
459     if (ctf_add_variable (per_cu_out_fp, name, dst_type) < 0)
460       return (ctf_set_errno (fp, ctf_errno (per_cu_out_fp)));
461   return 0;
462 }
463
464 /* Lazily open a CTF archive for linking, if not already open.
465
466    Returns the number of files contained within the opened archive (0 for none),
467    or -1 on error, as usual.  */
468 static ssize_t
469 ctf_link_lazy_open (ctf_dict_t *fp, ctf_link_input_t *input)
470 {
471   size_t count;
472   int err;
473
474   if (input->clin_arc)
475     return ctf_archive_count (input->clin_arc);
476
477   if (input->clin_fp)
478     return 1;
479
480   /* See ctf_link_add_ctf.  */
481 #if defined (PIC) || !NOBFD
482   input->clin_arc = ctf_open (input->clin_filename, NULL, &err);
483 #else
484   ctf_err_warn (fp, 0, ECTF_NEEDSBFD, _("cannot open %s lazily"),
485                 input->clin_filename);
486   ctf_set_errno (fp, ECTF_NEEDSBFD);
487   return -1;
488 #endif
489
490   /* Having no CTF sections is not an error.  We just don't need to do
491      anything.  */
492
493   if (!input->clin_arc)
494     {
495       if (err == ECTF_NOCTFDATA)
496         return 0;
497
498       ctf_err_warn (fp, 0, err, _("opening CTF %s failed"),
499                     input->clin_filename);
500       ctf_set_errno (fp, err);
501       return -1;
502     }
503
504   if ((count = ctf_archive_count (input->clin_arc)) == 0)
505     ctf_arc_close (input->clin_arc);
506
507   return (ssize_t) count;
508 }
509
510 typedef struct link_sort_inputs_cb_arg
511 {
512   int is_cu_mapped;
513   ctf_dict_t *fp;
514 } link_sort_inputs_cb_arg_t;
515
516 /* Sort the inputs by N (the link order).  For CU-mapped links, this is a
517    mapping of input to output name, not a mapping of input name to input
518    ctf_link_input_t: compensate accordingly.  */
519 static int
520 ctf_link_sort_inputs (const ctf_next_hkv_t *one, const ctf_next_hkv_t *two,
521                       void *arg)
522 {
523   ctf_link_input_t *input_1;
524   ctf_link_input_t *input_2;
525   link_sort_inputs_cb_arg_t *cu_mapped = (link_sort_inputs_cb_arg_t *) arg;
526
527   if (!cu_mapped || !cu_mapped->is_cu_mapped)
528     {
529       input_1 = (ctf_link_input_t *) one->hkv_value;
530       input_2 = (ctf_link_input_t *) two->hkv_value;
531     }
532   else
533     {
534       const char *name_1 = (const char *) one->hkv_key;
535       const char *name_2 = (const char *) two->hkv_key;
536
537       input_1 = ctf_dynhash_lookup (cu_mapped->fp->ctf_link_inputs, name_1);
538       input_2 = ctf_dynhash_lookup (cu_mapped->fp->ctf_link_inputs, name_2);
539
540       /* There is no guarantee that CU-mappings actually have corresponding
541          inputs: the relative ordering in that case is unimportant.  */
542       if (!input_1)
543         return -1;
544       if (!input_2)
545         return 1;
546     }
547
548   if (input_1->n < input_2->n)
549     return -1;
550   else if (input_1->n > input_2->n)
551     return 1;
552   else
553     return 0;
554 }
555
556 /* Count the number of input dicts in the ctf_link_inputs, or that subset of the
557    ctf_link_inputs given by CU_NAMES if set.  Return the number of input dicts,
558    and optionally the name and ctf_link_input_t of the single input archive if
559    only one exists (no matter how many dicts it contains).  */
560 static ssize_t
561 ctf_link_deduplicating_count_inputs (ctf_dict_t *fp, ctf_dynhash_t *cu_names,
562                                      ctf_link_input_t **only_one_input)
563 {
564   ctf_dynhash_t *inputs = fp->ctf_link_inputs;
565   ctf_next_t *i = NULL;
566   void *name, *input;
567   ctf_link_input_t *one_input = NULL;
568   const char *one_name = NULL;
569   ssize_t count = 0, narcs = 0;
570   int err;
571
572   if (cu_names)
573     inputs = cu_names;
574
575   while ((err = ctf_dynhash_next (inputs, &i, &name, &input)) == 0)
576     {
577       ssize_t one_count;
578
579       one_name = (const char *) name;
580       /* If we are processing CU names, get the real input.  */
581       if (cu_names)
582         one_input = ctf_dynhash_lookup (fp->ctf_link_inputs, one_name);
583       else
584         one_input = (ctf_link_input_t *) input;
585
586       if (!one_input)
587         continue;
588
589       one_count = ctf_link_lazy_open (fp, one_input);
590
591       if (one_count < 0)
592         {
593           ctf_next_destroy (i);
594           return -1;                            /* errno is set for us.  */
595         }
596
597       count += one_count;
598       narcs++;
599     }
600   if (err != ECTF_NEXT_END)
601     {
602       ctf_err_warn (fp, 0, err, _("iteration error counting deduplicating "
603                                   "CTF link inputs"));
604       ctf_set_errno (fp, err);
605       return -1;
606     }
607
608   if (!count)
609     return 0;
610
611   if (narcs == 1)
612     {
613       if (only_one_input)
614         *only_one_input = one_input;
615     }
616   else if (only_one_input)
617     *only_one_input = NULL;
618
619   return count;
620 }
621
622 /* Allocate and populate an inputs array big enough for a given set of inputs:
623    either a specific set of CU names (those from that set found in the
624    ctf_link_inputs), or the entire ctf_link_inputs (if cu_names is not set).
625    The number of inputs (from ctf_link_deduplicating_count_inputs, above) is
626    passed in NINPUTS: an array of uint32_t containing parent pointers
627    (corresponding to those members of the inputs that have parents) is allocated
628    and returned in PARENTS.
629
630    The inputs are *archives*, not files: the archive can have multiple members
631    if it is the result of a previous incremental link.  We want to add every one
632    in turn, including the shared parent.  (The dedup machinery knows that a type
633    used by a single dictionary and its parent should not be shared in
634    CTF_LINK_SHARE_DUPLICATED mode.)
635
636    If no inputs exist that correspond to these CUs, return NULL with the errno
637    set to ECTF_NOCTFDATA.  */
638 static ctf_dict_t **
639 ctf_link_deduplicating_open_inputs (ctf_dict_t *fp, ctf_dynhash_t *cu_names,
640                                     ssize_t ninputs, uint32_t **parents)
641 {
642   ctf_dynhash_t *inputs = fp->ctf_link_inputs;
643   ctf_next_t *i = NULL;
644   void *name, *input;
645   link_sort_inputs_cb_arg_t sort_arg;
646   ctf_dict_t **dedup_inputs = NULL;
647   ctf_dict_t **walk;
648   uint32_t *parents_ = NULL;
649   int err;
650
651   if (cu_names)
652     inputs = cu_names;
653
654   if ((dedup_inputs = calloc (ninputs, sizeof (ctf_dict_t *))) == NULL)
655     goto oom;
656
657   if ((parents_ = calloc (ninputs, sizeof (uint32_t))) == NULL)
658     goto oom;
659
660   walk = dedup_inputs;
661
662   /* Counting done: push every input into the array, in the order they were
663      passed to ctf_link_add_ctf (and ultimately ld).  */
664
665   sort_arg.is_cu_mapped = (cu_names != NULL);
666   sort_arg.fp = fp;
667
668   while ((err = ctf_dynhash_next_sorted (inputs, &i, &name, &input,
669                                          ctf_link_sort_inputs, &sort_arg)) == 0)
670     {
671       const char *one_name = (const char *) name;
672       ctf_link_input_t *one_input;
673       ctf_dict_t *one_fp;
674       ctf_dict_t *parent_fp = NULL;
675       uint32_t parent_i;
676       ctf_next_t *j = NULL;
677
678       /* If we are processing CU names, get the real input.  All the inputs
679          will have been opened, if they contained any CTF at all.  */
680       if (cu_names)
681         one_input = ctf_dynhash_lookup (fp->ctf_link_inputs, one_name);
682       else
683         one_input = (ctf_link_input_t *) input;
684
685       if (!one_input || (!one_input->clin_arc && !one_input->clin_fp))
686         continue;
687
688       /* Short-circuit: if clin_fp is set, just use it.   */
689       if (one_input->clin_fp)
690         {
691           parents_[walk - dedup_inputs] = walk - dedup_inputs;
692           *walk = one_input->clin_fp;
693           walk++;
694           continue;
695         }
696
697       /* Get and insert the parent archive (if any), if this archive has
698          multiple members.  We assume, as elsewhere, that the parent is named
699          _CTF_SECTION.  */
700
701       if ((parent_fp = ctf_dict_open (one_input->clin_arc, _CTF_SECTION,
702                                       &err)) == NULL)
703         {
704           if (err != ECTF_NOMEMBNAM)
705             {
706               ctf_next_destroy (i);
707               ctf_set_errno (fp, err);
708               goto err;
709             }
710         }
711       else
712         {
713           *walk = parent_fp;
714           parent_i = walk - dedup_inputs;
715           walk++;
716         }
717
718       /* We disregard the input archive name: either it is the parent (which we
719          already have), or we want to put everything into one TU sharing the
720          cuname anyway (if this is a CU-mapped link), or this is the final phase
721          of a relink with CU-mapping off (i.e. ld -r) in which case the cuname
722          is correctly set regardless.  */
723       while ((one_fp = ctf_archive_next (one_input->clin_arc, &j, NULL,
724                                          1, &err)) != NULL)
725         {
726           if (one_fp->ctf_flags & LCTF_CHILD)
727             {
728               /* The contents of the parents array for elements not
729                  corresponding to children is undefined.  If there is no parent
730                  (itself a sign of a likely linker bug or corrupt input), we set
731                  it to itself.  */
732
733               ctf_import (one_fp, parent_fp);
734               if (parent_fp)
735                 parents_[walk - dedup_inputs] = parent_i;
736               else
737                 parents_[walk - dedup_inputs] = walk - dedup_inputs;
738             }
739           *walk = one_fp;
740           walk++;
741         }
742       if (err != ECTF_NEXT_END)
743         {
744           ctf_next_destroy (i);
745           goto iterr;
746         }
747     }
748   if (err != ECTF_NEXT_END)
749     goto iterr;
750
751   *parents = parents_;
752
753   return dedup_inputs;
754
755  oom:
756   err = ENOMEM;
757
758  iterr:
759   ctf_set_errno (fp, err);
760
761  err:
762   free (dedup_inputs);
763   free (parents_);
764   ctf_err_warn (fp, 0, 0, _("error in deduplicating CTF link "
765                             "input allocation"));
766   return NULL;
767 }
768
769 /* Close INPUTS that have already been linked, first the passed array, and then
770    that subset of the ctf_link_inputs archives they came from cited by the
771    CU_NAMES.  If CU_NAMES is not specified, close all the ctf_link_inputs in one
772    go, leaving it empty.  */
773 static int
774 ctf_link_deduplicating_close_inputs (ctf_dict_t *fp, ctf_dynhash_t *cu_names,
775                                      ctf_dict_t **inputs, ssize_t ninputs)
776 {
777   ctf_next_t *it = NULL;
778   void *name;
779   int err;
780   ssize_t i;
781
782   /* This is the inverse of ctf_link_deduplicating_open_inputs: so first, close
783      all the individual input dicts, opened by the archive iterator.  */
784   for (i = 0; i < ninputs; i++)
785     ctf_dict_close (inputs[i]);
786
787   /* Now close the archives they are part of.  */
788   if (cu_names)
789     {
790       while ((err = ctf_dynhash_next (cu_names, &it, &name, NULL)) == 0)
791         {
792           /* Remove the input from the linker inputs, if it exists, which also
793              closes it.  */
794
795           ctf_dynhash_remove (fp->ctf_link_inputs, (const char *) name);
796         }
797       if (err != ECTF_NEXT_END)
798         {
799           ctf_err_warn (fp, 0, err, _("iteration error in deduplicating link "
800                                       "input freeing"));
801           ctf_set_errno (fp, err);
802         }
803     }
804   else
805     ctf_dynhash_empty (fp->ctf_link_inputs);
806
807   return 0;
808 }
809
810 /* Do a deduplicating link of all variables in the inputs.  */
811 static int
812 ctf_link_deduplicating_variables (ctf_dict_t *fp, ctf_dict_t **inputs,
813                                   size_t ninputs, int cu_mapped)
814 {
815   size_t i;
816
817   for (i = 0; i < ninputs; i++)
818     {
819       ctf_next_t *it = NULL;
820       ctf_id_t type;
821       const char *name;
822
823       while ((type = ctf_variable_next (inputs[i], &it, &name)) != CTF_ERR)
824         {
825           if (ctf_link_one_variable (fp, inputs[i], name, type, cu_mapped) < 0)
826             {
827               ctf_next_destroy (it);
828               return -1;                        /* errno is set for us.  */
829             }
830         }
831       if (ctf_errno (inputs[i]) != ECTF_NEXT_END)
832         return ctf_set_errno (fp, ctf_errno (inputs[i]));
833     }
834   return 0;
835 }
836
837 /* Check for symbol conflicts during linking.  Three possibilities: already
838    exists, conflicting, or nonexistent.  We don't have a dvd structure we can
839    use as a flag like check_variable does, so we use a tristate return
840    value instead: -1: conflicting; 1: nonexistent: 0: already exists.  */
841
842 static int
843 check_sym (ctf_dict_t *fp, const char *name, ctf_id_t type, int functions)
844 {
845   ctf_dynhash_t *thishash = functions ? fp->ctf_funchash : fp->ctf_objthash;
846   ctf_dynhash_t *thathash = functions ? fp->ctf_objthash : fp->ctf_funchash;
847   void *value;
848
849   /* Wrong type (function when object is wanted, etc).  */
850   if (ctf_dynhash_lookup_kv (thathash, name, NULL, NULL))
851     return -1;
852
853   /* Not present at all yet.  */
854   if (!ctf_dynhash_lookup_kv (thishash, name, NULL, &value))
855     return 1;
856
857   /* Already present.  */
858   if ((ctf_id_t) (uintptr_t) value == type)
859     return 0;
860
861   /* Wrong type.  */
862   return -1;
863 }
864
865 /* Do a deduplicating link of one symtypetab (function info or data object) in
866    one input dict.  */
867
868 static int
869 ctf_link_deduplicating_one_symtypetab (ctf_dict_t *fp, ctf_dict_t *input,
870                                        int cu_mapped, int functions)
871 {
872   ctf_next_t *it = NULL;
873   const char *name;
874   ctf_id_t type;
875
876   while ((type = ctf_symbol_next (input, &it, &name, functions)) != CTF_ERR)
877     {
878       ctf_id_t dst_type;
879       ctf_dict_t *per_cu_out_fp;
880       int sym;
881
882       /* Look in the parent first.  */
883
884       if ((dst_type = ctf_dedup_type_mapping (fp, input, type)) == CTF_ERR)
885         return -1;                              /* errno is set for us.  */
886
887       if (dst_type != 0)
888         {
889           if (!ctf_assert (fp, ctf_type_isparent (fp, dst_type)))
890             return -1;                          /* errno is set for us.  */
891
892           sym = check_sym (fp, name, dst_type, functions);
893
894           /* Already present: next symbol.  */
895           if (sym == 0)
896             continue;
897           /* Not present: add it.  */
898           else if (sym > 0)
899             {
900               if (ctf_add_funcobjt_sym (fp, functions,
901                                         name, dst_type) < 0)
902                 return -1;                      /* errno is set for us.  */
903               continue;
904             }
905         }
906
907       /* Can't add to the parent due to a name clash (most unlikely), or because
908          it references a type only present in the child.  Try adding to the
909          child, creating if need be.  If we can't do that, skip it.  Don't add
910          to a child if we're doing a CU-mapped link, since that has only one
911          output.  */
912       if (cu_mapped)
913         {
914           ctf_dprintf ("Symbol %s in input file %s depends on a type %lx "
915                        "hidden due to conflicts: skipped.\n", name,
916                        ctf_unnamed_cuname (input), type);
917           continue;
918         }
919
920       if ((per_cu_out_fp = ctf_create_per_cu (fp, ctf_unnamed_cuname (input))) == NULL)
921         return -1;                              /* errno is set for us.  */
922
923       /* If the type was not found, check for it in the child too.  */
924       if (dst_type == 0)
925         {
926           if ((dst_type = ctf_dedup_type_mapping (per_cu_out_fp,
927                                                   input, type)) == CTF_ERR)
928             return -1;                          /* errno is set for us.  */
929
930           if (dst_type == 0)
931             {
932               ctf_err_warn (fp, 1, 0,
933                             _("type %lx for symbol %s in input file %s "
934                               "not found: skipped"), type, name,
935                             ctf_unnamed_cuname (input));
936               continue;
937             }
938         }
939
940       sym = check_sym (per_cu_out_fp, name, dst_type, functions);
941
942       /* Already present: next symbol.  */
943       if (sym == 0)
944         continue;
945       /* Not present: add it.  */
946       else if (sym > 0)
947         {
948           if (ctf_add_funcobjt_sym (per_cu_out_fp, functions,
949                                     name, dst_type) < 0)
950             return -1;                          /* errno is set for us.  */
951         }
952       else
953         {
954           /* Perhaps this should be an assertion failure.  */
955           ctf_err_warn (fp, 0, ECTF_DUPLICATE,
956                         _("symbol %s in input file %s found conflicting "
957                           "even when trying in per-CU dict."), name,
958                         ctf_unnamed_cuname (input));
959           return (ctf_set_errno (fp, ECTF_DUPLICATE));
960         }
961     }
962   if (ctf_errno (input) != ECTF_NEXT_END)
963     {
964       ctf_set_errno (fp, ctf_errno (input));
965       ctf_err_warn (fp, 0, ctf_errno (input),
966                     functions ? _("iterating over function symbols") :
967                     _("iterating over data symbols"));
968       return -1;
969     }
970
971   return 0;
972 }
973
974 /* Do a deduplicating link of the function info and data objects
975    in the inputs.  */
976 static int
977 ctf_link_deduplicating_syms (ctf_dict_t *fp, ctf_dict_t **inputs,
978                              size_t ninputs, int cu_mapped)
979 {
980   size_t i;
981
982   for (i = 0; i < ninputs; i++)
983     {
984       if (ctf_link_deduplicating_one_symtypetab (fp, inputs[i],
985                                                  cu_mapped, 0) < 0)
986         return -1;                              /* errno is set for us.  */
987
988       if (ctf_link_deduplicating_one_symtypetab (fp, inputs[i],
989                                                  cu_mapped, 1) < 0)
990         return -1;                              /* errno is set for us.  */
991     }
992
993   return 0;
994 }
995
996 /* Do the per-CU part of a deduplicating link.  */
997 static int
998 ctf_link_deduplicating_per_cu (ctf_dict_t *fp)
999 {
1000   ctf_next_t *i = NULL;
1001   int err;
1002   void *out_cu;
1003   void *in_cus;
1004
1005   /* Links with a per-CU mapping in force get a first pass of deduplication,
1006      dedupping the inputs for a given CU mapping into the output for that
1007      mapping.  The outputs from this process get fed back into the final pass
1008      that is carried out even for non-CU links.  */
1009
1010   while ((err = ctf_dynhash_next (fp->ctf_link_out_cu_mapping, &i, &out_cu,
1011                                   &in_cus)) == 0)
1012     {
1013       const char *out_name = (const char *) out_cu;
1014       ctf_dynhash_t *in = (ctf_dynhash_t *) in_cus;
1015       ctf_dict_t *out = NULL;
1016       ctf_dict_t **inputs;
1017       ctf_dict_t **outputs;
1018       ctf_archive_t *in_arc;
1019       ssize_t ninputs;
1020       ctf_link_input_t *only_input;
1021       uint32_t noutputs;
1022       uint32_t *parents;
1023
1024       if ((ninputs = ctf_link_deduplicating_count_inputs (fp, in,
1025                                                           &only_input)) == -1)
1026         goto err_open_inputs;
1027
1028       /* CU mapping with no inputs?  Skip.  */
1029       if (ninputs == 0)
1030         continue;
1031
1032       if (labs ((long int) ninputs) > 0xfffffffe)
1033         {
1034           ctf_err_warn (fp, 0, EFBIG, _("too many inputs in deduplicating "
1035                                         "link: %li"), (long int) ninputs);
1036           ctf_set_errno (fp, EFBIG);
1037           goto err_open_inputs;
1038         }
1039
1040       /* Short-circuit: a cu-mapped link with only one input archive with
1041          unconflicting contents is a do-nothing, and we can just leave the input
1042          in place: we do have to change the cuname, though, so we unwrap it,
1043          change the cuname, then stuff it back in the linker input again, via
1044          the clin_fp short-circuit member.  ctf_link_deduplicating_open_inputs
1045          will spot this member and jam it straight into the next link phase,
1046          ignoring the corresponding archive.  */
1047       if (only_input && ninputs == 1)
1048         {
1049           ctf_next_t *ai = NULL;
1050           int err;
1051
1052           /* We can abuse an archive iterator to get the only member cheaply, no
1053              matter what its name.  */
1054           only_input->clin_fp = ctf_archive_next (only_input->clin_arc,
1055                                                   &ai, NULL, 0, &err);
1056           if (!only_input->clin_fp)
1057             {
1058               ctf_err_warn (fp, 0, err, _("cannot open archive %s in "
1059                                           "CU-mapped CTF link"),
1060                             only_input->clin_filename);
1061               ctf_set_errno (fp, err);
1062               goto err_open_inputs;
1063             }
1064           ctf_next_destroy (ai);
1065
1066           if (strcmp (only_input->clin_filename, out_name) != 0)
1067             {
1068               /* Renaming. We need to add a new input, then null out the
1069                  clin_arc and clin_fp of the old one to stop it being
1070                  auto-closed on removal.  The new input needs its cuname changed
1071                  to out_name, which is doable only because the cuname is a
1072                  dynamic property which can be changed even in readonly
1073                  dicts. */
1074
1075               ctf_cuname_set (only_input->clin_fp, out_name);
1076               if (ctf_link_add_ctf_internal (fp, only_input->clin_arc,
1077                                              only_input->clin_fp,
1078                                              out_name) < 0)
1079                 {
1080                   ctf_err_warn (fp, 0, 0, _("cannot add intermediate files "
1081                                             "to link"));
1082                   goto err_open_inputs;
1083                 }
1084               only_input->clin_arc = NULL;
1085               only_input->clin_fp = NULL;
1086               ctf_dynhash_remove (fp->ctf_link_inputs,
1087                                   only_input->clin_filename);
1088             }
1089           continue;
1090         }
1091
1092       /* This is a real CU many-to-one mapping: we must dedup the inputs into
1093          a new output to be used in the final link phase.  */
1094
1095       if ((inputs = ctf_link_deduplicating_open_inputs (fp, in, ninputs,
1096                                                         &parents)) == NULL)
1097         {
1098           ctf_next_destroy (i);
1099           goto err_inputs;
1100         }
1101
1102       if ((out = ctf_create (&err)) == NULL)
1103         {
1104           ctf_err_warn (fp, 0, err, _("cannot create per-CU CTF archive "
1105                                       "for %s"),
1106                         out_name);
1107           ctf_set_errno (fp, err);
1108           goto err_inputs;
1109         }
1110
1111       /* Share the atoms table to reduce memory usage.  */
1112       out->ctf_dedup_atoms = fp->ctf_dedup_atoms_alloc;
1113
1114       /* No ctf_imports at this stage: this per-CU dictionary has no parents.
1115          Parent/child deduplication happens in the link's final pass.  However,
1116          the cuname *is* important, as it is propagated into the final
1117          dictionary.  */
1118       ctf_cuname_set (out, out_name);
1119
1120       if (ctf_dedup (out, inputs, ninputs, parents, 1) < 0)
1121         {
1122           ctf_set_errno (fp, ctf_errno (out));
1123           ctf_err_warn (fp, 0, 0, _("CU-mapped deduplication failed for %s"),
1124                         out_name);
1125           goto err_inputs;
1126         }
1127
1128       if ((outputs = ctf_dedup_emit (out, inputs, ninputs, parents,
1129                                      &noutputs, 1)) == NULL)
1130         {
1131           ctf_set_errno (fp, ctf_errno (out));
1132           ctf_err_warn (fp, 0, 0, _("CU-mapped deduplicating link type emission "
1133                                      "failed for %s"), out_name);
1134           goto err_inputs;
1135         }
1136       if (!ctf_assert (fp, noutputs == 1))
1137         goto err_inputs_outputs;
1138
1139       if (!(fp->ctf_link_flags & CTF_LINK_OMIT_VARIABLES_SECTION)
1140           && ctf_link_deduplicating_variables (out, inputs, ninputs, 1) < 0)
1141         {
1142           ctf_set_errno (fp, ctf_errno (out));
1143           ctf_err_warn (fp, 0, 0, _("CU-mapped deduplicating link variable "
1144                                     "emission failed for %s"), out_name);
1145           goto err_inputs_outputs;
1146         }
1147
1148       ctf_dedup_fini (out, outputs, noutputs);
1149
1150       /* For now, we omit symbol section linking for CU-mapped links, until it
1151          is clear how to unify the symbol table across such links.  (Perhaps we
1152          should emit an unconditionally indexed symtab, like the compiler
1153          does.)  */
1154
1155       if (ctf_link_deduplicating_close_inputs (fp, in, inputs, ninputs) < 0)
1156         {
1157           free (inputs);
1158           free (parents);
1159           goto err_outputs;
1160         }
1161       free (inputs);
1162       free (parents);
1163
1164       /* Splice any errors or warnings created during this link back into the
1165          dict that the caller knows about.  */
1166       ctf_list_splice (&fp->ctf_errs_warnings, &outputs[0]->ctf_errs_warnings);
1167
1168       /* This output now becomes an input to the next link phase, with a name
1169          equal to the CU name.  We have to wrap it in an archive wrapper
1170          first.  */
1171
1172       if ((in_arc = ctf_new_archive_internal (0, 0, NULL, outputs[0], NULL,
1173                                               NULL, &err)) == NULL)
1174         {
1175           ctf_set_errno (fp, err);
1176           goto err_outputs;
1177         }
1178
1179       if (ctf_link_add_ctf_internal (fp, in_arc, NULL,
1180                                      ctf_cuname (outputs[0])) < 0)
1181         {
1182           ctf_err_warn (fp, 0, 0, _("cannot add intermediate files to link"));
1183           goto err_outputs;
1184         }
1185
1186       ctf_dict_close (out);
1187       free (outputs);
1188       continue;
1189
1190     err_inputs_outputs:
1191       ctf_list_splice (&fp->ctf_errs_warnings, &outputs[0]->ctf_errs_warnings);
1192       ctf_dict_close (outputs[0]);
1193       free (outputs);
1194     err_inputs:
1195       ctf_link_deduplicating_close_inputs (fp, in, inputs, ninputs);
1196       ctf_dict_close (out);
1197       free (inputs);
1198       free (parents);
1199     err_open_inputs:
1200       ctf_next_destroy (i);
1201       return -1;
1202
1203     err_outputs:
1204       ctf_list_splice (&fp->ctf_errs_warnings, &outputs[0]->ctf_errs_warnings);
1205       ctf_dict_close (outputs[0]);
1206       free (outputs);
1207       ctf_next_destroy (i);
1208       return -1;                                /* Errno is set for us.  */
1209     }
1210   if (err != ECTF_NEXT_END)
1211     {
1212       ctf_err_warn (fp, 0, err, _("iteration error in CU-mapped deduplicating "
1213                                   "link"));
1214       return ctf_set_errno (fp, err);
1215     }
1216
1217   return 0;
1218 }
1219
1220 /* Do a deduplicating link using the ctf-dedup machinery.  */
1221 static void
1222 ctf_link_deduplicating (ctf_dict_t *fp)
1223 {
1224   size_t i;
1225   ctf_dict_t **inputs, **outputs = NULL;
1226   ssize_t ninputs;
1227   uint32_t noutputs;
1228   uint32_t *parents;
1229
1230   if (ctf_dedup_atoms_init (fp) < 0)
1231     {
1232       ctf_err_warn (fp, 0, 0, _("allocating CTF dedup atoms table"));
1233       return;                                   /* Errno is set for us.  */
1234     }
1235
1236   if (fp->ctf_link_out_cu_mapping
1237       && (ctf_link_deduplicating_per_cu (fp) < 0))
1238     return;                                     /* Errno is set for us.  */
1239
1240   if ((ninputs = ctf_link_deduplicating_count_inputs (fp, NULL, NULL)) < 0)
1241     return;                                     /* Errno is set for us.  */
1242
1243   if ((inputs = ctf_link_deduplicating_open_inputs (fp, NULL, ninputs,
1244                                                     &parents)) == NULL)
1245     return;                                     /* Errno is set for us.  */
1246
1247   if (ninputs == 1 && ctf_cuname (inputs[0]) != NULL)
1248     ctf_cuname_set (fp, ctf_cuname (inputs[0]));
1249
1250   if (ctf_dedup (fp, inputs, ninputs, parents, 0) < 0)
1251     {
1252       ctf_err_warn (fp, 0, 0, _("deduplication failed for %s"),
1253                     ctf_link_input_name (fp));
1254       goto err;
1255     }
1256
1257   if ((outputs = ctf_dedup_emit (fp, inputs, ninputs, parents, &noutputs,
1258                                  0)) == NULL)
1259     {
1260       ctf_err_warn (fp, 0, 0, _("deduplicating link type emission failed "
1261                                 "for %s"), ctf_link_input_name (fp));
1262       goto err;
1263     }
1264
1265   if (!ctf_assert (fp, outputs[0] == fp))
1266     goto err;
1267
1268   for (i = 0; i < noutputs; i++)
1269     {
1270       char *dynname;
1271
1272       /* We already have access to this one.  Close the duplicate.  */
1273       if (i == 0)
1274         {
1275           ctf_dict_close (outputs[0]);
1276           continue;
1277         }
1278
1279       if ((dynname = strdup (ctf_cuname (outputs[i]))) == NULL)
1280         goto oom_one_output;
1281
1282       if (ctf_dynhash_insert (fp->ctf_link_outputs, dynname, outputs[i]) < 0)
1283         goto oom_one_output;
1284
1285       continue;
1286
1287     oom_one_output:
1288       ctf_set_errno (fp, ENOMEM);
1289       ctf_err_warn (fp, 0, 0, _("out of memory allocating link outputs"));
1290       free (dynname);
1291
1292       for (; i < noutputs; i++)
1293         ctf_dict_close (outputs[i]);
1294       goto err;
1295     }
1296
1297   if (!(fp->ctf_link_flags & CTF_LINK_OMIT_VARIABLES_SECTION)
1298       && ctf_link_deduplicating_variables (fp, inputs, ninputs, 0) < 0)
1299     {
1300       ctf_err_warn (fp, 0, 0, _("deduplicating link variable emission failed for "
1301                                 "%s"), ctf_link_input_name (fp));
1302       goto err_clean_outputs;
1303     }
1304
1305   if (ctf_link_deduplicating_syms (fp, inputs, ninputs, 0) < 0)
1306     {
1307       ctf_err_warn (fp, 0, 0, _("deduplicating link symbol emission failed for "
1308                                 "%s"), ctf_link_input_name (fp));
1309       goto err_clean_outputs;
1310     }
1311
1312   ctf_dedup_fini (fp, outputs, noutputs);
1313
1314   /* Now close all the inputs, including per-CU intermediates.  */
1315
1316   if (ctf_link_deduplicating_close_inputs (fp, NULL, inputs, ninputs) < 0)
1317     return;                                     /* errno is set for us.  */
1318
1319   ninputs = 0;                                  /* Prevent double-close.  */
1320   ctf_set_errno (fp, 0);
1321
1322   /* Fall through.  */
1323
1324  err:
1325   for (i = 0; i < (size_t) ninputs; i++)
1326     ctf_dict_close (inputs[i]);
1327   free (inputs);
1328   free (parents);
1329   free (outputs);
1330   return;
1331
1332  err_clean_outputs:
1333   for (i = 1; i < noutputs; i++)
1334     {
1335       ctf_dynhash_remove (fp->ctf_link_outputs, ctf_cuname (outputs[i]));
1336       ctf_dict_close (outputs[i]);
1337     }
1338   goto err;
1339 }
1340
1341 /* Merge types and variable sections in all dicts added to the link together.
1342    All the added dicts are closed.  */
1343 int
1344 ctf_link (ctf_dict_t *fp, int flags)
1345 {
1346   ctf_next_t *i = NULL;
1347   int err;
1348
1349   fp->ctf_link_flags = flags;
1350
1351   if (fp->ctf_link_inputs == NULL)
1352     return 0;                                   /* Nothing to do. */
1353
1354   if (fp->ctf_link_outputs == NULL)
1355     fp->ctf_link_outputs = ctf_dynhash_create (ctf_hash_string,
1356                                                ctf_hash_eq_string, free,
1357                                                (ctf_hash_free_fun)
1358                                                ctf_dict_close);
1359
1360   if (fp->ctf_link_outputs == NULL)
1361     return ctf_set_errno (fp, ENOMEM);
1362
1363   /* Create empty CUs if requested.  We do not currently claim that multiple
1364      links in succession with CTF_LINK_EMPTY_CU_MAPPINGS set in some calls and
1365      not set in others will do anything especially sensible.  */
1366
1367   fp->ctf_flags |= LCTF_LINKING;
1368   if (fp->ctf_link_out_cu_mapping && (flags & CTF_LINK_EMPTY_CU_MAPPINGS))
1369     {
1370       void *v;
1371
1372       while ((err = ctf_dynhash_next (fp->ctf_link_out_cu_mapping, &i, &v,
1373                                       NULL)) == 0)
1374         {
1375           const char *to = (const char *) v;
1376           if (ctf_create_per_cu (fp, to) == NULL)
1377             {
1378               fp->ctf_flags &= ~LCTF_LINKING;
1379               ctf_next_destroy (i);
1380               return -1;                        /* Errno is set for us.  */
1381             }
1382         }
1383       if (err != ECTF_NEXT_END)
1384         {
1385           fp->ctf_flags &= ~LCTF_LINKING;
1386           ctf_err_warn (fp, 1, err, _("iteration error creating empty CUs"));
1387           ctf_set_errno (fp, err);
1388           return -1;
1389         }
1390     }
1391
1392   ctf_link_deduplicating (fp);
1393
1394   fp->ctf_flags &= ~LCTF_LINKING;
1395   if ((ctf_errno (fp) != 0) && (ctf_errno (fp) != ECTF_NOCTFDATA))
1396     return -1;
1397   return 0;
1398 }
1399
1400 typedef struct ctf_link_out_string_cb_arg
1401 {
1402   const char *str;
1403   uint32_t offset;
1404   int err;
1405 } ctf_link_out_string_cb_arg_t;
1406
1407 /* Intern a string in the string table of an output per-CU CTF file.  */
1408 static void
1409 ctf_link_intern_extern_string (void *key _libctf_unused_, void *value,
1410                                void *arg_)
1411 {
1412   ctf_dict_t *fp = (ctf_dict_t *) value;
1413   ctf_link_out_string_cb_arg_t *arg = (ctf_link_out_string_cb_arg_t *) arg_;
1414
1415   fp->ctf_flags |= LCTF_DIRTY;
1416   if (!ctf_str_add_external (fp, arg->str, arg->offset))
1417     arg->err = ENOMEM;
1418 }
1419
1420 /* Repeatedly call ADD_STRING to acquire strings from the external string table,
1421    adding them to the atoms table for this CU and all subsidiary CUs.
1422
1423    If ctf_link is also called, it must be called first if you want the new CTF
1424    files ctf_link can create to get their strings dedupped against the ELF
1425    strtab properly.  */
1426 int
1427 ctf_link_add_strtab (ctf_dict_t *fp, ctf_link_strtab_string_f *add_string,
1428                      void *arg)
1429 {
1430   const char *str;
1431   uint32_t offset;
1432   int err = 0;
1433
1434   while ((str = add_string (&offset, arg)) != NULL)
1435     {
1436       ctf_link_out_string_cb_arg_t iter_arg = { str, offset, 0 };
1437
1438       fp->ctf_flags |= LCTF_DIRTY;
1439       if (!ctf_str_add_external (fp, str, offset))
1440         err = ENOMEM;
1441
1442       ctf_dynhash_iter (fp->ctf_link_outputs, ctf_link_intern_extern_string,
1443                         &iter_arg);
1444       if (iter_arg.err)
1445         err = iter_arg.err;
1446     }
1447
1448   if (err)
1449     ctf_set_errno (fp, err);
1450
1451   return -err;
1452 }
1453
1454 /* Inform the ctf-link machinery of a new symbol in the target symbol table
1455    (which must be some symtab that is not usually stripped, and which
1456    is in agreement with ctf_bfdopen_ctfsect).  May be called either before or
1457    after ctf_link_add_strtab.  */
1458 int
1459 ctf_link_add_linker_symbol (ctf_dict_t *fp, ctf_link_sym_t *sym)
1460 {
1461   ctf_in_flight_dynsym_t *cid;
1462
1463   /* Cheat a little: if there is already an ENOMEM error code recorded against
1464      this dict, we shouldn't even try to add symbols because there will be no
1465      memory to do so: probably we failed to add some previous symbol.  This
1466      makes out-of-memory exits 'sticky' across calls to this function, so the
1467      caller doesn't need to worry about error conditions.  */
1468
1469   if (ctf_errno (fp) == ENOMEM)
1470     return -ENOMEM;                             /* errno is set for us.  */
1471
1472   if (ctf_symtab_skippable (sym))
1473     return 0;
1474
1475   if (sym->st_type != STT_OBJECT && sym->st_type != STT_FUNC)
1476     return 0;
1477
1478   /* Add the symbol to the in-flight list.  */
1479
1480   if ((cid = malloc (sizeof (ctf_in_flight_dynsym_t))) == NULL)
1481     goto oom;
1482
1483   cid->cid_sym = *sym;
1484   ctf_list_append (&fp->ctf_in_flight_dynsyms, cid);
1485
1486   return 0;
1487
1488  oom:
1489   ctf_dynhash_destroy (fp->ctf_dynsyms);
1490   fp->ctf_dynsyms = NULL;
1491   ctf_set_errno (fp, ENOMEM);
1492   return -ENOMEM;
1493 }
1494
1495 /* Impose an ordering on symbols.  The ordering takes effect immediately, but
1496    since the ordering info does not include type IDs, lookups may return nothing
1497    until such IDs are added by calls to ctf_add_*_sym.  Must be called after
1498    ctf_link_add_strtab and ctf_link_add_linker_symbol.  */
1499 int
1500 ctf_link_shuffle_syms (ctf_dict_t *fp)
1501 {
1502   ctf_in_flight_dynsym_t *did, *nid;
1503   ctf_next_t *i = NULL;
1504   int err = ENOMEM;
1505   void *name_, *sym_;
1506
1507   if (!fp->ctf_dynsyms)
1508     {
1509       fp->ctf_dynsyms = ctf_dynhash_create (ctf_hash_string,
1510                                             ctf_hash_eq_string,
1511                                             NULL, free);
1512       if (!fp->ctf_dynsyms)
1513         {
1514           ctf_set_errno (fp, ENOMEM);
1515           return -ENOMEM;
1516         }
1517     }
1518
1519   /* Add all the symbols, excluding only those we already know are prohibited
1520      from appearing in symtypetabs.  */
1521
1522   for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1523     {
1524       ctf_link_sym_t *new_sym;
1525
1526       nid = ctf_list_next (did);
1527       ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1528
1529       /* We might get a name or an external strtab offset.  The strtab offset is
1530          guaranteed resolvable at this point, so turn it into a string.  */
1531
1532       if (did->cid_sym.st_name == NULL)
1533         {
1534           uint32_t off = CTF_SET_STID (did->cid_sym.st_nameidx, CTF_STRTAB_1);
1535
1536           did->cid_sym.st_name = ctf_strraw (fp, off);
1537           did->cid_sym.st_nameidx_set = 0;
1538           if (!ctf_assert (fp, did->cid_sym.st_name != NULL))
1539             return -ECTF_INTERNAL;              /* errno is set for us.  */
1540         }
1541
1542       /* The symbol might have turned out to be nameless, so we have to recheck
1543          for skippability here.  */
1544       if (!ctf_symtab_skippable (&did->cid_sym))
1545         {
1546           ctf_dprintf ("symbol name from linker: %s\n", did->cid_sym.st_name);
1547
1548           if ((new_sym = malloc (sizeof (ctf_link_sym_t))) == NULL)
1549             goto local_oom;
1550
1551           memcpy (new_sym, &did->cid_sym, sizeof (ctf_link_sym_t));
1552           if (ctf_dynhash_cinsert (fp->ctf_dynsyms, new_sym->st_name, new_sym) < 0)
1553             goto local_oom;
1554
1555           if (fp->ctf_dynsymmax < new_sym->st_symidx)
1556             fp->ctf_dynsymmax = new_sym->st_symidx;
1557         }
1558
1559       free (did);
1560       continue;
1561
1562     local_oom:
1563       free (did);
1564       free (new_sym);
1565       goto err;
1566     }
1567
1568   /* If no symbols are reported, unwind what we have done and return.  This
1569      makes it a bit easier for the serializer to tell that no symbols have been
1570      reported and that it should look elsewhere for reported symbols.  */
1571   if (!ctf_dynhash_elements (fp->ctf_dynsyms))
1572     {
1573       ctf_dprintf ("No symbols: not a final link.\n");
1574       free (fp->ctf_dynsyms);
1575       fp->ctf_dynsyms = NULL;
1576       return 0;
1577     }
1578
1579   /* Construct a mapping from shndx to the symbol info.  */
1580   free (fp->ctf_dynsymidx);
1581   if ((fp->ctf_dynsymidx = calloc (fp->ctf_dynsymmax + 1,
1582                                    sizeof (ctf_link_sym_t *))) == NULL)
1583     goto err;
1584
1585   while ((err = ctf_dynhash_next (fp->ctf_dynsyms, &i, &name_, &sym_)) == 0)
1586     {
1587       const char *name = (const char *) name;
1588       ctf_link_sym_t *symp = (ctf_link_sym_t *) sym_;
1589
1590       if (!ctf_assert (fp, symp->st_symidx <= fp->ctf_dynsymmax))
1591         {
1592           ctf_next_destroy (i);
1593           err = ctf_errno (fp);
1594           goto err;
1595         }
1596       fp->ctf_dynsymidx[symp->st_symidx] = symp;
1597     }
1598   if (err != ECTF_NEXT_END)
1599     {
1600       ctf_err_warn (fp, 0, err, _("error iterating over shuffled symbols"));
1601       goto err;
1602     }
1603   return 0;
1604
1605  err:
1606   /* Leave the in-flight symbols around: they'll be freed at
1607      dict close time regardless.  */
1608   ctf_dynhash_destroy (fp->ctf_dynsyms);
1609   fp->ctf_dynsyms = NULL;
1610   free (fp->ctf_dynsymidx);
1611   fp->ctf_dynsymidx = NULL;
1612   fp->ctf_dynsymmax = 0;
1613   ctf_set_errno (fp, err);
1614   return -err;
1615 }
1616
1617 typedef struct ctf_name_list_accum_cb_arg
1618 {
1619   char **names;
1620   ctf_dict_t *fp;
1621   ctf_dict_t **files;
1622   size_t i;
1623   char **dynames;
1624   size_t ndynames;
1625 } ctf_name_list_accum_cb_arg_t;
1626
1627 /* Accumulate the names and a count of the names in the link output hash.  */
1628 static void
1629 ctf_accumulate_archive_names (void *key, void *value, void *arg_)
1630 {
1631   const char *name = (const char *) key;
1632   ctf_dict_t *fp = (ctf_dict_t *) value;
1633   char **names;
1634   ctf_dict_t **files;
1635   ctf_name_list_accum_cb_arg_t *arg = (ctf_name_list_accum_cb_arg_t *) arg_;
1636
1637   if ((names = realloc (arg->names, sizeof (char *) * ++(arg->i))) == NULL)
1638     {
1639       (arg->i)--;
1640       ctf_set_errno (arg->fp, ENOMEM);
1641       return;
1642     }
1643
1644   if ((files = realloc (arg->files, sizeof (ctf_dict_t *) * arg->i)) == NULL)
1645     {
1646       (arg->i)--;
1647       ctf_set_errno (arg->fp, ENOMEM);
1648       return;
1649     }
1650
1651   /* Allow the caller to get in and modify the name at the last minute.  If the
1652      caller *does* modify the name, we have to stash away the new name the
1653      caller returned so we can free it later on.  (The original name is the key
1654      of the ctf_link_outputs hash and is freed by the dynhash machinery.)  */
1655
1656   if (fp->ctf_link_memb_name_changer)
1657     {
1658       char **dynames;
1659       char *dyname;
1660       void *nc_arg = fp->ctf_link_memb_name_changer_arg;
1661
1662       dyname = fp->ctf_link_memb_name_changer (fp, name, nc_arg);
1663
1664       if (dyname != NULL)
1665         {
1666           if ((dynames = realloc (arg->dynames,
1667                                   sizeof (char *) * ++(arg->ndynames))) == NULL)
1668             {
1669               (arg->ndynames)--;
1670               ctf_set_errno (arg->fp, ENOMEM);
1671               return;
1672             }
1673             arg->dynames = dynames;
1674             name = (const char *) dyname;
1675         }
1676     }
1677
1678   arg->names = names;
1679   arg->names[(arg->i) - 1] = (char *) name;
1680   arg->files = files;
1681   arg->files[(arg->i) - 1] = fp;
1682 }
1683
1684 /* Change the name of the parent CTF section, if the name transformer has got to
1685    it.  */
1686 static void
1687 ctf_change_parent_name (void *key _libctf_unused_, void *value, void *arg)
1688 {
1689   ctf_dict_t *fp = (ctf_dict_t *) value;
1690   const char *name = (const char *) arg;
1691
1692   ctf_parent_name_set (fp, name);
1693 }
1694
1695 /* Warn if we may suffer information loss because the CTF input files are too
1696    old.  Usually we provide complete backward compatibility, but compiler
1697    changes etc which never hit a release may have a flag in the header that
1698    simply prevents those changes from being used.  */
1699 static void
1700 ctf_link_warn_outdated_inputs (ctf_dict_t *fp)
1701 {
1702   ctf_next_t *i = NULL;
1703   void *name_;
1704   void *ifp_;
1705   int err;
1706
1707   while ((err = ctf_dynhash_next (fp->ctf_link_inputs, &i, &name_, &ifp_)) == 0)
1708     {
1709       const char *name = (const char *) name_;
1710       ctf_dict_t *ifp = (ctf_dict_t *) ifp_;
1711
1712       if (!(ifp->ctf_header->cth_flags & CTF_F_NEWFUNCINFO)
1713           && (ifp->ctf_header->cth_varoff - ifp->ctf_header->cth_funcoff) > 0)
1714         ctf_err_warn (ifp, 1, 0, _("linker input %s has CTF func info but uses "
1715                                    "an old, unreleased func info format: "
1716                                    "this func info section will be dropped."),
1717                       name);
1718     }
1719   if (err != ECTF_NEXT_END)
1720     ctf_err_warn (fp, 0, err, _("error checking for outdated inputs"));
1721 }
1722
1723 /* Write out a CTF archive (if there are per-CU CTF files) or a CTF file
1724    (otherwise) into a new dynamically-allocated string, and return it.
1725    Members with sizes above THRESHOLD are compressed.  */
1726 unsigned char *
1727 ctf_link_write (ctf_dict_t *fp, size_t *size, size_t threshold)
1728 {
1729   ctf_name_list_accum_cb_arg_t arg;
1730   char **names;
1731   char *transformed_name = NULL;
1732   ctf_dict_t **files;
1733   FILE *f = NULL;
1734   size_t i;
1735   int err;
1736   long fsize;
1737   const char *errloc;
1738   unsigned char *buf = NULL;
1739
1740   memset (&arg, 0, sizeof (ctf_name_list_accum_cb_arg_t));
1741   arg.fp = fp;
1742   fp->ctf_flags |= LCTF_LINKING;
1743
1744   ctf_link_warn_outdated_inputs (fp);
1745
1746   if (fp->ctf_link_outputs)
1747     {
1748       ctf_dynhash_iter (fp->ctf_link_outputs, ctf_accumulate_archive_names, &arg);
1749       if (ctf_errno (fp) < 0)
1750         {
1751           errloc = "hash creation";
1752           goto err;
1753         }
1754     }
1755
1756   /* No extra outputs? Just write a simple ctf_dict_t.  */
1757   if (arg.i == 0)
1758     {
1759       unsigned char *ret = ctf_write_mem (fp, size, threshold);
1760       fp->ctf_flags &= ~LCTF_LINKING;
1761       return ret;
1762     }
1763
1764   /* Writing an archive.  Stick ourselves (the shared repository, parent of all
1765      other archives) on the front of it with the default name.  */
1766   if ((names = realloc (arg.names, sizeof (char *) * (arg.i + 1))) == NULL)
1767     {
1768       errloc = "name reallocation";
1769       goto err_no;
1770     }
1771   arg.names = names;
1772   memmove (&(arg.names[1]), arg.names, sizeof (char *) * (arg.i));
1773
1774   arg.names[0] = (char *) _CTF_SECTION;
1775   if (fp->ctf_link_memb_name_changer)
1776     {
1777       void *nc_arg = fp->ctf_link_memb_name_changer_arg;
1778
1779       transformed_name = fp->ctf_link_memb_name_changer (fp, _CTF_SECTION,
1780                                                          nc_arg);
1781
1782       if (transformed_name != NULL)
1783         {
1784           arg.names[0] = transformed_name;
1785           ctf_dynhash_iter (fp->ctf_link_outputs, ctf_change_parent_name,
1786                             transformed_name);
1787         }
1788     }
1789
1790   /* Propagate the link flags to all the dicts in this link.  */
1791   for (i = 0; i < arg.i; i++)
1792     {
1793       arg.files[i]->ctf_link_flags = fp->ctf_link_flags;
1794       arg.files[i]->ctf_flags |= LCTF_LINKING;
1795     }
1796
1797   if ((files = realloc (arg.files,
1798                         sizeof (struct ctf_dict *) * (arg.i + 1))) == NULL)
1799     {
1800       errloc = "ctf_dict reallocation";
1801       goto err_no;
1802     }
1803   arg.files = files;
1804   memmove (&(arg.files[1]), arg.files, sizeof (ctf_dict_t *) * (arg.i));
1805   arg.files[0] = fp;
1806
1807   if ((f = tmpfile ()) == NULL)
1808     {
1809       errloc = "tempfile creation";
1810       goto err_no;
1811     }
1812
1813   if ((err = ctf_arc_write_fd (fileno (f), arg.files, arg.i + 1,
1814                                (const char **) arg.names,
1815                                threshold)) < 0)
1816     {
1817       errloc = "archive writing";
1818       ctf_set_errno (fp, err);
1819       goto err;
1820     }
1821
1822   if (fseek (f, 0, SEEK_END) < 0)
1823     {
1824       errloc = "seeking to end";
1825       goto err_no;
1826     }
1827
1828   if ((fsize = ftell (f)) < 0)
1829     {
1830       errloc = "filesize determination";
1831       goto err_no;
1832     }
1833
1834   if (fseek (f, 0, SEEK_SET) < 0)
1835     {
1836       errloc = "filepos resetting";
1837       goto err_no;
1838     }
1839
1840   if ((buf = malloc (fsize)) == NULL)
1841     {
1842       errloc = "CTF archive buffer allocation";
1843       goto err_no;
1844     }
1845
1846   while (!feof (f) && fread (buf, fsize, 1, f) == 0)
1847     if (ferror (f))
1848       {
1849         errloc = "reading archive from temporary file";
1850         goto err_no;
1851       }
1852
1853   *size = fsize;
1854   free (arg.names);
1855   free (arg.files);
1856   free (transformed_name);
1857   if (arg.ndynames)
1858     {
1859       size_t i;
1860       for (i = 0; i < arg.ndynames; i++)
1861         free (arg.dynames[i]);
1862       free (arg.dynames);
1863     }
1864   fclose (f);
1865   return buf;
1866
1867  err_no:
1868   ctf_set_errno (fp, errno);
1869
1870   /* Turn off the is-linking flag on all the dicts in this link.  */
1871   for (i = 0; i < arg.i; i++)
1872     arg.files[i]->ctf_flags &= ~LCTF_LINKING;
1873  err:
1874   free (buf);
1875   if (f)
1876     fclose (f);
1877   free (arg.names);
1878   free (arg.files);
1879   free (transformed_name);
1880   if (arg.ndynames)
1881     {
1882       size_t i;
1883       for (i = 0; i < arg.ndynames; i++)
1884         free (arg.dynames[i]);
1885       free (arg.dynames);
1886     }
1887   ctf_err_warn (fp, 0, 0, _("cannot write archive in link: %s failure"),
1888                 errloc);
1889   return NULL;
1890 }
This page took 0.132909 seconds and 4 git commands to generate.