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