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