1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25 /*
26 * Copyright 2012 Jason King. All rights reserved.
27 * Use is subject to license terms.
28 */
29
30 /*
31 * Copyright 2018 Joyent, Inc.
32 */
33
34 /*
35 * CTF DWARF conversion theory.
36 *
37 * DWARF data contains a series of compilation units. Each compilation unit
38 * generally refers to an object file or what once was, in the case of linked
39 * binaries and shared objects. Each compilation unit has a series of what DWARF
40 * calls a DIE (Debugging Information Entry). The set of entries that we care
41 * about have type information stored in a series of attributes. Each DIE also
42 * has a tag that identifies the kind of attributes that it has.
43 *
44 * A given DIE may itself have children. For example, a DIE that represents a
45 * structure has children which represent members. Whenever we encounter a DIE
46 * that has children or other values or types associated with it, we recursively
47 * process those children first so that way we can then refer to the generated
48 * CTF type id while processing its parent. This reduces the amount of unknowns
49 * and fixups that we need. It also ensures that we don't accidentally add types
50 * that an overzealous compiler might add to the DWARF data but aren't used by
51 * anything in the system.
52 *
53 * Once we do a conversion, we store a mapping in an AVL tree that goes from the
54 * DWARF's die offset, which is relative to the given compilation unit, to a
55 * ctf_id_t.
56 *
57 * Unfortunately, some compilers actually will emit duplicate entries for a
58 * given type that look similar, but aren't quite. To that end, we go through
59 * and do a variant on a merge once we're done processing a single compilation
60 * unit which deduplicates all of the types that are in the unit.
61 *
62 * Finally, if we encounter an object that has multiple compilation units, then
63 * we'll convert all of the compilation units separately and then do a merge, so
64 * that way we can result in one single ctf_file_t that represents everything
65 * for the object.
66 *
67 * Conversion Steps
68 * ----------------
69 *
70 * Because a given object we've been given to convert may have multiple
71 * compilation units, we break the work into two halves. The first half
72 * processes each compilation unit (potentially in parallel) and then the second
73 * half optionally merges all of the dies in the first half. First, we'll cover
74 * what's involved in converting a single ctf_cu_t's dwarf to CTF. This covers
75 * the work done in ctf_dwarf_convert_one().
76 *
77 * An individual ctf_cu_t, which represents a compilation unit, is converted to
78 * CTF in a series of multiple passes.
79 *
80 * Pass 1: During the first pass we walk all of the top-level dies and if we
81 * find a function, variable, struct, union, enum or typedef, we recursively
82 * transform all of its types. We don't recurse or process everything, because
83 * we don't want to add some of the types that compilers may add which are
84 * effectively unused.
85 *
86 * During pass 1, if we encounter any structures or unions we mark them for
87 * fixing up later. This is necessary because we may not be able to determine
88 * the full size of a structure at the beginning of time. This will happen if
89 * the DWARF attribute DW_AT_byte_size is not present for a member. Because of
90 * this possibility we defer adding members to structures or even converting
91 * them during pass 1 and save that for pass 2. Adding all of the base
92 * structures without any of their members helps deal with any circular
93 * dependencies that we might encounter.
94 *
95 * Pass 2: This pass is used to do the first half of fixing up structures and
96 * unions. Rather than walk the entire type space again, we actually walk the
97 * list of structures and unions that we marked for later fixing up. Here, we
98 * iterate over every structure and add members to the underlying ctf_file_t,
99 * but not to the structs themselves. One might wonder why we don't, and the
100 * main reason is that libctf requires a ctf_update() be done before adding the
101 * members to structures or unions.
102 *
103 * Pass 3: This pass is used to do the second half of fixing up structures and
104 * unions. During this part we always go through and add members to structures
105 * and unions that we added to the container in the previous pass. In addition,
106 * we set the structure and union's actual size, which may have additional
107 * padding added by the compiler, it isn't simply the last offset. DWARF always
108 * guarantees an attribute exists for this. Importantly no ctf_id_t's change
109 * during pass 2.
110 *
111 * Pass 4: The next phase is to add CTF entries for all of the symbols and
112 * variables that are present in this die. During pass 1 we added entries to a
113 * map for each variable and function. During this pass, we iterate over the
114 * symbol table and when we encounter a symbol that we have in our lists of
115 * translated information which matches, we then add it to the ctf_file_t.
116 *
117 * Pass 5: Here we go and look for any weak symbols and functions and see if
118 * they match anything that we recognize. If so, then we add type information
119 * for them at this point based on the matching type.
120 *
121 * Pass 6: This pass is actually a variant on a merge. The traditional merge
122 * process expects there to be no duplicate types. As such, at the end of
123 * conversion, we do a dedup on all of the types in the system. The
124 * deduplication process is described in lib/libctf/common/ctf_merge.c.
125 *
126 * Once pass 6 is done, we've finished processing the individual compilation
127 * unit.
128 *
129 * The following steps reflect the general process of doing a conversion.
130 *
131 * 1) Walk the dwarf section and determine the number of compilation units
132 * 2) Create a ctf_cu_t for each compilation unit
133 * 3) Add all ctf_cu_t's to a workq
134 * 4) Have the workq process each die with ctf_dwarf_convert_one. This itself
135 * is comprised of several steps, which were already enumerated.
136 * 5) If we have multiple cu's, we do a ctf merge of all the dies. The mechanics
137 * of the merge are discussed in lib/libctf/common/ctf_merge.c.
138 * 6) Free everything up and return a ctf_file_t to the user. If we only had a
139 * single compilation unit, then we give that to the user. Otherwise, we
140 * return the merged ctf_file_t.
141 *
142 * Threading
143 * ---------
144 *
145 * The process has been designed to be amenable to threading. Each compilation
146 * unit has its own type stream, therefore the logical place to divide and
147 * conquer is at the compilation unit. Each ctf_cu_t has been built to be able
148 * to be processed independently of the others. It has its own libdwarf handle,
149 * as a given libdwarf handle may only be used by a single thread at a time.
150 * This allows the various ctf_cu_t's to be processed in parallel by different
151 * threads.
152 *
153 * All of the ctf_cu_t's are loaded into a workq which allows for a number of
154 * threads to be specified and used as a thread pool to process all of the
155 * queued work. We set the number of threads to use in the workq equal to the
156 * number of threads that the user has specified.
157 *
158 * After all of the compilation units have been drained, we use the same number
159 * of threads when performing a merge of multiple compilation units, if they
160 * exist.
161 *
162 * While all of these different parts do support and allow for multiple threads,
163 * it's important that when only a single thread is specified, that it be the
164 * calling thread. This allows the conversion routines to be used in a context
165 * that doesn't allow additional threads, such as rtld.
166 *
167 * Common DWARF Mechanics and Notes
168 * --------------------------------
169 *
170 * At this time, we really only support DWARFv2, though support for DWARFv4 is
171 * mostly there. There is no intent to support DWARFv3.
172 *
173 * Generally types for something are stored in the DW_AT_type attribute. For
174 * example, a function's return type will be stored in the local DW_AT_type
175 * attribute while the arguments will be in child DIEs. There are also various
176 * times when we don't have any DW_AT_type. In that case, the lack of a type
177 * implies, at least for C, that its C type is void. Because DWARF doesn't emit
178 * one, we have a synthetic void type that we create and manipulate instead and
179 * pass it off to consumers on an as-needed basis. If nothing has a void type,
180 * it will not be emitted.
181 *
182 * Architecture Specific Parts
183 * ---------------------------
184 *
185 * The CTF tooling encodes various information about the various architectures
186 * in the system. Importantly, the tool assumes that every architecture has a
187 * data model where long and pointer are the same size. This is currently the
188 * case, as the two data models illumos supports are ILP32 and LP64.
189 *
190 * In addition, we encode the mapping of various floating point sizes to various
191 * types for each architecture. If a new architecture is being added, it should
192 * be added to the list. The general design of the ctf conversion tools is to be
193 * architecture independent. eg. any of the tools here should be able to convert
194 * any architecture's DWARF into ctf; however, this has not been rigorously
195 * tested and more importantly, the ctf routines don't currently write out the
196 * data in an endian-aware form, they only use that of the currently running
197 * library.
198 */
199
200 #include <libctf_impl.h>
201 #include <sys/avl.h>
202 #include <sys/debug.h>
203 #include <gelf.h>
204 #include <libdwarf.h>
205 #include <dwarf.h>
206 #include <libgen.h>
207 #include <workq.h>
208 #include <errno.h>
209
210 #define DWARF_VERSION_TWO 2
211 #define DWARF_VARARGS_NAME "..."
212
213 /*
214 * Dwarf may refer recursively to other types that we've already processed. To
215 * see if we've already converted them, we look them up in an AVL tree that's
216 * sorted by the DWARF id.
217 */
218 typedef struct ctf_dwmap {
219 avl_node_t cdm_avl;
220 Dwarf_Off cdm_off;
221 Dwarf_Die cdm_die;
222 ctf_id_t cdm_id;
223 boolean_t cdm_fix;
224 } ctf_dwmap_t;
225
226 typedef struct ctf_dwvar {
227 ctf_list_t cdv_list;
228 char *cdv_name;
229 ctf_id_t cdv_type;
230 boolean_t cdv_global;
231 } ctf_dwvar_t;
232
233 typedef struct ctf_dwfunc {
234 ctf_list_t cdf_list;
235 char *cdf_name;
236 ctf_funcinfo_t cdf_fip;
237 ctf_id_t *cdf_argv;
238 boolean_t cdf_global;
239 } ctf_dwfunc_t;
240
241 typedef struct ctf_dwbitf {
242 ctf_list_t cdb_list;
243 ctf_id_t cdb_base;
244 uint_t cdb_nbits;
245 ctf_id_t cdb_id;
246 } ctf_dwbitf_t;
247
248 /*
249 * The ctf_cu_t represents a single top-level DWARF die unit. While generally,
250 * the typical object file has only a single die, if we're asked to convert
251 * something that's been linked from multiple sources, multiple dies will exist.
252 */
253 typedef struct ctf_die {
254 Elf *cu_elf; /* shared libelf handle */
255 char *cu_name; /* basename of the DIE */
256 ctf_merge_t *cu_cmh; /* merge handle */
257 ctf_list_t cu_vars; /* List of variables */
258 ctf_list_t cu_funcs; /* List of functions */
259 ctf_list_t cu_bitfields; /* Bit field members */
260 Dwarf_Debug cu_dwarf; /* libdwarf handle */
261 Dwarf_Die cu_cu; /* libdwarf compilation unit */
262 Dwarf_Off cu_cuoff; /* cu's offset */
263 Dwarf_Off cu_maxoff; /* maximum offset */
264 ctf_file_t *cu_ctfp; /* output CTF file */
265 avl_tree_t cu_map; /* map die offsets to CTF types */
266 char *cu_errbuf; /* error message buffer */
267 size_t cu_errlen; /* error message buffer length */
268 size_t cu_ptrsz; /* object's pointer size */
269 boolean_t cu_bigend; /* is it big endian */
270 boolean_t cu_doweaks; /* should we convert weak symbols? */
271 uint_t cu_mach; /* machine type */
272 ctf_id_t cu_voidtid; /* void pointer */
273 ctf_id_t cu_longtid; /* id for a 'long' */
274 } ctf_cu_t;
275
276 static int ctf_dwarf_offset(ctf_cu_t *, Dwarf_Die, Dwarf_Off *);
277 static int ctf_dwarf_convert_die(ctf_cu_t *, Dwarf_Die);
278 static int ctf_dwarf_convert_type(ctf_cu_t *, Dwarf_Die, ctf_id_t *, int);
279
280 static int ctf_dwarf_function_count(ctf_cu_t *, Dwarf_Die, ctf_funcinfo_t *,
281 boolean_t);
282 static int ctf_dwarf_convert_fargs(ctf_cu_t *, Dwarf_Die, ctf_funcinfo_t *,
283 ctf_id_t *);
284
285 typedef int (ctf_dwarf_symtab_f)(ctf_cu_t *, const GElf_Sym *, ulong_t,
286 const char *, const char *, void *);
287
288 /*
289 * This is a generic way to set a CTF Conversion backend error depending on what
290 * we were doing. Unless it was one of a specific set of errors that don't
291 * indicate a programming / translation bug, eg. ENOMEM, then we transform it
292 * into a CTF backend error and fill in the error buffer.
293 */
294 static int
ctf_dwarf_error(ctf_cu_t * cup,ctf_file_t * cfp,int err,const char * fmt,...)295 ctf_dwarf_error(ctf_cu_t *cup, ctf_file_t *cfp, int err, const char *fmt, ...)
296 {
297 va_list ap;
298 int ret;
299 size_t off = 0;
300 ssize_t rem = cup->cu_errlen;
301 if (cfp != NULL)
302 err = ctf_errno(cfp);
303
304 if (err == ENOMEM)
305 return (err);
306
307 ret = snprintf(cup->cu_errbuf, rem, "die %s: ", cup->cu_name);
308 if (ret < 0)
309 goto err;
310 off += ret;
311 rem = MAX(rem - ret, 0);
312
313 va_start(ap, fmt);
314 ret = vsnprintf(cup->cu_errbuf + off, rem, fmt, ap);
315 va_end(ap);
316 if (ret < 0)
317 goto err;
318
319 off += ret;
320 rem = MAX(rem - ret, 0);
321 if (fmt[strlen(fmt) - 1] != '\n') {
322 (void) snprintf(cup->cu_errbuf + off, rem,
323 ": %s\n", ctf_errmsg(err));
324 }
325 va_end(ap);
326 return (ECTF_CONVBKERR);
327
328 err:
329 cup->cu_errbuf[0] = '\0';
330 return (ECTF_CONVBKERR);
331 }
332
333 /*
334 * DWARF often opts to put no explicit type to describe a void type. eg. if we
335 * have a reference type whose DW_AT_type member doesn't exist, then we should
336 * instead assume it points to void. Because this isn't represented, we
337 * instead cause it to come into existence.
338 */
339 static ctf_id_t
ctf_dwarf_void(ctf_cu_t * cup)340 ctf_dwarf_void(ctf_cu_t *cup)
341 {
342 if (cup->cu_voidtid == CTF_ERR) {
343 ctf_encoding_t enc = { CTF_INT_SIGNED, 0, 0 };
344 cup->cu_voidtid = ctf_add_integer(cup->cu_ctfp, CTF_ADD_ROOT,
345 "void", &enc);
346 if (cup->cu_voidtid == CTF_ERR) {
347 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
348 "failed to create void type: %s\n",
349 ctf_errmsg(ctf_errno(cup->cu_ctfp)));
350 }
351 }
352
353 return (cup->cu_voidtid);
354 }
355
356 /*
357 * There are many different forms that an array index may take. However, we just
358 * always force it to be of a type long no matter what. Therefore we use this to
359 * have a single instance of long across everything.
360 */
361 static ctf_id_t
ctf_dwarf_long(ctf_cu_t * cup)362 ctf_dwarf_long(ctf_cu_t *cup)
363 {
364 if (cup->cu_longtid == CTF_ERR) {
365 ctf_encoding_t enc;
366
367 enc.cte_format = CTF_INT_SIGNED;
368 enc.cte_offset = 0;
369 /* All illumos systems are LP */
370 enc.cte_bits = cup->cu_ptrsz * 8;
371 cup->cu_longtid = ctf_add_integer(cup->cu_ctfp, CTF_ADD_NONROOT,
372 "long", &enc);
373 if (cup->cu_longtid == CTF_ERR) {
374 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
375 "failed to create long type: %s\n",
376 ctf_errmsg(ctf_errno(cup->cu_ctfp)));
377 }
378
379 }
380
381 return (cup->cu_longtid);
382 }
383
384 static int
ctf_dwmap_comp(const void * a,const void * b)385 ctf_dwmap_comp(const void *a, const void *b)
386 {
387 const ctf_dwmap_t *ca = a;
388 const ctf_dwmap_t *cb = b;
389
390 if (ca->cdm_off > cb->cdm_off)
391 return (1);
392 if (ca->cdm_off < cb->cdm_off)
393 return (-1);
394 return (0);
395 }
396
397 static int
ctf_dwmap_add(ctf_cu_t * cup,ctf_id_t id,Dwarf_Die die,boolean_t fix)398 ctf_dwmap_add(ctf_cu_t *cup, ctf_id_t id, Dwarf_Die die, boolean_t fix)
399 {
400 int ret;
401 avl_index_t index;
402 ctf_dwmap_t *dwmap;
403 Dwarf_Off off;
404
405 VERIFY(id > 0 && id < CTF_MAX_TYPE);
406
407 if ((ret = ctf_dwarf_offset(cup, die, &off)) != 0)
408 return (ret);
409
410 if ((dwmap = ctf_alloc(sizeof (ctf_dwmap_t))) == NULL)
411 return (ENOMEM);
412
413 dwmap->cdm_die = die;
414 dwmap->cdm_off = off;
415 dwmap->cdm_id = id;
416 dwmap->cdm_fix = fix;
417
418 ctf_dprintf("dwmap: %p %" DW_PR_DUx "->%d\n", dwmap, off, id);
419 VERIFY(avl_find(&cup->cu_map, dwmap, &index) == NULL);
420 avl_insert(&cup->cu_map, dwmap, index);
421 return (0);
422 }
423
424 static int
ctf_dwarf_attribute(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,Dwarf_Attribute * attrp)425 ctf_dwarf_attribute(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name,
426 Dwarf_Attribute *attrp)
427 {
428 int ret;
429 Dwarf_Error derr;
430
431 if ((ret = dwarf_attr(die, name, attrp, &derr)) == DW_DLV_OK)
432 return (0);
433 if (ret == DW_DLV_NO_ENTRY) {
434 *attrp = NULL;
435 return (ENOENT);
436 }
437 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
438 "failed to get attribute for type: %s\n",
439 dwarf_errmsg(derr));
440 return (ECTF_CONVBKERR);
441 }
442
443 static int
ctf_dwarf_ref(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,Dwarf_Off * refp)444 ctf_dwarf_ref(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, Dwarf_Off *refp)
445 {
446 int ret;
447 Dwarf_Attribute attr;
448 Dwarf_Error derr;
449
450 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0)
451 return (ret);
452
453 if (dwarf_formref(attr, refp, &derr) == DW_DLV_OK) {
454 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
455 return (0);
456 }
457
458 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
459 "failed to get unsigned attribute for type: %s\n",
460 dwarf_errmsg(derr));
461 return (ECTF_CONVBKERR);
462 }
463
464 static int
ctf_dwarf_refdie(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,Dwarf_Die * diep)465 ctf_dwarf_refdie(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name,
466 Dwarf_Die *diep)
467 {
468 int ret;
469 Dwarf_Off off;
470 Dwarf_Error derr;
471
472 if ((ret = ctf_dwarf_ref(cup, die, name, &off)) != 0)
473 return (ret);
474
475 off += cup->cu_cuoff;
476 if ((ret = dwarf_offdie(cup->cu_dwarf, off, diep, &derr)) !=
477 DW_DLV_OK) {
478 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
479 "failed to get die from offset %" DW_PR_DUu ": %s\n",
480 off, dwarf_errmsg(derr));
481 return (ECTF_CONVBKERR);
482 }
483
484 return (0);
485 }
486
487 static int
ctf_dwarf_signed(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,Dwarf_Signed * valp)488 ctf_dwarf_signed(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name,
489 Dwarf_Signed *valp)
490 {
491 int ret;
492 Dwarf_Attribute attr;
493 Dwarf_Error derr;
494
495 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0)
496 return (ret);
497
498 if (dwarf_formsdata(attr, valp, &derr) == DW_DLV_OK) {
499 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
500 return (0);
501 }
502
503 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
504 "failed to get unsigned attribute for type: %s\n",
505 dwarf_errmsg(derr));
506 return (ECTF_CONVBKERR);
507 }
508
509 static int
ctf_dwarf_unsigned(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,Dwarf_Unsigned * valp)510 ctf_dwarf_unsigned(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name,
511 Dwarf_Unsigned *valp)
512 {
513 int ret;
514 Dwarf_Attribute attr;
515 Dwarf_Error derr;
516
517 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0)
518 return (ret);
519
520 if (dwarf_formudata(attr, valp, &derr) == DW_DLV_OK) {
521 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
522 return (0);
523 }
524
525 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
526 "failed to get unsigned attribute for type: %s\n",
527 dwarf_errmsg(derr));
528 return (ECTF_CONVBKERR);
529 }
530
531 static int
ctf_dwarf_boolean(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,Dwarf_Bool * val)532 ctf_dwarf_boolean(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name,
533 Dwarf_Bool *val)
534 {
535 int ret;
536 Dwarf_Attribute attr;
537 Dwarf_Error derr;
538
539 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0)
540 return (ret);
541
542 if (dwarf_formflag(attr, val, &derr) == DW_DLV_OK) {
543 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
544 return (0);
545 }
546
547 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
548 "failed to get boolean attribute for type: %s\n",
549 dwarf_errmsg(derr));
550
551 return (ECTF_CONVBKERR);
552 }
553
554 static int
ctf_dwarf_string(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half name,char ** strp)555 ctf_dwarf_string(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half name, char **strp)
556 {
557 int ret;
558 char *s;
559 Dwarf_Attribute attr;
560 Dwarf_Error derr;
561
562 *strp = NULL;
563 if ((ret = ctf_dwarf_attribute(cup, die, name, &attr)) != 0)
564 return (ret);
565
566 if (dwarf_formstring(attr, &s, &derr) == DW_DLV_OK) {
567 if ((*strp = ctf_strdup(s)) == NULL)
568 ret = ENOMEM;
569 else
570 ret = 0;
571 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
572 return (ret);
573 }
574
575 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
576 "failed to get string attribute for type: %s\n",
577 dwarf_errmsg(derr));
578 return (ECTF_CONVBKERR);
579 }
580
581 static int
ctf_dwarf_member_location(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Unsigned * valp)582 ctf_dwarf_member_location(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Unsigned *valp)
583 {
584 int ret;
585 Dwarf_Error derr;
586 Dwarf_Attribute attr;
587 Dwarf_Locdesc *loc;
588 Dwarf_Signed locnum;
589
590 if ((ret = ctf_dwarf_attribute(cup, die, DW_AT_data_member_location,
591 &attr)) != 0)
592 return (ret);
593
594 if (dwarf_loclist(attr, &loc, &locnum, &derr) != DW_DLV_OK) {
595 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
596 "failed to obtain location list for member offset: %s",
597 dwarf_errmsg(derr));
598 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
599 return (ECTF_CONVBKERR);
600 }
601 dwarf_dealloc(cup->cu_dwarf, attr, DW_DLA_ATTR);
602
603 if (locnum != 1 || loc->ld_s->lr_atom != DW_OP_plus_uconst) {
604 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
605 "failed to parse location structure for member");
606 dwarf_dealloc(cup->cu_dwarf, loc->ld_s, DW_DLA_LOC_BLOCK);
607 dwarf_dealloc(cup->cu_dwarf, loc, DW_DLA_LOCDESC);
608 return (ECTF_CONVBKERR);
609 }
610
611 *valp = loc->ld_s->lr_number;
612
613 dwarf_dealloc(cup->cu_dwarf, loc->ld_s, DW_DLA_LOC_BLOCK);
614 dwarf_dealloc(cup->cu_dwarf, loc, DW_DLA_LOCDESC);
615 return (0);
616 }
617
618
619 static int
ctf_dwarf_offset(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Off * offsetp)620 ctf_dwarf_offset(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Off *offsetp)
621 {
622 Dwarf_Error derr;
623
624 if (dwarf_dieoffset(die, offsetp, &derr) == DW_DLV_OK)
625 return (0);
626
627 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
628 "failed to get die offset: %s\n",
629 dwarf_errmsg(derr));
630 return (ECTF_CONVBKERR);
631 }
632
633 /* simpler variant for debugging output */
634 static Dwarf_Off
ctf_die_offset(Dwarf_Die die)635 ctf_die_offset(Dwarf_Die die)
636 {
637 Dwarf_Off off = -1;
638 Dwarf_Error derr;
639
640 (void) dwarf_dieoffset(die, &off, &derr);
641 return (off);
642 }
643
644 static int
ctf_dwarf_tag(ctf_cu_t * cup,Dwarf_Die die,Dwarf_Half * tagp)645 ctf_dwarf_tag(ctf_cu_t *cup, Dwarf_Die die, Dwarf_Half *tagp)
646 {
647 Dwarf_Error derr;
648
649 if (dwarf_tag(die, tagp, &derr) == DW_DLV_OK)
650 return (0);
651
652 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
653 "failed to get tag type: %s\n",
654 dwarf_errmsg(derr));
655 return (ECTF_CONVBKERR);
656 }
657
658 static int
ctf_dwarf_sib(ctf_cu_t * cup,Dwarf_Die base,Dwarf_Die * sibp)659 ctf_dwarf_sib(ctf_cu_t *cup, Dwarf_Die base, Dwarf_Die *sibp)
660 {
661 Dwarf_Error derr;
662 int ret;
663
664 *sibp = NULL;
665 ret = dwarf_siblingof(cup->cu_dwarf, base, sibp, &derr);
666 if (ret == DW_DLV_OK || ret == DW_DLV_NO_ENTRY)
667 return (0);
668
669 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
670 "failed to sibling from die: %s\n",
671 dwarf_errmsg(derr));
672 return (ECTF_CONVBKERR);
673 }
674
675 static int
ctf_dwarf_child(ctf_cu_t * cup,Dwarf_Die base,Dwarf_Die * childp)676 ctf_dwarf_child(ctf_cu_t *cup, Dwarf_Die base, Dwarf_Die *childp)
677 {
678 Dwarf_Error derr;
679 int ret;
680
681 *childp = NULL;
682 ret = dwarf_child(base, childp, &derr);
683 if (ret == DW_DLV_OK || ret == DW_DLV_NO_ENTRY)
684 return (0);
685
686 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
687 "failed to child from die: %s\n",
688 dwarf_errmsg(derr));
689 return (ECTF_CONVBKERR);
690 }
691
692 /*
693 * Compilers disagree on what to do to determine if something has global
694 * visiblity. Traditionally gcc has used DW_AT_external to indicate this while
695 * Studio has used DW_AT_visibility. We check DW_AT_visibility first and then
696 * fall back to DW_AT_external. Lack of DW_AT_external implies that it is not.
697 */
698 static int
ctf_dwarf_isglobal(ctf_cu_t * cup,Dwarf_Die die,boolean_t * igp)699 ctf_dwarf_isglobal(ctf_cu_t *cup, Dwarf_Die die, boolean_t *igp)
700 {
701 int ret;
702 Dwarf_Signed vis;
703 Dwarf_Bool ext;
704
705 if ((ret = ctf_dwarf_signed(cup, die, DW_AT_visibility, &vis)) == 0) {
706 *igp = vis == DW_VIS_exported;
707 return (0);
708 } else if (ret != ENOENT) {
709 return (ret);
710 }
711
712 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_external, &ext)) != 0) {
713 if (ret == ENOENT) {
714 *igp = B_FALSE;
715 return (0);
716 }
717 return (ret);
718 }
719 *igp = ext != 0 ? B_TRUE : B_FALSE;
720 return (0);
721 }
722
723 static int
ctf_dwarf_die_elfenc(Elf * elf,ctf_cu_t * cup,char * errbuf,size_t errlen)724 ctf_dwarf_die_elfenc(Elf *elf, ctf_cu_t *cup, char *errbuf, size_t errlen)
725 {
726 GElf_Ehdr ehdr;
727
728 if (gelf_getehdr(elf, &ehdr) == NULL) {
729 (void) snprintf(errbuf, errlen,
730 "failed to get ELF header: %s\n",
731 elf_errmsg(elf_errno()));
732 return (ECTF_CONVBKERR);
733 }
734
735 cup->cu_mach = ehdr.e_machine;
736
737 if (ehdr.e_ident[EI_CLASS] == ELFCLASS32) {
738 cup->cu_ptrsz = 4;
739 VERIFY(ctf_setmodel(cup->cu_ctfp, CTF_MODEL_ILP32) == 0);
740 } else if (ehdr.e_ident[EI_CLASS] == ELFCLASS64) {
741 cup->cu_ptrsz = 8;
742 VERIFY(ctf_setmodel(cup->cu_ctfp, CTF_MODEL_LP64) == 0);
743 } else {
744 (void) snprintf(errbuf, errlen,
745 "unknown ELF class %d", ehdr.e_ident[EI_CLASS]);
746 return (ECTF_CONVBKERR);
747 }
748
749 if (ehdr.e_ident[EI_DATA] == ELFDATA2LSB) {
750 cup->cu_bigend = B_FALSE;
751 } else if (ehdr.e_ident[EI_DATA] == ELFDATA2MSB) {
752 cup->cu_bigend = B_TRUE;
753 } else {
754 (void) snprintf(errbuf, errlen,
755 "unknown ELF data encoding: %hhu", ehdr.e_ident[EI_DATA]);
756 return (ECTF_CONVBKERR);
757 }
758
759 return (0);
760 }
761
762 typedef struct ctf_dwarf_fpent {
763 size_t cdfe_size;
764 uint_t cdfe_enc[3];
765 } ctf_dwarf_fpent_t;
766
767 typedef struct ctf_dwarf_fpmap {
768 uint_t cdf_mach;
769 ctf_dwarf_fpent_t cdf_ents[4];
770 } ctf_dwarf_fpmap_t;
771
772 static const ctf_dwarf_fpmap_t ctf_dwarf_fpmaps[] = {
773 { EM_SPARC, {
774 { 4, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } },
775 { 8, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } },
776 { 16, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } },
777 { 0, { 0 } }
778 } },
779 { EM_SPARC32PLUS, {
780 { 4, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } },
781 { 8, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } },
782 { 16, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } },
783 { 0, { 0 } }
784 } },
785 { EM_SPARCV9, {
786 { 4, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } },
787 { 8, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } },
788 { 16, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } },
789 { 0, { 0 } }
790 } },
791 { EM_386, {
792 { 4, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } },
793 { 8, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } },
794 { 12, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } },
795 { 0, { 0 } }
796 } },
797 { EM_X86_64, {
798 { 4, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } },
799 { 8, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } },
800 { 16, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } },
801 { 0, { 0 } }
802 } },
803 { EM_NONE }
804 };
805
806 static int
ctf_dwarf_float_base(ctf_cu_t * cup,Dwarf_Signed type,ctf_encoding_t * enc)807 ctf_dwarf_float_base(ctf_cu_t *cup, Dwarf_Signed type, ctf_encoding_t *enc)
808 {
809 const ctf_dwarf_fpmap_t *map = &ctf_dwarf_fpmaps[0];
810 const ctf_dwarf_fpent_t *ent;
811 uint_t col = 0, mult = 1;
812
813 for (map = &ctf_dwarf_fpmaps[0]; map->cdf_mach != EM_NONE; map++) {
814 if (map->cdf_mach == cup->cu_mach)
815 break;
816 }
817
818 if (map->cdf_mach == EM_NONE) {
819 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
820 "Unsupported machine type: %d\n", cup->cu_mach);
821 return (ENOTSUP);
822 }
823
824 if (type == DW_ATE_complex_float) {
825 mult = 2;
826 col = 1;
827 } else if (type == DW_ATE_imaginary_float ||
828 type == DW_ATE_SUN_imaginary_float) {
829 col = 2;
830 }
831
832 ent = &map->cdf_ents[0];
833 for (ent = &map->cdf_ents[0]; ent->cdfe_size != 0; ent++) {
834 if (ent->cdfe_size * mult * 8 == enc->cte_bits) {
835 enc->cte_format = ent->cdfe_enc[col];
836 return (0);
837 }
838 }
839
840 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
841 "failed to find valid fp mapping for encoding %d, size %d bits\n",
842 type, enc->cte_bits);
843 return (EINVAL);
844 }
845
846 static int
ctf_dwarf_dwarf_base(ctf_cu_t * cup,Dwarf_Die die,int * kindp,ctf_encoding_t * enc)847 ctf_dwarf_dwarf_base(ctf_cu_t *cup, Dwarf_Die die, int *kindp,
848 ctf_encoding_t *enc)
849 {
850 int ret;
851 Dwarf_Signed type;
852
853 if ((ret = ctf_dwarf_signed(cup, die, DW_AT_encoding, &type)) != 0)
854 return (ret);
855
856 switch (type) {
857 case DW_ATE_unsigned:
858 case DW_ATE_address:
859 *kindp = CTF_K_INTEGER;
860 enc->cte_format = 0;
861 break;
862 case DW_ATE_unsigned_char:
863 *kindp = CTF_K_INTEGER;
864 enc->cte_format = CTF_INT_CHAR;
865 break;
866 case DW_ATE_signed:
867 *kindp = CTF_K_INTEGER;
868 enc->cte_format = CTF_INT_SIGNED;
869 break;
870 case DW_ATE_signed_char:
871 *kindp = CTF_K_INTEGER;
872 enc->cte_format = CTF_INT_SIGNED | CTF_INT_CHAR;
873 break;
874 case DW_ATE_boolean:
875 *kindp = CTF_K_INTEGER;
876 enc->cte_format = CTF_INT_SIGNED | CTF_INT_BOOL;
877 break;
878 case DW_ATE_float:
879 case DW_ATE_complex_float:
880 case DW_ATE_imaginary_float:
881 case DW_ATE_SUN_imaginary_float:
882 case DW_ATE_SUN_interval_float:
883 *kindp = CTF_K_FLOAT;
884 if ((ret = ctf_dwarf_float_base(cup, type, enc)) != 0)
885 return (ret);
886 break;
887 default:
888 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
889 "encountered unkown DWARF encoding: %d", type);
890 return (ECTF_CONVBKERR);
891 }
892
893 return (0);
894 }
895
896 /*
897 * Different compilers (at least GCC and Studio) use different names for types.
898 * This parses the types and attempts to unify them. If this fails, we just fall
899 * back to using the DWARF itself.
900 */
901 static int
ctf_dwarf_parse_base(const char * name,int * kindp,ctf_encoding_t * enc,char ** newnamep)902 ctf_dwarf_parse_base(const char *name, int *kindp, ctf_encoding_t *enc,
903 char **newnamep)
904 {
905 char buf[256];
906 char *base, *c, *last;
907 int nlong = 0, nshort = 0, nchar = 0, nint = 0;
908 int sign = 1;
909
910 if (strlen(name) + 1 > sizeof (buf))
911 return (EINVAL);
912
913 (void) strlcpy(buf, name, sizeof (buf));
914 for (c = strtok_r(buf, " ", &last); c != NULL;
915 c = strtok_r(NULL, " ", &last)) {
916 if (strcmp(c, "signed") == 0) {
917 sign = 1;
918 } else if (strcmp(c, "unsigned") == 0) {
919 sign = 0;
920 } else if (strcmp(c, "long") == 0) {
921 nlong++;
922 } else if (strcmp(c, "char") == 0) {
923 nchar++;
924 } else if (strcmp(c, "short") == 0) {
925 nshort++;
926 } else if (strcmp(c, "int") == 0) {
927 nint++;
928 } else {
929 /*
930 * If we don't recognize any of the tokens, we'll tell
931 * the caller to fall back to the dwarf-provided
932 * encoding information.
933 */
934 return (EINVAL);
935 }
936 }
937
938 if (nchar > 1 || nshort > 1 || nint > 1 || nlong > 2)
939 return (EINVAL);
940
941 if (nchar > 0) {
942 if (nlong > 0 || nshort > 0 || nint > 0)
943 return (EINVAL);
944 base = "char";
945 } else if (nshort > 0) {
946 if (nlong > 0)
947 return (EINVAL);
948 base = "short";
949 } else if (nlong > 0) {
950 base = "long";
951 } else {
952 base = "int";
953 }
954
955 if (nchar > 0)
956 enc->cte_format = CTF_INT_CHAR;
957 else
958 enc->cte_format = 0;
959
960 if (sign > 0)
961 enc->cte_format |= CTF_INT_SIGNED;
962
963 (void) snprintf(buf, sizeof (buf), "%s%s%s",
964 (sign ? "" : "unsigned "),
965 (nlong > 1 ? "long " : ""),
966 base);
967
968 *newnamep = ctf_strdup(buf);
969 if (*newnamep == NULL)
970 return (ENOMEM);
971 *kindp = CTF_K_INTEGER;
972 return (0);
973 }
974
975 static int
ctf_dwarf_create_base(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int isroot,Dwarf_Off off)976 ctf_dwarf_create_base(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot,
977 Dwarf_Off off)
978 {
979 int ret;
980 char *name, *nname;
981 Dwarf_Unsigned sz;
982 int kind;
983 ctf_encoding_t enc;
984 ctf_id_t id;
985
986 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0)
987 return (ret);
988 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, &sz)) != 0) {
989 goto out;
990 }
991 ctf_dprintf("Creating base type %s from off %llu, size: %d\n", name,
992 off, sz);
993
994 bzero(&enc, sizeof (ctf_encoding_t));
995 enc.cte_bits = sz * 8;
996 if ((ret = ctf_dwarf_parse_base(name, &kind, &enc, &nname)) == 0) {
997 ctf_free(name, strlen(name) + 1);
998 name = nname;
999 } else {
1000 if (ret != EINVAL)
1001 return (ret);
1002 ctf_dprintf("falling back to dwarf for base type %s\n", name);
1003 if ((ret = ctf_dwarf_dwarf_base(cup, die, &kind, &enc)) != 0)
1004 return (ret);
1005 }
1006
1007 id = ctf_add_encoded(cup->cu_ctfp, isroot, name, &enc, kind);
1008 if (id == CTF_ERR) {
1009 ret = ctf_errno(cup->cu_ctfp);
1010 } else {
1011 *idp = id;
1012 ret = ctf_dwmap_add(cup, id, die, B_FALSE);
1013 }
1014 out:
1015 ctf_free(name, strlen(name) + 1);
1016 return (ret);
1017 }
1018
1019 /*
1020 * Getting a member's offset is a surprisingly intricate dance. It works as
1021 * follows:
1022 *
1023 * 1) If we're in DWARFv4, then we either have a DW_AT_data_bit_offset or we
1024 * have a DW_AT_data_member_location. We won't have both. Thus we check first
1025 * for DW_AT_data_bit_offset, and if it exists, we're set.
1026 *
1027 * Next, if we have a bitfield and we don't have a DW_AT_data_bit_offset, then
1028 * we have to grab the data location and use the following dance:
1029 *
1030 * 2) Gather the set of DW_AT_byte_size, DW_AT_bit_offset, and DW_AT_bit_size.
1031 * Of course, the DW_AT_byte_size may be omitted, even though it isn't always.
1032 * When it's been omitted, we then have to say that the size is that of the
1033 * underlying type, which forces that to be after a ctf_update(). Here, we have
1034 * to do different things based on whether or not we're using big endian or
1035 * little endian to obtain the proper offset.
1036 */
1037 static int
ctf_dwarf_member_offset(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t mid,ulong_t * offp)1038 ctf_dwarf_member_offset(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t mid,
1039 ulong_t *offp)
1040 {
1041 int ret;
1042 Dwarf_Unsigned loc, bitsz, bytesz;
1043 Dwarf_Signed bitoff;
1044 size_t off;
1045 ssize_t tsz;
1046
1047 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_data_bit_offset,
1048 &loc)) == 0) {
1049 *offp = loc;
1050 return (0);
1051 } else if (ret != ENOENT) {
1052 return (ret);
1053 }
1054
1055 if ((ret = ctf_dwarf_member_location(cup, die, &loc)) != 0)
1056 return (ret);
1057 off = loc * 8;
1058
1059 if ((ret = ctf_dwarf_signed(cup, die, DW_AT_bit_offset,
1060 &bitoff)) != 0) {
1061 if (ret != ENOENT)
1062 return (ret);
1063 *offp = off;
1064 return (0);
1065 }
1066
1067 /* At this point we have to have DW_AT_bit_size */
1068 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_bit_size, &bitsz)) != 0)
1069 return (ret);
1070
1071 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size,
1072 &bytesz)) != 0) {
1073 if (ret != ENOENT)
1074 return (ret);
1075 if ((tsz = ctf_type_size(cup->cu_ctfp, mid)) == CTF_ERR) {
1076 int e = ctf_errno(cup->cu_ctfp);
1077 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1078 "failed to get type size: %s", ctf_errmsg(e));
1079 return (ECTF_CONVBKERR);
1080 }
1081 } else {
1082 tsz = bytesz;
1083 }
1084 tsz *= 8;
1085 if (cup->cu_bigend == B_TRUE) {
1086 *offp = off + bitoff;
1087 } else {
1088 *offp = off + tsz - bitoff - bitsz;
1089 }
1090
1091 return (0);
1092 }
1093
1094 /*
1095 * We need to determine if the member in question is a bitfield. If it is, then
1096 * we need to go through and create a new type that's based on the actual base
1097 * type, but has a different size. We also rename the type as a result to help
1098 * deal with future collisions.
1099 *
1100 * Here we need to look and see if we have a DW_AT_bit_size value. If we have a
1101 * bit size member and it does not equal the byte size member, then we need to
1102 * create a bitfield type based on this.
1103 *
1104 * Note: When we support DWARFv4, there may be a chance that we need to also
1105 * search for the DW_AT_byte_size if we don't have a DW_AT_bit_size member.
1106 */
1107 static int
ctf_dwarf_member_bitfield(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp)1108 ctf_dwarf_member_bitfield(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp)
1109 {
1110 int ret;
1111 Dwarf_Unsigned bitsz;
1112 ctf_encoding_t e;
1113 ctf_dwbitf_t *cdb;
1114 ctf_dtdef_t *dtd;
1115 ctf_id_t base = *idp;
1116 int kind;
1117
1118 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_bit_size, &bitsz)) != 0) {
1119 if (ret == ENOENT)
1120 return (0);
1121 return (ret);
1122 }
1123
1124 ctf_dprintf("Trying to deal with bitfields on %d:%d\n", base, bitsz);
1125 /*
1126 * Given that we now have a bitsize, time to go do something about it.
1127 * We're going to create a new type based on the current one, but first
1128 * we need to find the base type. This means we need to traverse any
1129 * typedef's, consts, and volatiles until we get to what should be
1130 * something of type integer or enumeration.
1131 */
1132 VERIFY(bitsz < UINT32_MAX);
1133 dtd = ctf_dtd_lookup(cup->cu_ctfp, base);
1134 VERIFY(dtd != NULL);
1135 kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info);
1136 while (kind == CTF_K_TYPEDEF || kind == CTF_K_CONST ||
1137 kind == CTF_K_VOLATILE) {
1138 dtd = ctf_dtd_lookup(cup->cu_ctfp, dtd->dtd_data.ctt_type);
1139 VERIFY(dtd != NULL);
1140 kind = CTF_INFO_KIND(dtd->dtd_data.ctt_info);
1141 }
1142 ctf_dprintf("got kind %d\n", kind);
1143 VERIFY(kind == CTF_K_INTEGER || kind == CTF_K_ENUM);
1144
1145 /*
1146 * As surprising as it may be, it is strictly possible to create a
1147 * bitfield that is based on an enum. Of course, the C standard leaves
1148 * enums sizing as an ABI concern more or less. To that effect, today on
1149 * all illumos platforms the size of an enum is generally that of an
1150 * int as our supported data models and ABIs all agree on that. So what
1151 * we'll do is fake up a CTF encoding here to use. In this case, we'll
1152 * treat it as an unsigned value of whatever size the underlying enum
1153 * currently has (which is in the ctt_size member of its dynamic type
1154 * data).
1155 */
1156 if (kind == CTF_K_INTEGER) {
1157 e = dtd->dtd_u.dtu_enc;
1158 } else {
1159 bzero(&e, sizeof (ctf_encoding_t));
1160 e.cte_bits = dtd->dtd_data.ctt_size * NBBY;
1161 }
1162
1163 for (cdb = ctf_list_next(&cup->cu_bitfields); cdb != NULL;
1164 cdb = ctf_list_next(cdb)) {
1165 if (cdb->cdb_base == base && cdb->cdb_nbits == bitsz)
1166 break;
1167 }
1168
1169 /*
1170 * Create a new type if none exists. We name all types in a way that is
1171 * guaranteed not to conflict with the corresponding C type. We do this
1172 * by using the ':' operator.
1173 */
1174 if (cdb == NULL) {
1175 size_t namesz;
1176 char *name;
1177
1178 e.cte_bits = bitsz;
1179 namesz = snprintf(NULL, 0, "%s:%d", dtd->dtd_name,
1180 (uint32_t)bitsz);
1181 name = ctf_alloc(namesz + 1);
1182 if (name == NULL)
1183 return (ENOMEM);
1184 cdb = ctf_alloc(sizeof (ctf_dwbitf_t));
1185 if (cdb == NULL) {
1186 ctf_free(name, namesz + 1);
1187 return (ENOMEM);
1188 }
1189 (void) snprintf(name, namesz + 1, "%s:%d", dtd->dtd_name,
1190 (uint32_t)bitsz);
1191
1192 cdb->cdb_base = base;
1193 cdb->cdb_nbits = bitsz;
1194 cdb->cdb_id = ctf_add_integer(cup->cu_ctfp, CTF_ADD_NONROOT,
1195 name, &e);
1196 if (cdb->cdb_id == CTF_ERR) {
1197 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1198 "failed to get add bitfield type %s: %s", name,
1199 ctf_errmsg(ctf_errno(cup->cu_ctfp)));
1200 ctf_free(name, namesz + 1);
1201 ctf_free(cdb, sizeof (ctf_dwbitf_t));
1202 return (ECTF_CONVBKERR);
1203 }
1204 ctf_free(name, namesz + 1);
1205 ctf_list_append(&cup->cu_bitfields, cdb);
1206 }
1207
1208 *idp = cdb->cdb_id;
1209
1210 return (0);
1211 }
1212
1213 static int
ctf_dwarf_fixup_sou(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t base,boolean_t add)1214 ctf_dwarf_fixup_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t base, boolean_t add)
1215 {
1216 int ret, kind;
1217 Dwarf_Die child, memb;
1218 Dwarf_Unsigned size;
1219 ulong_t nsz;
1220
1221 kind = ctf_type_kind(cup->cu_ctfp, base);
1222 VERIFY(kind != CTF_ERR);
1223 VERIFY(kind == CTF_K_STRUCT || kind == CTF_K_UNION);
1224
1225 /*
1226 * Members are in children. However, gcc also allows empty ones.
1227 */
1228 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0)
1229 return (ret);
1230 if (child == NULL)
1231 return (0);
1232
1233 memb = child;
1234 while (memb != NULL) {
1235 Dwarf_Die sib, tdie;
1236 Dwarf_Half tag;
1237 ctf_id_t mid;
1238 char *mname;
1239 ulong_t memboff = 0;
1240
1241 if ((ret = ctf_dwarf_tag(cup, memb, &tag)) != 0)
1242 return (ret);
1243
1244 if (tag != DW_TAG_member)
1245 continue;
1246
1247 if ((ret = ctf_dwarf_refdie(cup, memb, DW_AT_type, &tdie)) != 0)
1248 return (ret);
1249
1250 if ((ret = ctf_dwarf_convert_type(cup, tdie, &mid,
1251 CTF_ADD_NONROOT)) != 0)
1252 return (ret);
1253 ctf_dprintf("Got back type id: %d\n", mid);
1254
1255 /*
1256 * If we're not adding a member, just go ahead and return.
1257 */
1258 if (add == B_FALSE) {
1259 if ((ret = ctf_dwarf_member_bitfield(cup, memb,
1260 &mid)) != 0)
1261 return (ret);
1262 goto next;
1263 }
1264
1265 if ((ret = ctf_dwarf_string(cup, memb, DW_AT_name,
1266 &mname)) != 0 && ret != ENOENT)
1267 return (ret);
1268 if (ret == ENOENT)
1269 mname = NULL;
1270
1271 if (kind == CTF_K_UNION) {
1272 memboff = 0;
1273 } else if ((ret = ctf_dwarf_member_offset(cup, memb, mid,
1274 &memboff)) != 0) {
1275 if (mname != NULL)
1276 ctf_free(mname, strlen(mname) + 1);
1277 return (ret);
1278 }
1279
1280 if ((ret = ctf_dwarf_member_bitfield(cup, memb, &mid)) != 0)
1281 return (ret);
1282
1283 ret = ctf_add_member(cup->cu_ctfp, base, mname, mid, memboff);
1284 if (ret == CTF_ERR) {
1285 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1286 "failed to add member %s: %s",
1287 mname, ctf_errmsg(ctf_errno(cup->cu_ctfp)));
1288 if (mname != NULL)
1289 ctf_free(mname, strlen(mname) + 1);
1290 return (ECTF_CONVBKERR);
1291 }
1292
1293 if (mname != NULL)
1294 ctf_free(mname, strlen(mname) + 1);
1295
1296 next:
1297 if ((ret = ctf_dwarf_sib(cup, memb, &sib)) != 0)
1298 return (ret);
1299 memb = sib;
1300 }
1301
1302 /*
1303 * If we're not adding members, then we don't know the final size of the
1304 * structure, so end here.
1305 */
1306 if (add == B_FALSE)
1307 return (0);
1308
1309 /* Finally set the size of the structure to the actual byte size */
1310 if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, &size)) != 0)
1311 return (ret);
1312 nsz = size;
1313 if ((ctf_set_size(cup->cu_ctfp, base, nsz)) == CTF_ERR) {
1314 int e = ctf_errno(cup->cu_ctfp);
1315 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1316 "failed to set type size for %d to 0x%x: %s", base,
1317 (uint32_t)size, ctf_errmsg(e));
1318 return (ECTF_CONVBKERR);
1319 }
1320
1321 return (0);
1322 }
1323
1324 static int
ctf_dwarf_create_sou(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int kind,int isroot)1325 ctf_dwarf_create_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp,
1326 int kind, int isroot)
1327 {
1328 int ret;
1329 char *name;
1330 ctf_id_t base;
1331 Dwarf_Die child;
1332 Dwarf_Bool decl;
1333
1334 /*
1335 * Deal with the terribly annoying case of anonymous structs and unions.
1336 * If they don't have a name, set the name to the empty string.
1337 */
1338 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 &&
1339 ret != ENOENT)
1340 return (ret);
1341 if (ret == ENOENT)
1342 name = NULL;
1343
1344 /*
1345 * We need to check if we just have a declaration here. If we do, then
1346 * instead of creating an actual structure or union, we're just going to
1347 * go ahead and create a forward. During a dedup or merge, the forward
1348 * will be replaced with the real thing.
1349 */
1350 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration,
1351 &decl)) != 0) {
1352 if (ret != ENOENT)
1353 return (ret);
1354 decl = 0;
1355 }
1356
1357 if (decl != 0) {
1358 base = ctf_add_forward(cup->cu_ctfp, isroot, name, kind);
1359 } else if (kind == CTF_K_STRUCT) {
1360 base = ctf_add_struct(cup->cu_ctfp, isroot, name);
1361 } else {
1362 base = ctf_add_union(cup->cu_ctfp, isroot, name);
1363 }
1364 ctf_dprintf("added sou %s (%d) (%d)\n", name, kind, base);
1365 if (name != NULL)
1366 ctf_free(name, strlen(name) + 1);
1367 if (base == CTF_ERR)
1368 return (ctf_errno(cup->cu_ctfp));
1369 *idp = base;
1370
1371 /*
1372 * If it's just a declaration, we're not going to mark it for fix up or
1373 * do anything else.
1374 */
1375 if (decl == B_TRUE)
1376 return (ctf_dwmap_add(cup, base, die, B_FALSE));
1377 if ((ret = ctf_dwmap_add(cup, base, die, B_TRUE)) != 0)
1378 return (ret);
1379
1380 /*
1381 * Members are in children. However, gcc also allows empty ones.
1382 */
1383 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0)
1384 return (ret);
1385 if (child == NULL)
1386 return (0);
1387
1388 return (0);
1389 }
1390
1391 static int
ctf_dwarf_create_array_range(ctf_cu_t * cup,Dwarf_Die range,ctf_id_t * idp,ctf_id_t base,int isroot)1392 ctf_dwarf_create_array_range(ctf_cu_t *cup, Dwarf_Die range, ctf_id_t *idp,
1393 ctf_id_t base, int isroot)
1394 {
1395 int ret;
1396 Dwarf_Die sib;
1397 Dwarf_Unsigned val;
1398 Dwarf_Signed sval;
1399 ctf_arinfo_t ar;
1400
1401 ctf_dprintf("creating array range\n");
1402
1403 if ((ret = ctf_dwarf_sib(cup, range, &sib)) != 0)
1404 return (ret);
1405 if (sib != NULL) {
1406 ctf_id_t id;
1407 if ((ret = ctf_dwarf_create_array_range(cup, sib, &id,
1408 base, CTF_ADD_NONROOT)) != 0)
1409 return (ret);
1410 ar.ctr_contents = id;
1411 } else {
1412 ar.ctr_contents = base;
1413 }
1414
1415 if ((ar.ctr_index = ctf_dwarf_long(cup)) == CTF_ERR)
1416 return (ctf_errno(cup->cu_ctfp));
1417
1418 /*
1419 * Array bounds can be signed or unsigned, but there are several kinds
1420 * of signless forms (data1, data2, etc) that take their sign from the
1421 * routine that is trying to interpret them. That is, data1 can be
1422 * either signed or unsigned, depending on whether you use the signed or
1423 * unsigned accessor function. GCC will use the signless forms to store
1424 * unsigned values which have their high bit set, so we need to try to
1425 * read them first as unsigned to get positive values. We could also
1426 * try signed first, falling back to unsigned if we got a negative
1427 * value.
1428 */
1429 if ((ret = ctf_dwarf_unsigned(cup, range, DW_AT_upper_bound,
1430 &val)) == 0) {
1431 ar.ctr_nelems = val + 1;
1432 } else if (ret != ENOENT) {
1433 return (ret);
1434 } else if ((ret = ctf_dwarf_signed(cup, range, DW_AT_upper_bound,
1435 &sval)) == 0) {
1436 ar.ctr_nelems = sval + 1;
1437 } else if (ret != ENOENT) {
1438 return (ret);
1439 } else {
1440 ar.ctr_nelems = 0;
1441 }
1442
1443 if ((*idp = ctf_add_array(cup->cu_ctfp, isroot, &ar)) == CTF_ERR)
1444 return (ctf_errno(cup->cu_ctfp));
1445
1446 return (0);
1447 }
1448
1449 /*
1450 * Try and create an array type. First, the kind of the array is specified in
1451 * the DW_AT_type entry. Next, the number of entries is stored in a more
1452 * complicated form, we should have a child that has the DW_TAG_subrange type.
1453 */
1454 static int
ctf_dwarf_create_array(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int isroot)1455 ctf_dwarf_create_array(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot)
1456 {
1457 int ret;
1458 Dwarf_Die tdie, rdie;
1459 ctf_id_t tid;
1460 Dwarf_Half rtag;
1461
1462 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0)
1463 return (ret);
1464 if ((ret = ctf_dwarf_convert_type(cup, tdie, &tid,
1465 CTF_ADD_NONROOT)) != 0)
1466 return (ret);
1467
1468 if ((ret = ctf_dwarf_child(cup, die, &rdie)) != 0)
1469 return (ret);
1470 if ((ret = ctf_dwarf_tag(cup, rdie, &rtag)) != 0)
1471 return (ret);
1472 if (rtag != DW_TAG_subrange_type) {
1473 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1474 "encountered array without DW_TAG_subrange_type child\n");
1475 return (ECTF_CONVBKERR);
1476 }
1477
1478 /*
1479 * The compiler may opt to describe a multi-dimensional array as one
1480 * giant array or it may opt to instead encode it as a series of
1481 * subranges. If it's the latter, then for each subrange we introduce a
1482 * type. We can always use the base type.
1483 */
1484 if ((ret = ctf_dwarf_create_array_range(cup, rdie, idp, tid,
1485 isroot)) != 0)
1486 return (ret);
1487 ctf_dprintf("Got back id %d\n", *idp);
1488 return (ctf_dwmap_add(cup, *idp, die, B_FALSE));
1489 }
1490
1491 static int
ctf_dwarf_create_reference(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int kind,int isroot)1492 ctf_dwarf_create_reference(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp,
1493 int kind, int isroot)
1494 {
1495 int ret;
1496 ctf_id_t id;
1497 Dwarf_Die tdie;
1498 char *name;
1499 size_t namelen;
1500
1501 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 &&
1502 ret != ENOENT)
1503 return (ret);
1504 if (ret == ENOENT) {
1505 name = NULL;
1506 namelen = 0;
1507 } else {
1508 namelen = strlen(name);
1509 }
1510
1511 ctf_dprintf("reference kind %d %s\n", kind, name != NULL ? name : "<>");
1512
1513 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) {
1514 if (ret != ENOENT) {
1515 ctf_free(name, namelen);
1516 return (ret);
1517 }
1518 if ((id = ctf_dwarf_void(cup)) == CTF_ERR) {
1519 ctf_free(name, namelen);
1520 return (ctf_errno(cup->cu_ctfp));
1521 }
1522 } else {
1523 if ((ret = ctf_dwarf_convert_type(cup, tdie, &id,
1524 CTF_ADD_NONROOT)) != 0) {
1525 ctf_free(name, namelen);
1526 return (ret);
1527 }
1528 }
1529
1530 if ((*idp = ctf_add_reftype(cup->cu_ctfp, isroot, name, id, kind)) ==
1531 CTF_ERR) {
1532 ctf_free(name, namelen);
1533 return (ctf_errno(cup->cu_ctfp));
1534 }
1535
1536 ctf_free(name, namelen);
1537 return (ctf_dwmap_add(cup, *idp, die, B_FALSE));
1538 }
1539
1540 static int
ctf_dwarf_create_enum(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int isroot)1541 ctf_dwarf_create_enum(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot)
1542 {
1543 int ret;
1544 ctf_id_t id;
1545 Dwarf_Die child;
1546 char *name;
1547
1548 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 &&
1549 ret != ENOENT)
1550 return (ret);
1551 if (ret == ENOENT)
1552 name = NULL;
1553 id = ctf_add_enum(cup->cu_ctfp, isroot, name);
1554 ctf_dprintf("added enum %s (%d)\n", name, id);
1555 if (name != NULL)
1556 ctf_free(name, strlen(name) + 1);
1557 if (id == CTF_ERR)
1558 return (ctf_errno(cup->cu_ctfp));
1559 *idp = id;
1560 if ((ret = ctf_dwmap_add(cup, id, die, B_FALSE)) != 0)
1561 return (ret);
1562
1563 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0) {
1564 if (ret == ENOENT)
1565 ret = 0;
1566 return (ret);
1567 }
1568
1569 while (child != NULL) {
1570 Dwarf_Half tag;
1571 Dwarf_Signed sval;
1572 Dwarf_Unsigned uval;
1573 Dwarf_Die arg = child;
1574 int eval;
1575
1576 if ((ret = ctf_dwarf_sib(cup, arg, &child)) != 0)
1577 return (ret);
1578
1579 if ((ret = ctf_dwarf_tag(cup, arg, &tag)) != 0)
1580 return (ret);
1581
1582 if (tag != DW_TAG_enumerator) {
1583 if ((ret = ctf_dwarf_convert_type(cup, arg, NULL,
1584 CTF_ADD_NONROOT)) != 0)
1585 return (ret);
1586 continue;
1587 }
1588
1589 /*
1590 * DWARF v4 section 5.7 tells us we'll always have names.
1591 */
1592 if ((ret = ctf_dwarf_string(cup, arg, DW_AT_name, &name)) != 0)
1593 return (ret);
1594
1595 /*
1596 * We have to be careful here: newer GCCs generate DWARF where
1597 * an unsigned value will happily pass ctf_dwarf_signed().
1598 * Since negative values will fail ctf_dwarf_unsigned(), we try
1599 * that first to make sure we get the right value.
1600 */
1601 if ((ret = ctf_dwarf_unsigned(cup, arg, DW_AT_const_value,
1602 &uval)) == 0) {
1603 eval = (int)uval;
1604 } else if ((ret = ctf_dwarf_signed(cup, arg, DW_AT_const_value,
1605 &sval)) == 0) {
1606 eval = sval;
1607 }
1608
1609 if (ret != 0) {
1610 if (ret != ENOENT)
1611 return (ret);
1612
1613 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1614 "encountered enumeration without constant value\n");
1615 return (ECTF_CONVBKERR);
1616 }
1617
1618 ret = ctf_add_enumerator(cup->cu_ctfp, id, name, eval);
1619 if (ret == CTF_ERR) {
1620 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1621 "failed to add enumarator %s (%d) to %d\n",
1622 name, eval, id);
1623 ctf_free(name, strlen(name) + 1);
1624 return (ctf_errno(cup->cu_ctfp));
1625 }
1626 ctf_free(name, strlen(name) + 1);
1627 }
1628
1629 return (0);
1630 }
1631
1632 /*
1633 * For a function pointer, walk over and process all of its children, unless we
1634 * encounter one that's just a declaration. In which case, we error on it.
1635 */
1636 static int
ctf_dwarf_create_fptr(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int isroot)1637 ctf_dwarf_create_fptr(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot)
1638 {
1639 int ret;
1640 Dwarf_Bool b;
1641 ctf_funcinfo_t fi;
1642 Dwarf_Die retdie;
1643 ctf_id_t *argv = NULL;
1644
1645 bzero(&fi, sizeof (ctf_funcinfo_t));
1646
1647 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration, &b)) != 0) {
1648 if (ret != ENOENT)
1649 return (ret);
1650 } else {
1651 if (b != 0)
1652 return (EPROTOTYPE);
1653 }
1654
1655 /*
1656 * Return type is in DW_AT_type, if none, it returns void.
1657 */
1658 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &retdie)) != 0) {
1659 if (ret != ENOENT)
1660 return (ret);
1661 if ((fi.ctc_return = ctf_dwarf_void(cup)) == CTF_ERR)
1662 return (ctf_errno(cup->cu_ctfp));
1663 } else {
1664 if ((ret = ctf_dwarf_convert_type(cup, retdie, &fi.ctc_return,
1665 CTF_ADD_NONROOT)) != 0)
1666 return (ret);
1667 }
1668
1669 if ((ret = ctf_dwarf_function_count(cup, die, &fi, B_TRUE)) != 0) {
1670 return (ret);
1671 }
1672
1673 if (fi.ctc_argc != 0) {
1674 argv = ctf_alloc(sizeof (ctf_id_t) * fi.ctc_argc);
1675 if (argv == NULL)
1676 return (ENOMEM);
1677
1678 if ((ret = ctf_dwarf_convert_fargs(cup, die, &fi, argv)) != 0) {
1679 ctf_free(argv, sizeof (ctf_id_t) * fi.ctc_argc);
1680 return (ret);
1681 }
1682 }
1683
1684 if ((*idp = ctf_add_funcptr(cup->cu_ctfp, isroot, &fi, argv)) ==
1685 CTF_ERR) {
1686 ctf_free(argv, sizeof (ctf_id_t) * fi.ctc_argc);
1687 return (ctf_errno(cup->cu_ctfp));
1688 }
1689
1690 ctf_free(argv, sizeof (ctf_id_t) * fi.ctc_argc);
1691 return (ctf_dwmap_add(cup, *idp, die, B_FALSE));
1692 }
1693
1694 static int
ctf_dwarf_convert_type(ctf_cu_t * cup,Dwarf_Die die,ctf_id_t * idp,int isroot)1695 ctf_dwarf_convert_type(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp,
1696 int isroot)
1697 {
1698 int ret;
1699 Dwarf_Off offset;
1700 Dwarf_Half tag;
1701 ctf_dwmap_t lookup, *map;
1702 ctf_id_t id;
1703
1704 if (idp == NULL)
1705 idp = &id;
1706
1707 if ((ret = ctf_dwarf_offset(cup, die, &offset)) != 0)
1708 return (ret);
1709
1710 if (offset > cup->cu_maxoff) {
1711 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
1712 "die offset %llu beyond maximum for header %llu\n",
1713 offset, cup->cu_maxoff);
1714 return (ECTF_CONVBKERR);
1715 }
1716
1717 /*
1718 * If we've already added an entry for this offset, then we're done.
1719 */
1720 lookup.cdm_off = offset;
1721 if ((map = avl_find(&cup->cu_map, &lookup, NULL)) != NULL) {
1722 *idp = map->cdm_id;
1723 return (0);
1724 }
1725
1726 if ((ret = ctf_dwarf_tag(cup, die, &tag)) != 0)
1727 return (ret);
1728
1729 ret = ENOTSUP;
1730 switch (tag) {
1731 case DW_TAG_base_type:
1732 ctf_dprintf("base\n");
1733 ret = ctf_dwarf_create_base(cup, die, idp, isroot, offset);
1734 break;
1735 case DW_TAG_array_type:
1736 ctf_dprintf("array\n");
1737 ret = ctf_dwarf_create_array(cup, die, idp, isroot);
1738 break;
1739 case DW_TAG_enumeration_type:
1740 ctf_dprintf("enum\n");
1741 ret = ctf_dwarf_create_enum(cup, die, idp, isroot);
1742 break;
1743 case DW_TAG_pointer_type:
1744 ctf_dprintf("pointer\n");
1745 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_POINTER,
1746 isroot);
1747 break;
1748 case DW_TAG_structure_type:
1749 ctf_dprintf("struct\n");
1750 ret = ctf_dwarf_create_sou(cup, die, idp, CTF_K_STRUCT,
1751 isroot);
1752 break;
1753 case DW_TAG_subroutine_type:
1754 ctf_dprintf("fptr\n");
1755 ret = ctf_dwarf_create_fptr(cup, die, idp, isroot);
1756 break;
1757 case DW_TAG_typedef:
1758 ctf_dprintf("typedef\n");
1759 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_TYPEDEF,
1760 isroot);
1761 break;
1762 case DW_TAG_union_type:
1763 ctf_dprintf("union\n");
1764 ret = ctf_dwarf_create_sou(cup, die, idp, CTF_K_UNION,
1765 isroot);
1766 break;
1767 case DW_TAG_const_type:
1768 ctf_dprintf("const\n");
1769 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_CONST,
1770 isroot);
1771 break;
1772 case DW_TAG_volatile_type:
1773 ctf_dprintf("volatile\n");
1774 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_VOLATILE,
1775 isroot);
1776 break;
1777 case DW_TAG_restrict_type:
1778 ctf_dprintf("restrict\n");
1779 ret = ctf_dwarf_create_reference(cup, die, idp, CTF_K_RESTRICT,
1780 isroot);
1781 break;
1782 default:
1783 ctf_dprintf("ignoring tag type %x\n", tag);
1784 ret = 0;
1785 break;
1786 }
1787 ctf_dprintf("ctf_dwarf_convert_type tag specific handler returned %d\n",
1788 ret);
1789
1790 return (ret);
1791 }
1792
1793 static int
ctf_dwarf_walk_lexical(ctf_cu_t * cup,Dwarf_Die die)1794 ctf_dwarf_walk_lexical(ctf_cu_t *cup, Dwarf_Die die)
1795 {
1796 int ret;
1797 Dwarf_Die child;
1798
1799 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0)
1800 return (ret);
1801
1802 if (child == NULL)
1803 return (0);
1804
1805 return (ctf_dwarf_convert_die(cup, die));
1806 }
1807
1808 static int
ctf_dwarf_function_count(ctf_cu_t * cup,Dwarf_Die die,ctf_funcinfo_t * fip,boolean_t fptr)1809 ctf_dwarf_function_count(ctf_cu_t *cup, Dwarf_Die die, ctf_funcinfo_t *fip,
1810 boolean_t fptr)
1811 {
1812 int ret;
1813 Dwarf_Die child, sib, arg;
1814
1815 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0)
1816 return (ret);
1817
1818 arg = child;
1819 while (arg != NULL) {
1820 Dwarf_Half tag;
1821
1822 if ((ret = ctf_dwarf_tag(cup, arg, &tag)) != 0)
1823 return (ret);
1824
1825 /*
1826 * We have to check for a varargs type decleration. This will
1827 * happen in one of two ways. If we have a function pointer
1828 * type, then it'll be done with a tag of type
1829 * DW_TAG_unspecified_parameters. However, it only means we have
1830 * a variable number of arguments, if we have more than one
1831 * argument found so far. Otherwise, when we have a function
1832 * type, it instead uses a formal parameter whose name is '...'
1833 * to indicate a variable arguments member.
1834 *
1835 * Also, if we have a function pointer, then we have to expect
1836 * that we might not get a name at all.
1837 */
1838 if (tag == DW_TAG_formal_parameter && fptr == B_FALSE) {
1839 char *name;
1840 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name,
1841 &name)) != 0)
1842 return (ret);
1843 if (strcmp(name, DWARF_VARARGS_NAME) == 0)
1844 fip->ctc_flags |= CTF_FUNC_VARARG;
1845 else
1846 fip->ctc_argc++;
1847 ctf_free(name, strlen(name) + 1);
1848 } else if (tag == DW_TAG_formal_parameter) {
1849 fip->ctc_argc++;
1850 } else if (tag == DW_TAG_unspecified_parameters &&
1851 fip->ctc_argc > 0) {
1852 fip->ctc_flags |= CTF_FUNC_VARARG;
1853 }
1854 if ((ret = ctf_dwarf_sib(cup, arg, &sib)) != 0)
1855 return (ret);
1856 arg = sib;
1857 }
1858
1859 return (0);
1860 }
1861
1862 static int
ctf_dwarf_convert_fargs(ctf_cu_t * cup,Dwarf_Die die,ctf_funcinfo_t * fip,ctf_id_t * argv)1863 ctf_dwarf_convert_fargs(ctf_cu_t *cup, Dwarf_Die die, ctf_funcinfo_t *fip,
1864 ctf_id_t *argv)
1865 {
1866 int ret;
1867 int i = 0;
1868 Dwarf_Die child, sib, arg;
1869
1870 if ((ret = ctf_dwarf_child(cup, die, &child)) != 0)
1871 return (ret);
1872
1873 arg = child;
1874 while (arg != NULL) {
1875 Dwarf_Half tag;
1876
1877 if ((ret = ctf_dwarf_tag(cup, arg, &tag)) != 0)
1878 return (ret);
1879 if (tag == DW_TAG_formal_parameter) {
1880 Dwarf_Die tdie;
1881
1882 if ((ret = ctf_dwarf_refdie(cup, arg, DW_AT_type,
1883 &tdie)) != 0)
1884 return (ret);
1885
1886 if ((ret = ctf_dwarf_convert_type(cup, tdie, &argv[i],
1887 CTF_ADD_ROOT)) != 0)
1888 return (ret);
1889 i++;
1890
1891 /*
1892 * Once we hit argc entries, we're done. This ensures we
1893 * don't accidentally hit a varargs which should be the
1894 * last entry.
1895 */
1896 if (i == fip->ctc_argc)
1897 break;
1898 }
1899
1900 if ((ret = ctf_dwarf_sib(cup, arg, &sib)) != 0)
1901 return (ret);
1902 arg = sib;
1903 }
1904
1905 return (0);
1906 }
1907
1908 static int
ctf_dwarf_convert_function(ctf_cu_t * cup,Dwarf_Die die)1909 ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die)
1910 {
1911 int ret;
1912 char *name;
1913 ctf_dwfunc_t *cdf;
1914 Dwarf_Die tdie;
1915
1916 /*
1917 * Functions that don't have a name are generally functions that have
1918 * been inlined and thus most information about them has been lost. If
1919 * we can't get a name, then instead of returning ENOENT, we silently
1920 * swallow the error.
1921 */
1922 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0) {
1923 if (ret == ENOENT)
1924 return (0);
1925 return (ret);
1926 }
1927
1928 ctf_dprintf("beginning work on function %s\n", name);
1929 if ((cdf = ctf_alloc(sizeof (ctf_dwfunc_t))) == NULL) {
1930 ctf_free(name, strlen(name) + 1);
1931 return (ENOMEM);
1932 }
1933 bzero(cdf, sizeof (ctf_dwfunc_t));
1934 cdf->cdf_name = name;
1935
1936 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) == 0) {
1937 if ((ret = ctf_dwarf_convert_type(cup, tdie,
1938 &(cdf->cdf_fip.ctc_return), CTF_ADD_ROOT)) != 0) {
1939 ctf_free(name, strlen(name) + 1);
1940 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1941 return (ret);
1942 }
1943 } else if (ret != ENOENT) {
1944 ctf_free(name, strlen(name) + 1);
1945 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1946 return (ret);
1947 } else {
1948 if ((cdf->cdf_fip.ctc_return = ctf_dwarf_void(cup)) ==
1949 CTF_ERR) {
1950 ctf_free(name, strlen(name) + 1);
1951 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1952 return (ctf_errno(cup->cu_ctfp));
1953 }
1954 }
1955
1956 /*
1957 * A function has a number of children, some of which may not be ones we
1958 * care about. Children that we care about have a type of
1959 * DW_TAG_formal_parameter. We're going to do two passes, the first to
1960 * count the arguments, the second to process them. Afterwards, we
1961 * should be good to go ahead and add this function.
1962 *
1963 * Note, we already got the return type by going in and grabbing it out
1964 * of the DW_AT_type.
1965 */
1966 if ((ret = ctf_dwarf_function_count(cup, die, &cdf->cdf_fip,
1967 B_FALSE)) != 0) {
1968 ctf_free(name, strlen(name) + 1);
1969 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1970 return (ret);
1971 }
1972
1973 ctf_dprintf("beginning to convert function arguments %s\n", name);
1974 if (cdf->cdf_fip.ctc_argc != 0) {
1975 uint_t argc = cdf->cdf_fip.ctc_argc;
1976 cdf->cdf_argv = ctf_alloc(sizeof (ctf_id_t) * argc);
1977 if (cdf->cdf_argv == NULL) {
1978 ctf_free(name, strlen(name) + 1);
1979 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1980 return (ENOMEM);
1981 }
1982 if ((ret = ctf_dwarf_convert_fargs(cup, die,
1983 &cdf->cdf_fip, cdf->cdf_argv)) != 0) {
1984 ctf_free(cdf->cdf_argv, sizeof (ctf_id_t) * argc);
1985 ctf_free(name, strlen(name) + 1);
1986 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1987 return (ret);
1988 }
1989 } else {
1990 cdf->cdf_argv = NULL;
1991 }
1992
1993 if ((ret = ctf_dwarf_isglobal(cup, die, &cdf->cdf_global)) != 0) {
1994 ctf_free(cdf->cdf_argv, sizeof (ctf_id_t) *
1995 cdf->cdf_fip.ctc_argc);
1996 ctf_free(name, strlen(name) + 1);
1997 ctf_free(cdf, sizeof (ctf_dwfunc_t));
1998 return (ret);
1999 }
2000
2001 ctf_list_append(&cup->cu_funcs, cdf);
2002 return (ret);
2003 }
2004
2005 /*
2006 * Convert variables, but only if they're not prototypes and have names.
2007 */
2008 static int
ctf_dwarf_convert_variable(ctf_cu_t * cup,Dwarf_Die die)2009 ctf_dwarf_convert_variable(ctf_cu_t *cup, Dwarf_Die die)
2010 {
2011 int ret;
2012 char *name;
2013 Dwarf_Bool b;
2014 Dwarf_Die tdie;
2015 ctf_id_t id;
2016 ctf_dwvar_t *cdv;
2017
2018 /* Skip "Non-Defining Declarations" */
2019 if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration, &b)) == 0) {
2020 if (b != 0)
2021 return (0);
2022 } else if (ret != ENOENT) {
2023 return (ret);
2024 }
2025
2026 /*
2027 * If we find a DIE of "Declarations Completing Non-Defining
2028 * Declarations", we will use the referenced type's DIE. This isn't
2029 * quite correct, e.g. DW_AT_decl_line will be the forward declaration
2030 * not this site. It's sufficient for what we need, however: in
2031 * particular, we should find DW_AT_external as needed there.
2032 */
2033 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_specification,
2034 &tdie)) == 0) {
2035 Dwarf_Off offset;
2036 if ((ret = ctf_dwarf_offset(cup, tdie, &offset)) != 0)
2037 return (ret);
2038 ctf_dprintf("die 0x%llx DW_AT_specification -> die 0x%llx\n",
2039 ctf_die_offset(die), ctf_die_offset(tdie));
2040 die = tdie;
2041 } else if (ret != ENOENT) {
2042 return (ret);
2043 }
2044
2045 if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 &&
2046 ret != ENOENT)
2047 return (ret);
2048 if (ret == ENOENT)
2049 return (0);
2050
2051 if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) {
2052 ctf_free(name, strlen(name) + 1);
2053 return (ret);
2054 }
2055
2056 if ((ret = ctf_dwarf_convert_type(cup, tdie, &id,
2057 CTF_ADD_ROOT)) != 0)
2058 return (ret);
2059
2060 if ((cdv = ctf_alloc(sizeof (ctf_dwvar_t))) == NULL) {
2061 ctf_free(name, strlen(name) + 1);
2062 return (ENOMEM);
2063 }
2064
2065 cdv->cdv_name = name;
2066 cdv->cdv_type = id;
2067
2068 if ((ret = ctf_dwarf_isglobal(cup, die, &cdv->cdv_global)) != 0) {
2069 ctf_free(cdv, sizeof (ctf_dwvar_t));
2070 ctf_free(name, strlen(name) + 1);
2071 return (ret);
2072 }
2073
2074 ctf_list_append(&cup->cu_vars, cdv);
2075 return (0);
2076 }
2077
2078 /*
2079 * Walk through our set of top-level types and process them.
2080 */
2081 static int
ctf_dwarf_walk_toplevel(ctf_cu_t * cup,Dwarf_Die die)2082 ctf_dwarf_walk_toplevel(ctf_cu_t *cup, Dwarf_Die die)
2083 {
2084 int ret;
2085 Dwarf_Off offset;
2086 Dwarf_Half tag;
2087
2088 if ((ret = ctf_dwarf_offset(cup, die, &offset)) != 0)
2089 return (ret);
2090
2091 if (offset > cup->cu_maxoff) {
2092 (void) snprintf(cup->cu_errbuf, cup->cu_errlen,
2093 "die offset %llu beyond maximum for header %llu\n",
2094 offset, cup->cu_maxoff);
2095 return (ECTF_CONVBKERR);
2096 }
2097
2098 if ((ret = ctf_dwarf_tag(cup, die, &tag)) != 0)
2099 return (ret);
2100
2101 ret = 0;
2102 switch (tag) {
2103 case DW_TAG_subprogram:
2104 ctf_dprintf("top level func\n");
2105 ret = ctf_dwarf_convert_function(cup, die);
2106 break;
2107 case DW_TAG_variable:
2108 ctf_dprintf("top level var\n");
2109 ret = ctf_dwarf_convert_variable(cup, die);
2110 break;
2111 case DW_TAG_lexical_block:
2112 ctf_dprintf("top level block\n");
2113 ret = ctf_dwarf_walk_lexical(cup, die);
2114 break;
2115 case DW_TAG_enumeration_type:
2116 case DW_TAG_structure_type:
2117 case DW_TAG_typedef:
2118 case DW_TAG_union_type:
2119 ctf_dprintf("top level type\n");
2120 ret = ctf_dwarf_convert_type(cup, die, NULL, B_TRUE);
2121 break;
2122 default:
2123 break;
2124 }
2125
2126 return (ret);
2127 }
2128
2129
2130 /*
2131 * We're given a node. At this node we need to convert it and then proceed to
2132 * convert any siblings that are associaed with this die.
2133 */
2134 static int
ctf_dwarf_convert_die(ctf_cu_t * cup,Dwarf_Die die)2135 ctf_dwarf_convert_die(ctf_cu_t *cup, Dwarf_Die die)
2136 {
2137 while (die != NULL) {
2138 int ret;
2139 Dwarf_Die sib;
2140
2141 if ((ret = ctf_dwarf_walk_toplevel(cup, die)) != 0)
2142 return (ret);
2143
2144 if ((ret = ctf_dwarf_sib(cup, die, &sib)) != 0)
2145 return (ret);
2146 die = sib;
2147 }
2148 return (0);
2149 }
2150
2151 static int
ctf_dwarf_fixup_die(ctf_cu_t * cup,boolean_t addpass)2152 ctf_dwarf_fixup_die(ctf_cu_t *cup, boolean_t addpass)
2153 {
2154 ctf_dwmap_t *map;
2155
2156 for (map = avl_first(&cup->cu_map); map != NULL;
2157 map = AVL_NEXT(&cup->cu_map, map)) {
2158 int ret;
2159 if (map->cdm_fix == B_FALSE)
2160 continue;
2161 if ((ret = ctf_dwarf_fixup_sou(cup, map->cdm_die, map->cdm_id,
2162 addpass)) != 0)
2163 return (ret);
2164 }
2165
2166 return (0);
2167 }
2168
2169 static ctf_dwfunc_t *
ctf_dwarf_match_func(ctf_cu_t * cup,const char * file,const char * name,int bind)2170 ctf_dwarf_match_func(ctf_cu_t *cup, const char *file, const char *name,
2171 int bind)
2172 {
2173 ctf_dwfunc_t *cdf;
2174
2175 if (bind == STB_WEAK)
2176 return (NULL);
2177
2178 /* Nothing we can do if we can't find a name to compare it to. */
2179 if (bind == STB_LOCAL && (file == NULL || cup->cu_name == NULL))
2180 return (NULL);
2181
2182 for (cdf = ctf_list_next(&cup->cu_funcs); cdf != NULL;
2183 cdf = ctf_list_next(cdf)) {
2184 if (bind == STB_GLOBAL && cdf->cdf_global == B_FALSE)
2185 continue;
2186 if (bind == STB_LOCAL && cdf->cdf_global == B_TRUE)
2187 continue;
2188 if (strcmp(name, cdf->cdf_name) != 0)
2189 continue;
2190 if (bind == STB_LOCAL && strcmp(file, cup->cu_name) != 0)
2191 continue;
2192 return (cdf);
2193 }
2194
2195 return (NULL);
2196 }
2197 static ctf_dwvar_t *
ctf_dwarf_match_var(ctf_cu_t * cup,const char * file,const char * name,int bind)2198 ctf_dwarf_match_var(ctf_cu_t *cup, const char *file, const char *name,
2199 int bind)
2200 {
2201 ctf_dwvar_t *cdv;
2202
2203 /* Nothing we can do if we can't find a name to compare it to. */
2204 if (bind == STB_LOCAL && (file == NULL || cup->cu_name == NULL))
2205 return (NULL);
2206 ctf_dprintf("Still considering %s\n", name);
2207
2208 for (cdv = ctf_list_next(&cup->cu_vars); cdv != NULL;
2209 cdv = ctf_list_next(cdv)) {
2210 if (bind == STB_GLOBAL && cdv->cdv_global == B_FALSE)
2211 continue;
2212 if (bind == STB_LOCAL && cdv->cdv_global == B_TRUE)
2213 continue;
2214 if (strcmp(name, cdv->cdv_name) != 0)
2215 continue;
2216 if (bind == STB_LOCAL && strcmp(file, cup->cu_name) != 0)
2217 continue;
2218 return (cdv);
2219 }
2220
2221 return (NULL);
2222 }
2223
2224 static int
ctf_dwarf_symtab_iter(ctf_cu_t * cup,ctf_dwarf_symtab_f * func,void * arg)2225 ctf_dwarf_symtab_iter(ctf_cu_t *cup, ctf_dwarf_symtab_f *func, void *arg)
2226 {
2227 int ret;
2228 ulong_t i;
2229 ctf_file_t *fp = cup->cu_ctfp;
2230 const char *file = NULL;
2231 uintptr_t symbase = (uintptr_t)fp->ctf_symtab.cts_data;
2232 uintptr_t strbase = (uintptr_t)fp->ctf_strtab.cts_data;
2233
2234 for (i = 0; i < fp->ctf_nsyms; i++) {
2235 const char *name;
2236 int type;
2237 GElf_Sym gsym;
2238 const GElf_Sym *gsymp;
2239
2240 if (fp->ctf_symtab.cts_entsize == sizeof (Elf32_Sym)) {
2241 const Elf32_Sym *symp = (Elf32_Sym *)symbase + i;
2242 type = ELF32_ST_TYPE(symp->st_info);
2243 if (type == STT_FILE) {
2244 file = (char *)(strbase + symp->st_name);
2245 continue;
2246 }
2247 if (type != STT_OBJECT && type != STT_FUNC)
2248 continue;
2249 if (ctf_sym_valid(strbase, type, symp->st_shndx,
2250 symp->st_value, symp->st_name) == B_FALSE)
2251 continue;
2252 name = (char *)(strbase + symp->st_name);
2253 gsym.st_name = symp->st_name;
2254 gsym.st_value = symp->st_value;
2255 gsym.st_size = symp->st_size;
2256 gsym.st_info = symp->st_info;
2257 gsym.st_other = symp->st_other;
2258 gsym.st_shndx = symp->st_shndx;
2259 gsymp = &gsym;
2260 } else {
2261 const Elf64_Sym *symp = (Elf64_Sym *)symbase + i;
2262 type = ELF64_ST_TYPE(symp->st_info);
2263 if (type == STT_FILE) {
2264 file = (char *)(strbase + symp->st_name);
2265 continue;
2266 }
2267 if (type != STT_OBJECT && type != STT_FUNC)
2268 continue;
2269 if (ctf_sym_valid(strbase, type, symp->st_shndx,
2270 symp->st_value, symp->st_name) == B_FALSE)
2271 continue;
2272 name = (char *)(strbase + symp->st_name);
2273 gsymp = symp;
2274 }
2275
2276 ret = func(cup, gsymp, i, file, name, arg);
2277 if (ret != 0)
2278 return (ret);
2279 }
2280
2281 return (0);
2282 }
2283
2284 static int
ctf_dwarf_conv_funcvars_cb(ctf_cu_t * cup,const GElf_Sym * symp,ulong_t idx,const char * file,const char * name,void * arg)2285 ctf_dwarf_conv_funcvars_cb(ctf_cu_t *cup, const GElf_Sym *symp, ulong_t idx,
2286 const char *file, const char *name, void *arg)
2287 {
2288 int ret, bind, type;
2289
2290 bind = GELF_ST_BIND(symp->st_info);
2291 type = GELF_ST_TYPE(symp->st_info);
2292
2293 /*
2294 * Come back to weak symbols in another pass
2295 */
2296 if (bind == STB_WEAK)
2297 return (0);
2298
2299 if (type == STT_OBJECT) {
2300 ctf_dwvar_t *cdv = ctf_dwarf_match_var(cup, file, name,
2301 bind);
2302 ctf_dprintf("match for %s (%d): %p\n", name, idx, cdv);
2303 if (cdv == NULL)
2304 return (0);
2305 ret = ctf_add_object(cup->cu_ctfp, idx, cdv->cdv_type);
2306 ctf_dprintf("added object %s\n", name);
2307 } else {
2308 ctf_dwfunc_t *cdf = ctf_dwarf_match_func(cup, file, name,
2309 bind);
2310 if (cdf == NULL)
2311 return (0);
2312 ret = ctf_add_function(cup->cu_ctfp, idx, &cdf->cdf_fip,
2313 cdf->cdf_argv);
2314 }
2315
2316 if (ret == CTF_ERR) {
2317 return (ctf_errno(cup->cu_ctfp));
2318 }
2319
2320 return (0);
2321 }
2322
2323 static int
ctf_dwarf_conv_funcvars(ctf_cu_t * cup)2324 ctf_dwarf_conv_funcvars(ctf_cu_t *cup)
2325 {
2326 return (ctf_dwarf_symtab_iter(cup, ctf_dwarf_conv_funcvars_cb, NULL));
2327 }
2328
2329 /*
2330 * If we have a weak symbol, attempt to find the strong symbol it will resolve
2331 * to. Note: the code where this actually happens is in sym_process() in
2332 * cmd/sgs/libld/common/syms.c
2333 *
2334 * Finding the matching symbol is unfortunately not trivial. For a symbol to be
2335 * a candidate, it must:
2336 *
2337 * - have the same type (function, object)
2338 * - have the same value (address)
2339 * - have the same size
2340 * - not be another weak symbol
2341 * - belong to the same section (checked via section index)
2342 *
2343 * To perform this check, we first iterate over the symbol table. For each weak
2344 * symbol that we encounter, we then do a second walk over the symbol table,
2345 * calling ctf_dwarf_conv_check_weak(). If a symbol matches the above, then it's
2346 * either a local or global symbol. If we find a global symbol then we go with
2347 * it and stop searching for additional matches.
2348 *
2349 * If instead, we find a local symbol, things are more complicated. The first
2350 * thing we do is to try and see if we have file information about both symbols
2351 * (STT_FILE). If they both have file information and it matches, then we treat
2352 * that as a good match and stop searching for additional matches.
2353 *
2354 * Otherwise, this means we have a non-matching file and a local symbol. We
2355 * treat this as a candidate and if we find a better match (one of the two cases
2356 * above), use that instead. There are two different ways this can happen.
2357 * Either this is a completely different symbol, or it's a once-global symbol
2358 * that was scoped to local via a mapfile. In the former case, curfile is
2359 * likely inaccurate since the linker does not preserve the needed curfile in
2360 * the order of the symbol table (see the comments about locally scoped symbols
2361 * in libld's update_osym()). As we can't tell this case from the former one,
2362 * we use this symbol iff no other matching symbol is found.
2363 *
2364 * What we really need here is a SUNW section containing weak<->strong mappings
2365 * that we can consume.
2366 */
2367 typedef struct ctf_dwarf_weak_arg {
2368 const GElf_Sym *cweak_symp;
2369 const char *cweak_file;
2370 boolean_t cweak_candidate;
2371 ulong_t cweak_idx;
2372 } ctf_dwarf_weak_arg_t;
2373
2374 static int
ctf_dwarf_conv_check_weak(ctf_cu_t * cup,const GElf_Sym * symp,ulong_t idx,const char * file,const char * name,void * arg)2375 ctf_dwarf_conv_check_weak(ctf_cu_t *cup, const GElf_Sym *symp,
2376 ulong_t idx, const char *file, const char *name, void *arg)
2377 {
2378 ctf_dwarf_weak_arg_t *cweak = arg;
2379 const GElf_Sym *wsymp = cweak->cweak_symp;
2380
2381 ctf_dprintf("comparing weak to %s\n", name);
2382
2383 if (GELF_ST_BIND(symp->st_info) == STB_WEAK) {
2384 return (0);
2385 }
2386
2387 if (GELF_ST_TYPE(wsymp->st_info) != GELF_ST_TYPE(symp->st_info)) {
2388 return (0);
2389 }
2390
2391 if (wsymp->st_value != symp->st_value) {
2392 return (0);
2393 }
2394
2395 if (wsymp->st_size != symp->st_size) {
2396 return (0);
2397 }
2398
2399 if (wsymp->st_shndx != symp->st_shndx) {
2400 return (0);
2401 }
2402
2403 /*
2404 * Check if it's a weak candidate.
2405 */
2406 if (GELF_ST_BIND(symp->st_info) == STB_LOCAL &&
2407 (file == NULL || cweak->cweak_file == NULL ||
2408 strcmp(file, cweak->cweak_file) != 0)) {
2409 cweak->cweak_candidate = B_TRUE;
2410 cweak->cweak_idx = idx;
2411 return (0);
2412 }
2413
2414 /*
2415 * Found a match, break.
2416 */
2417 cweak->cweak_idx = idx;
2418 return (1);
2419 }
2420
2421 static int
ctf_dwarf_duplicate_sym(ctf_cu_t * cup,ulong_t idx,ulong_t matchidx)2422 ctf_dwarf_duplicate_sym(ctf_cu_t *cup, ulong_t idx, ulong_t matchidx)
2423 {
2424 ctf_id_t id = ctf_lookup_by_symbol(cup->cu_ctfp, matchidx);
2425
2426 /*
2427 * If we matched something that for some reason didn't have type data,
2428 * we don't consider that a fatal error and silently swallow it.
2429 */
2430 if (id == CTF_ERR) {
2431 if (ctf_errno(cup->cu_ctfp) == ECTF_NOTYPEDAT)
2432 return (0);
2433 else
2434 return (ctf_errno(cup->cu_ctfp));
2435 }
2436
2437 if (ctf_add_object(cup->cu_ctfp, idx, id) == CTF_ERR)
2438 return (ctf_errno(cup->cu_ctfp));
2439
2440 return (0);
2441 }
2442
2443 static int
ctf_dwarf_duplicate_func(ctf_cu_t * cup,ulong_t idx,ulong_t matchidx)2444 ctf_dwarf_duplicate_func(ctf_cu_t *cup, ulong_t idx, ulong_t matchidx)
2445 {
2446 int ret;
2447 ctf_funcinfo_t fip;
2448 ctf_id_t *args = NULL;
2449
2450 if (ctf_func_info(cup->cu_ctfp, matchidx, &fip) == CTF_ERR) {
2451 if (ctf_errno(cup->cu_ctfp) == ECTF_NOFUNCDAT)
2452 return (0);
2453 else
2454 return (ctf_errno(cup->cu_ctfp));
2455 }
2456
2457 if (fip.ctc_argc != 0) {
2458 args = ctf_alloc(sizeof (ctf_id_t) * fip.ctc_argc);
2459 if (args == NULL)
2460 return (ENOMEM);
2461
2462 if (ctf_func_args(cup->cu_ctfp, matchidx, fip.ctc_argc, args) ==
2463 CTF_ERR) {
2464 ctf_free(args, sizeof (ctf_id_t) * fip.ctc_argc);
2465 return (ctf_errno(cup->cu_ctfp));
2466 }
2467 }
2468
2469 ret = ctf_add_function(cup->cu_ctfp, idx, &fip, args);
2470 if (args != NULL)
2471 ctf_free(args, sizeof (ctf_id_t) * fip.ctc_argc);
2472 if (ret == CTF_ERR)
2473 return (ctf_errno(cup->cu_ctfp));
2474
2475 return (0);
2476 }
2477
2478 static int
ctf_dwarf_conv_weaks_cb(ctf_cu_t * cup,const GElf_Sym * symp,ulong_t idx,const char * file,const char * name,void * arg)2479 ctf_dwarf_conv_weaks_cb(ctf_cu_t *cup, const GElf_Sym *symp,
2480 ulong_t idx, const char *file, const char *name, void *arg)
2481 {
2482 int ret, type;
2483 ctf_dwarf_weak_arg_t cweak;
2484
2485 /*
2486 * We only care about weak symbols.
2487 */
2488 if (GELF_ST_BIND(symp->st_info) != STB_WEAK)
2489 return (0);
2490
2491 type = GELF_ST_TYPE(symp->st_info);
2492 ASSERT(type == STT_OBJECT || type == STT_FUNC);
2493
2494 /*
2495 * For each weak symbol we encounter, we need to do a second iteration
2496 * to try and find a match. We should probably think about other
2497 * techniques to try and save us time in the future.
2498 */
2499 cweak.cweak_symp = symp;
2500 cweak.cweak_file = file;
2501 cweak.cweak_candidate = B_FALSE;
2502 cweak.cweak_idx = 0;
2503
2504 ctf_dprintf("Trying to find weak equiv for %s\n", name);
2505
2506 ret = ctf_dwarf_symtab_iter(cup, ctf_dwarf_conv_check_weak, &cweak);
2507 VERIFY(ret == 0 || ret == 1);
2508
2509 /*
2510 * Nothing was ever found, we're not going to add anything for this
2511 * entry.
2512 */
2513 if (ret == 0 && cweak.cweak_candidate == B_FALSE) {
2514 ctf_dprintf("found no weak match for %s\n", name);
2515 return (0);
2516 }
2517
2518 /*
2519 * Now, finally go and add the type based on the match.
2520 */
2521 if (type == STT_OBJECT) {
2522 ret = ctf_dwarf_duplicate_sym(cup, idx, cweak.cweak_idx);
2523 } else {
2524 ret = ctf_dwarf_duplicate_func(cup, idx, cweak.cweak_idx);
2525 }
2526
2527 return (ret);
2528 }
2529
2530 static int
ctf_dwarf_conv_weaks(ctf_cu_t * cup)2531 ctf_dwarf_conv_weaks(ctf_cu_t *cup)
2532 {
2533 return (ctf_dwarf_symtab_iter(cup, ctf_dwarf_conv_weaks_cb, NULL));
2534 }
2535
2536 /* ARGSUSED */
2537 static int
ctf_dwarf_convert_one(void * arg,void * unused)2538 ctf_dwarf_convert_one(void *arg, void *unused)
2539 {
2540 int ret;
2541 ctf_file_t *dedup;
2542 ctf_cu_t *cup = arg;
2543
2544 ctf_dprintf("converting die: %s\n", cup->cu_name);
2545 ctf_dprintf("max offset: %x\n", cup->cu_maxoff);
2546 VERIFY(cup != NULL);
2547
2548 ret = ctf_dwarf_convert_die(cup, cup->cu_cu);
2549 ctf_dprintf("ctf_dwarf_convert_die (%s) returned %d\n", cup->cu_name,
2550 ret);
2551 if (ret != 0) {
2552 return (ret);
2553 }
2554 if (ctf_update(cup->cu_ctfp) != 0) {
2555 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0,
2556 "failed to update output ctf container"));
2557 }
2558
2559 ret = ctf_dwarf_fixup_die(cup, B_FALSE);
2560 ctf_dprintf("ctf_dwarf_fixup_die (%s) returned %d\n", cup->cu_name,
2561 ret);
2562 if (ret != 0) {
2563 return (ret);
2564 }
2565 if (ctf_update(cup->cu_ctfp) != 0) {
2566 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0,
2567 "failed to update output ctf container"));
2568 }
2569
2570 ret = ctf_dwarf_fixup_die(cup, B_TRUE);
2571 ctf_dprintf("ctf_dwarf_fixup_die (%s) returned %d\n", cup->cu_name,
2572 ret);
2573 if (ret != 0) {
2574 return (ret);
2575 }
2576 if (ctf_update(cup->cu_ctfp) != 0) {
2577 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0,
2578 "failed to update output ctf container"));
2579 }
2580
2581
2582 if ((ret = ctf_dwarf_conv_funcvars(cup)) != 0) {
2583 return (ctf_dwarf_error(cup, NULL, ret,
2584 "failed to convert strong functions and variables"));
2585 }
2586
2587 if (ctf_update(cup->cu_ctfp) != 0) {
2588 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0,
2589 "failed to update output ctf container"));
2590 }
2591
2592 if (cup->cu_doweaks == B_TRUE) {
2593 if ((ret = ctf_dwarf_conv_weaks(cup)) != 0) {
2594 return (ctf_dwarf_error(cup, NULL, ret,
2595 "failed to convert weak functions and variables"));
2596 }
2597
2598 if (ctf_update(cup->cu_ctfp) != 0) {
2599 return (ctf_dwarf_error(cup, cup->cu_ctfp, 0,
2600 "failed to update output ctf container"));
2601 }
2602 }
2603
2604 ctf_phase_dump(cup->cu_ctfp, "pre-dedup");
2605 ctf_dprintf("adding inputs for dedup\n");
2606 if ((ret = ctf_merge_add(cup->cu_cmh, cup->cu_ctfp)) != 0) {
2607 return (ctf_dwarf_error(cup, NULL, ret,
2608 "failed to add inputs for merge"));
2609 }
2610
2611 ctf_dprintf("starting merge\n");
2612 if ((ret = ctf_merge_dedup(cup->cu_cmh, &dedup)) != 0) {
2613 return (ctf_dwarf_error(cup, NULL, ret,
2614 "failed to deduplicate die"));
2615 }
2616 ctf_close(cup->cu_ctfp);
2617 cup->cu_ctfp = dedup;
2618
2619 return (0);
2620 }
2621
2622 /*
2623 * Note, we expect that if we're returning a ctf_file_t from one of the dies,
2624 * say in the single node case, it's been saved and the entry here has been set
2625 * to NULL, which ctf_close happily ignores.
2626 */
2627 static void
ctf_dwarf_free_die(ctf_cu_t * cup)2628 ctf_dwarf_free_die(ctf_cu_t *cup)
2629 {
2630 ctf_dwfunc_t *cdf, *ndf;
2631 ctf_dwvar_t *cdv, *ndv;
2632 ctf_dwbitf_t *cdb, *ndb;
2633 ctf_dwmap_t *map;
2634 void *cookie;
2635 Dwarf_Error derr;
2636
2637 ctf_dprintf("Beginning to free die: %p\n", cup);
2638 cup->cu_elf = NULL;
2639 ctf_dprintf("Trying to free name: %p\n", cup->cu_name);
2640 if (cup->cu_name != NULL)
2641 ctf_free(cup->cu_name, strlen(cup->cu_name) + 1);
2642 ctf_dprintf("Trying to free merge handle: %p\n", cup->cu_cmh);
2643 if (cup->cu_cmh != NULL) {
2644 ctf_merge_fini(cup->cu_cmh);
2645 cup->cu_cmh = NULL;
2646 }
2647
2648 ctf_dprintf("Trying to free functions\n");
2649 for (cdf = ctf_list_next(&cup->cu_funcs); cdf != NULL; cdf = ndf) {
2650 ndf = ctf_list_next(cdf);
2651 ctf_free(cdf->cdf_name, strlen(cdf->cdf_name) + 1);
2652 if (cdf->cdf_fip.ctc_argc != 0) {
2653 ctf_free(cdf->cdf_argv,
2654 sizeof (ctf_id_t) * cdf->cdf_fip.ctc_argc);
2655 }
2656 ctf_free(cdf, sizeof (ctf_dwfunc_t));
2657 }
2658
2659 ctf_dprintf("Trying to free variables\n");
2660 for (cdv = ctf_list_next(&cup->cu_vars); cdv != NULL; cdv = ndv) {
2661 ndv = ctf_list_next(cdv);
2662 ctf_free(cdv->cdv_name, strlen(cdv->cdv_name) + 1);
2663 ctf_free(cdv, sizeof (ctf_dwvar_t));
2664 }
2665
2666 ctf_dprintf("Trying to free bitfields\n");
2667 for (cdb = ctf_list_next(&cup->cu_bitfields); cdb != NULL; cdb = ndb) {
2668 ndb = ctf_list_next(cdb);
2669 ctf_free(cdb, sizeof (ctf_dwbitf_t));
2670 }
2671
2672 ctf_dprintf("Trying to clean up dwarf_t: %p\n", cup->cu_dwarf);
2673 (void) dwarf_finish(cup->cu_dwarf, &derr);
2674 cup->cu_dwarf = NULL;
2675 ctf_close(cup->cu_ctfp);
2676
2677 cookie = NULL;
2678 while ((map = avl_destroy_nodes(&cup->cu_map, &cookie)) != NULL) {
2679 ctf_free(map, sizeof (ctf_dwmap_t));
2680 }
2681 avl_destroy(&cup->cu_map);
2682 cup->cu_errbuf = NULL;
2683 }
2684
2685 static void
ctf_dwarf_free_dies(ctf_cu_t * cdies,int ndies)2686 ctf_dwarf_free_dies(ctf_cu_t *cdies, int ndies)
2687 {
2688 int i;
2689
2690 ctf_dprintf("Beginning to free dies\n");
2691 for (i = 0; i < ndies; i++) {
2692 ctf_dwarf_free_die(&cdies[i]);
2693 }
2694
2695 ctf_free(cdies, sizeof (ctf_cu_t) * ndies);
2696 }
2697
2698 static int
ctf_dwarf_count_dies(Dwarf_Debug dw,Dwarf_Error * derr,int * ndies,char * errbuf,size_t errlen)2699 ctf_dwarf_count_dies(Dwarf_Debug dw, Dwarf_Error *derr, int *ndies,
2700 char *errbuf, size_t errlen)
2701 {
2702 int ret;
2703 Dwarf_Half vers;
2704 Dwarf_Unsigned nexthdr;
2705
2706 while ((ret = dwarf_next_cu_header(dw, NULL, &vers, NULL, NULL,
2707 &nexthdr, derr)) != DW_DLV_NO_ENTRY) {
2708 if (ret != DW_DLV_OK) {
2709 (void) snprintf(errbuf, errlen,
2710 "file does not contain valid DWARF data: %s\n",
2711 dwarf_errmsg(*derr));
2712 return (ECTF_CONVBKERR);
2713 }
2714
2715 if (vers != DWARF_VERSION_TWO) {
2716 (void) snprintf(errbuf, errlen,
2717 "unsupported DWARF version: %d\n", vers);
2718 return (ECTF_CONVBKERR);
2719 }
2720 *ndies = *ndies + 1;
2721 }
2722
2723 if (*ndies == 0) {
2724 (void) snprintf(errbuf, errlen,
2725 "file does not contain valid DWARF data: %s\n",
2726 dwarf_errmsg(*derr));
2727 return (ECTF_CONVBKERR);
2728 }
2729
2730 return (0);
2731 }
2732
2733 static int
ctf_dwarf_init_die(int fd,Elf * elf,ctf_cu_t * cup,int ndie,char * errbuf,size_t errlen)2734 ctf_dwarf_init_die(int fd, Elf *elf, ctf_cu_t *cup, int ndie, char *errbuf,
2735 size_t errlen)
2736 {
2737 int ret;
2738 Dwarf_Unsigned hdrlen, abboff, nexthdr;
2739 Dwarf_Half addrsz;
2740 Dwarf_Unsigned offset = 0;
2741 Dwarf_Error derr;
2742
2743 while ((ret = dwarf_next_cu_header(cup->cu_dwarf, &hdrlen, NULL,
2744 &abboff, &addrsz, &nexthdr, &derr)) != DW_DLV_NO_ENTRY) {
2745 char *name;
2746 Dwarf_Die cu, child;
2747
2748 /* Based on the counting above, we should be good to go */
2749 VERIFY(ret == DW_DLV_OK);
2750 if (ndie > 0) {
2751 ndie--;
2752 offset = nexthdr;
2753 continue;
2754 }
2755
2756 /*
2757 * Compilers are apparently inconsistent. Some emit no DWARF for
2758 * empty files and others emit empty compilation unit.
2759 */
2760 cup->cu_voidtid = CTF_ERR;
2761 cup->cu_longtid = CTF_ERR;
2762 cup->cu_elf = elf;
2763 cup->cu_maxoff = nexthdr - 1;
2764 cup->cu_ctfp = ctf_fdcreate(fd, &ret);
2765 if (cup->cu_ctfp == NULL) {
2766 ctf_free(cup, sizeof (ctf_cu_t));
2767 return (ret);
2768 }
2769 avl_create(&cup->cu_map, ctf_dwmap_comp, sizeof (ctf_dwmap_t),
2770 offsetof(ctf_dwmap_t, cdm_avl));
2771 cup->cu_errbuf = errbuf;
2772 cup->cu_errlen = errlen;
2773 bzero(&cup->cu_vars, sizeof (ctf_list_t));
2774 bzero(&cup->cu_funcs, sizeof (ctf_list_t));
2775 bzero(&cup->cu_bitfields, sizeof (ctf_list_t));
2776
2777 if ((ret = ctf_dwarf_die_elfenc(elf, cup, errbuf,
2778 errlen)) != 0) {
2779 avl_destroy(&cup->cu_map);
2780 ctf_free(cup, sizeof (ctf_cu_t));
2781 return (ret);
2782 }
2783
2784 if ((ret = ctf_dwarf_sib(cup, NULL, &cu)) != 0) {
2785 avl_destroy(&cup->cu_map);
2786 ctf_free(cup, sizeof (ctf_cu_t));
2787 return (ret);
2788 }
2789 if (cu == NULL) {
2790 (void) snprintf(errbuf, errlen,
2791 "file does not contain DWARF data\n");
2792 avl_destroy(&cup->cu_map);
2793 ctf_free(cup, sizeof (ctf_cu_t));
2794 return (ECTF_CONVBKERR);
2795 }
2796
2797 if ((ret = ctf_dwarf_child(cup, cu, &child)) != 0) {
2798 avl_destroy(&cup->cu_map);
2799 ctf_free(cup, sizeof (ctf_cu_t));
2800 return (ret);
2801 }
2802 if (child == NULL) {
2803 (void) snprintf(errbuf, errlen,
2804 "file does not contain DWARF data\n");
2805 avl_destroy(&cup->cu_map);
2806 ctf_free(cup, sizeof (ctf_cu_t));
2807 return (ECTF_CONVBKERR);
2808 }
2809
2810 cup->cu_cuoff = offset;
2811 cup->cu_cu = child;
2812
2813 if ((cup->cu_cmh = ctf_merge_init(fd, &ret)) == NULL) {
2814 avl_destroy(&cup->cu_map);
2815 ctf_free(cup, sizeof (ctf_cu_t));
2816 return (ret);
2817 }
2818
2819 if (ctf_dwarf_string(cup, cu, DW_AT_name, &name) == 0) {
2820 size_t len = strlen(name) + 1;
2821 char *b = basename(name);
2822 cup->cu_name = strdup(b);
2823 ctf_free(name, len);
2824 }
2825 break;
2826 }
2827
2828 return (0);
2829 }
2830
2831
2832 ctf_conv_status_t
ctf_dwarf_convert(int fd,Elf * elf,uint_t nthrs,int * errp,ctf_file_t ** fpp,char * errmsg,size_t errlen)2833 ctf_dwarf_convert(int fd, Elf *elf, uint_t nthrs, int *errp, ctf_file_t **fpp,
2834 char *errmsg, size_t errlen)
2835 {
2836 int err, ret, ndies, i;
2837 Dwarf_Debug dw;
2838 Dwarf_Error derr;
2839 ctf_cu_t *cdies = NULL, *cup;
2840 workq_t *wqp = NULL;
2841
2842 if (errp == NULL)
2843 errp = &err;
2844 *errp = 0;
2845 *fpp = NULL;
2846
2847 ret = dwarf_elf_init(elf, DW_DLC_READ, NULL, NULL, &dw, &derr);
2848 if (ret != DW_DLV_OK) {
2849 /*
2850 * We may want to expect DWARF data here and fail conversion if
2851 * it's missing. In this case, if we actually have some amount
2852 * of DWARF, but no section, for now, just go ahead and create
2853 * an empty CTF file.
2854 */
2855 if (ret == DW_DLV_NO_ENTRY ||
2856 dwarf_errno(derr) == DW_DLE_DEBUG_INFO_NULL) {
2857 *fpp = ctf_create(errp);
2858 return (*fpp != NULL ? CTF_CONV_SUCCESS :
2859 CTF_CONV_ERROR);
2860 }
2861 (void) snprintf(errmsg, errlen,
2862 "failed to initialize DWARF: %s\n",
2863 dwarf_errmsg(derr));
2864 *errp = ECTF_CONVBKERR;
2865 return (CTF_CONV_ERROR);
2866 }
2867
2868 /*
2869 * Iterate over all of the compilation units and create a ctf_cu_t for
2870 * each of them. This is used to determine if we have zero, one, or
2871 * multiple dies to convert. If we have zero, that's an error. If
2872 * there's only one die, that's the simple case. No merge needed and
2873 * only a single Dwarf_Debug as well.
2874 */
2875 ndies = 0;
2876 ret = ctf_dwarf_count_dies(dw, &derr, &ndies, errmsg, errlen);
2877 if (ret != 0) {
2878 *errp = ret;
2879 goto out;
2880 }
2881
2882 (void) dwarf_finish(dw, &derr);
2883 cdies = ctf_alloc(sizeof (ctf_cu_t) * ndies);
2884 if (cdies == NULL) {
2885 *errp = ENOMEM;
2886 return (CTF_CONV_ERROR);
2887 }
2888
2889 for (i = 0; i < ndies; i++) {
2890 cup = &cdies[i];
2891 ret = dwarf_elf_init(elf, DW_DLC_READ, NULL, NULL,
2892 &cup->cu_dwarf, &derr);
2893 if (ret != 0) {
2894 ctf_free(cdies, sizeof (ctf_cu_t) * ndies);
2895 (void) snprintf(errmsg, errlen,
2896 "failed to initialize DWARF: %s\n",
2897 dwarf_errmsg(derr));
2898 *errp = ECTF_CONVBKERR;
2899 return (CTF_CONV_ERROR);
2900 }
2901
2902 ret = ctf_dwarf_init_die(fd, elf, &cdies[i], i, errmsg, errlen);
2903 if (ret != 0) {
2904 *errp = ret;
2905 goto out;
2906 }
2907 cup->cu_doweaks = ndies > 1 ? B_FALSE : B_TRUE;
2908 }
2909
2910 ctf_dprintf("found %d DWARF die(s)\n", ndies);
2911
2912 /*
2913 * If we only have one compilation unit, there's no reason to use
2914 * multiple threads, even if the user requested them. After all, they
2915 * just gave us an upper bound.
2916 */
2917 if (ndies == 1)
2918 nthrs = 1;
2919
2920 if (workq_init(&wqp, nthrs) == -1) {
2921 *errp = errno;
2922 goto out;
2923 }
2924
2925 for (i = 0; i < ndies; i++) {
2926 cup = &cdies[i];
2927 ctf_dprintf("adding die %s: %p, %x %x\n", cup->cu_name,
2928 cup->cu_cu, cup->cu_cuoff, cup->cu_maxoff);
2929 if (workq_add(wqp, cup) == -1) {
2930 *errp = errno;
2931 goto out;
2932 }
2933 }
2934
2935 ret = workq_work(wqp, ctf_dwarf_convert_one, NULL, errp);
2936 if (ret == WORKQ_ERROR) {
2937 *errp = errno;
2938 goto out;
2939 } else if (ret == WORKQ_UERROR) {
2940 ctf_dprintf("internal convert failed: %s\n",
2941 ctf_errmsg(*errp));
2942 goto out;
2943 }
2944
2945 ctf_dprintf("Determining next phase: have %d dies\n", ndies);
2946 if (ndies != 1) {
2947 ctf_merge_t *cmp;
2948
2949 cmp = ctf_merge_init(fd, &ret);
2950 if (cmp == NULL) {
2951 *errp = ret;
2952 goto out;
2953 }
2954
2955 ctf_dprintf("setting threads\n");
2956 if ((ret = ctf_merge_set_nthreads(cmp, nthrs)) != 0) {
2957 ctf_merge_fini(cmp);
2958 *errp = ret;
2959 goto out;
2960 }
2961
2962 ctf_dprintf("adding dies\n");
2963 for (i = 0; i < ndies; i++) {
2964 cup = &cdies[i];
2965 if ((ret = ctf_merge_add(cmp, cup->cu_ctfp)) != 0) {
2966 ctf_merge_fini(cmp);
2967 *errp = ret;
2968 goto out;
2969 }
2970 }
2971
2972 ctf_dprintf("performing merge\n");
2973 ret = ctf_merge_merge(cmp, fpp);
2974 if (ret != 0) {
2975 ctf_dprintf("failed merge!\n");
2976 *fpp = NULL;
2977 ctf_merge_fini(cmp);
2978 *errp = ret;
2979 goto out;
2980 }
2981 ctf_merge_fini(cmp);
2982 *errp = 0;
2983 ctf_dprintf("successfully converted!\n");
2984 } else {
2985 *errp = 0;
2986 *fpp = cdies->cu_ctfp;
2987 cdies->cu_ctfp = NULL;
2988 ctf_dprintf("successfully converted!\n");
2989 }
2990
2991 out:
2992 workq_fini(wqp);
2993 ctf_dwarf_free_dies(cdies, ndies);
2994 return (*fpp != NULL ? CTF_CONV_SUCCESS : CTF_CONV_ERROR);
2995 }
2996