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