xref: /linux/scripts/gendwarfksyms/dwarf.c (revision 8630c59e99363c4b655788fd01134aef9bcd9264)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2024 Google LLC
4  */
5 
6 #define _GNU_SOURCE
7 #include <assert.h>
8 #include <inttypes.h>
9 #include <stdarg.h>
10 #include "gendwarfksyms.h"
11 
12 /* See get_union_kabi_status */
13 #define KABI_PREFIX "__kabi_"
14 #define KABI_PREFIX_LEN (sizeof(KABI_PREFIX) - 1)
15 #define KABI_RESERVED_PREFIX "reserved"
16 #define KABI_RESERVED_PREFIX_LEN (sizeof(KABI_RESERVED_PREFIX) - 1)
17 #define KABI_RENAMED_PREFIX "renamed"
18 #define KABI_RENAMED_PREFIX_LEN (sizeof(KABI_RENAMED_PREFIX) - 1)
19 #define KABI_IGNORED_PREFIX "ignored"
20 #define KABI_IGNORED_PREFIX_LEN (sizeof(KABI_IGNORED_PREFIX) - 1)
21 
is_kabi_prefix(const char * name)22 static inline bool is_kabi_prefix(const char *name)
23 {
24 	return name && !strncmp(name, KABI_PREFIX, KABI_PREFIX_LEN);
25 }
26 
27 enum kabi_status {
28 	/* >0 to stop DIE processing */
29 	KABI_NORMAL = 1,
30 	KABI_RESERVED,
31 	KABI_IGNORED,
32 };
33 
34 static bool do_linebreak;
35 static int indentation_level;
36 
37 /* Line breaks and indentation for pretty-printing */
process_linebreak(struct die * cache,int n)38 static void process_linebreak(struct die *cache, int n)
39 {
40 	indentation_level += n;
41 	do_linebreak = true;
42 	die_map_add_linebreak(cache, n);
43 }
44 
45 #define DEFINE_GET_ATTR(attr, type)                                    \
46 	static bool get_##attr##_attr(Dwarf_Die *die, unsigned int id, \
47 				      type *value)                     \
48 	{                                                              \
49 		Dwarf_Attribute da;                                    \
50 		return dwarf_attr(die, id, &da) &&                     \
51 		       !dwarf_form##attr(&da, value);                  \
52 	}
53 
DEFINE_GET_ATTR(flag,bool)54 DEFINE_GET_ATTR(flag, bool)
55 DEFINE_GET_ATTR(udata, Dwarf_Word)
56 
57 static bool get_ref_die_attr(Dwarf_Die *die, unsigned int id, Dwarf_Die *value)
58 {
59 	Dwarf_Attribute da;
60 
61 	/* dwarf_formref_die returns a pointer instead of an error value. */
62 	return dwarf_attr(die, id, &da) && dwarf_formref_die(&da, value);
63 }
64 
65 #define DEFINE_GET_STRING_ATTR(attr)                         \
66 	static const char *get_##attr##_attr(Dwarf_Die *die) \
67 	{                                                    \
68 		Dwarf_Attribute da;                          \
69 		if (dwarf_attr(die, DW_AT_##attr, &da))      \
70 			return dwarf_formstring(&da);        \
71 		return NULL;                                 \
72 	}
73 
74 DEFINE_GET_STRING_ATTR(name)
DEFINE_GET_STRING_ATTR(linkage_name)75 DEFINE_GET_STRING_ATTR(linkage_name)
76 
77 static const char *get_symbol_name(Dwarf_Die *die)
78 {
79 	const char *name;
80 
81 	/* rustc uses DW_AT_linkage_name for exported symbols */
82 	name = get_linkage_name_attr(die);
83 	if (!name)
84 		name = get_name_attr(die);
85 
86 	return name;
87 }
88 
match_export_symbol(struct state * state,Dwarf_Die * die)89 static bool match_export_symbol(struct state *state, Dwarf_Die *die)
90 {
91 	Dwarf_Die *source = die;
92 	Dwarf_Die origin;
93 
94 	/* If the DIE has an abstract origin, use it for type information. */
95 	if (get_ref_die_attr(die, DW_AT_abstract_origin, &origin))
96 		source = &origin;
97 
98 	state->sym = symbol_get(get_symbol_name(die));
99 
100 	/* Look up using the origin name if there are no matches. */
101 	if (!state->sym && source != die)
102 		state->sym = symbol_get(get_symbol_name(source));
103 
104 	state->die = *source;
105 	return !!state->sym;
106 }
107 
108 /* DW_AT_decl_file -> struct srcfile */
109 static struct cache srcfile_cache;
110 
is_definition_private(Dwarf_Die * die)111 static bool is_definition_private(Dwarf_Die *die)
112 {
113 	Dwarf_Word filenum;
114 	Dwarf_Files *files;
115 	Dwarf_Die cudie;
116 	const char *s;
117 	int res;
118 
119 	/*
120 	 * Definitions in .c files cannot change the public ABI,
121 	 * so consider them private.
122 	 */
123 	if (!get_udata_attr(die, DW_AT_decl_file, &filenum))
124 		return false;
125 
126 	res = cache_get(&srcfile_cache, filenum);
127 	if (res >= 0)
128 		return !!res;
129 
130 	if (!dwarf_cu_die(die->cu, &cudie, NULL, NULL, NULL, NULL, NULL, NULL))
131 		error("dwarf_cu_die failed: '%s'", dwarf_errmsg(-1));
132 
133 	if (dwarf_getsrcfiles(&cudie, &files, NULL))
134 		error("dwarf_getsrcfiles failed: '%s'", dwarf_errmsg(-1));
135 
136 	s = dwarf_filesrc(files, filenum, NULL, NULL);
137 	if (!s)
138 		error("dwarf_filesrc failed: '%s'", dwarf_errmsg(-1));
139 
140 	s = strrchr(s, '.');
141 	res = s && !strcmp(s, ".c");
142 	cache_set(&srcfile_cache, filenum, res);
143 
144 	return !!res;
145 }
146 
is_kabi_definition(struct die * cache,Dwarf_Die * die)147 static bool is_kabi_definition(struct die *cache, Dwarf_Die *die)
148 {
149 	bool value;
150 
151 	if (get_flag_attr(die, DW_AT_declaration, &value) && value)
152 		return false;
153 
154 	if (kabi_is_declonly(cache->fqn))
155 		return false;
156 
157 	return !is_definition_private(die);
158 }
159 
160 /*
161  * Type string processing
162  */
process(struct die * cache,const char * s)163 static void process(struct die *cache, const char *s)
164 {
165 	s = s ?: "<null>";
166 
167 	if (dump_dies && do_linebreak) {
168 		fputs("\n", stderr);
169 		for (int i = 0; i < indentation_level; i++)
170 			fputs("  ", stderr);
171 		do_linebreak = false;
172 	}
173 	if (dump_dies)
174 		fputs(s, stderr);
175 
176 	if (cache)
177 		die_debug_r("cache %p string '%s'", cache, s);
178 	die_map_add_string(cache, s);
179 }
180 
181 #define MAX_FMT_BUFFER_SIZE 128
182 
process_fmt(struct die * cache,const char * fmt,...)183 static void process_fmt(struct die *cache, const char *fmt, ...)
184 {
185 	char buf[MAX_FMT_BUFFER_SIZE];
186 	va_list args;
187 
188 	va_start(args, fmt);
189 
190 	if (checkp(vsnprintf(buf, sizeof(buf), fmt, args)) >= sizeof(buf))
191 		error("vsnprintf overflow: increase MAX_FMT_BUFFER_SIZE");
192 
193 	process(cache, buf);
194 	va_end(args);
195 }
196 
update_fqn(struct die * cache,Dwarf_Die * die)197 static void update_fqn(struct die *cache, Dwarf_Die *die)
198 {
199 	struct die *fqn;
200 
201 	if (!cache->fqn) {
202 		if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &fqn) &&
203 		    *fqn->fqn)
204 			cache->fqn = xstrdup(fqn->fqn);
205 		else
206 			cache->fqn = "";
207 	}
208 }
209 
process_fqn(struct die * cache,Dwarf_Die * die)210 static void process_fqn(struct die *cache, Dwarf_Die *die)
211 {
212 	update_fqn(cache, die);
213 	if (*cache->fqn)
214 		process(cache, " ");
215 	process(cache, cache->fqn);
216 }
217 
218 #define DEFINE_PROCESS_UDATA_ATTRIBUTE(attribute)                          \
219 	static void process_##attribute##_attr(struct die *cache,          \
220 					       Dwarf_Die *die)             \
221 	{                                                                  \
222 		Dwarf_Word value;                                          \
223 		if (get_udata_attr(die, DW_AT_##attribute, &value))        \
224 			process_fmt(cache, " " #attribute "(%" PRIu64 ")", \
225 				    value);                                \
226 	}
227 
228 DEFINE_PROCESS_UDATA_ATTRIBUTE(accessibility)
DEFINE_PROCESS_UDATA_ATTRIBUTE(alignment)229 DEFINE_PROCESS_UDATA_ATTRIBUTE(alignment)
230 DEFINE_PROCESS_UDATA_ATTRIBUTE(bit_size)
231 DEFINE_PROCESS_UDATA_ATTRIBUTE(encoding)
232 DEFINE_PROCESS_UDATA_ATTRIBUTE(data_bit_offset)
233 DEFINE_PROCESS_UDATA_ATTRIBUTE(data_member_location)
234 DEFINE_PROCESS_UDATA_ATTRIBUTE(discr_value)
235 
236 static void process_byte_size_attr(struct die *cache, Dwarf_Die *die)
237 {
238 	Dwarf_Word value;
239 	unsigned long override;
240 
241 	if (get_udata_attr(die, DW_AT_byte_size, &value)) {
242 		if (stable && kabi_get_byte_size(cache->fqn, &override))
243 			value = override;
244 
245 		process_fmt(cache, " byte_size(%" PRIu64 ")", value);
246 	}
247 }
248 
249 /* Match functions -- die_match_callback_t */
250 #define DEFINE_MATCH(type)                                     \
251 	static bool match_##type##_type(Dwarf_Die *die)        \
252 	{                                                      \
253 		return dwarf_tag(die) == DW_TAG_##type##_type; \
254 	}
255 
256 DEFINE_MATCH(enumerator)
DEFINE_MATCH(formal_parameter)257 DEFINE_MATCH(formal_parameter)
258 DEFINE_MATCH(member)
259 DEFINE_MATCH(subrange)
260 
261 bool match_all(Dwarf_Die *die)
262 {
263 	return true;
264 }
265 
process_die_container(struct state * state,struct die * cache,Dwarf_Die * die,die_callback_t func,die_match_callback_t match)266 int process_die_container(struct state *state, struct die *cache,
267 			  Dwarf_Die *die, die_callback_t func,
268 			  die_match_callback_t match)
269 {
270 	Dwarf_Die current;
271 	int res;
272 
273 	/* Track the first item in lists. */
274 	if (state)
275 		state->first_list_item = true;
276 
277 	res = checkp(dwarf_child(die, &current));
278 	while (!res) {
279 		if (match(&current)) {
280 			/* <0 = error, 0 = continue, >0 = stop */
281 			res = checkp(func(state, cache, &current));
282 			if (res)
283 				goto out;
284 		}
285 
286 		res = checkp(dwarf_siblingof(&current, &current));
287 	}
288 
289 	res = 0;
290 out:
291 	if (state)
292 		state->first_list_item = false;
293 
294 	return res;
295 }
296 
297 static int process_type(struct state *state, struct die *parent,
298 			Dwarf_Die *die);
299 
process_type_attr(struct state * state,struct die * cache,Dwarf_Die * die)300 static void process_type_attr(struct state *state, struct die *cache,
301 			      Dwarf_Die *die)
302 {
303 	Dwarf_Die type;
304 
305 	if (get_ref_die_attr(die, DW_AT_type, &type)) {
306 		check(process_type(state, cache, &type));
307 		return;
308 	}
309 
310 	/* Compilers can omit DW_AT_type -- print out 'void' to clarify */
311 	process(cache, "base_type void");
312 }
313 
process_list_comma(struct state * state,struct die * cache)314 static void process_list_comma(struct state *state, struct die *cache)
315 {
316 	if (state->first_list_item) {
317 		state->first_list_item = false;
318 	} else {
319 		process(cache, " ,");
320 		process_linebreak(cache, 0);
321 	}
322 }
323 
324 /* Comma-separated with DW_AT_type */
__process_list_type(struct state * state,struct die * cache,Dwarf_Die * die,const char * type)325 static void __process_list_type(struct state *state, struct die *cache,
326 				Dwarf_Die *die, const char *type)
327 {
328 	const char *name = get_name_attr(die);
329 
330 	if (stable) {
331 		if (is_kabi_prefix(name))
332 			name = NULL;
333 		state->kabi.orig_name = NULL;
334 	}
335 
336 	process_list_comma(state, cache);
337 	process(cache, type);
338 	process_type_attr(state, cache, die);
339 
340 	if (stable && state->kabi.orig_name)
341 		name = state->kabi.orig_name;
342 	if (name) {
343 		process(cache, " ");
344 		process(cache, name);
345 	}
346 
347 	process_accessibility_attr(cache, die);
348 	process_bit_size_attr(cache, die);
349 	process_data_bit_offset_attr(cache, die);
350 	process_data_member_location_attr(cache, die);
351 }
352 
353 #define DEFINE_PROCESS_LIST_TYPE(type)                                       \
354 	static void process_##type##_type(struct state *state,               \
355 					  struct die *cache, Dwarf_Die *die) \
356 	{                                                                    \
357 		__process_list_type(state, cache, die, #type " ");           \
358 	}
359 
360 DEFINE_PROCESS_LIST_TYPE(formal_parameter)
DEFINE_PROCESS_LIST_TYPE(member)361 DEFINE_PROCESS_LIST_TYPE(member)
362 
363 /* Container types with DW_AT_type */
364 static void __process_type(struct state *state, struct die *cache,
365 			   Dwarf_Die *die, const char *type)
366 {
367 	process(cache, type);
368 	process_fqn(cache, die);
369 	process(cache, " {");
370 	process_linebreak(cache, 1);
371 	process_type_attr(state, cache, die);
372 	process_linebreak(cache, -1);
373 	process(cache, "}");
374 	process_byte_size_attr(cache, die);
375 	process_alignment_attr(cache, die);
376 }
377 
378 #define DEFINE_PROCESS_TYPE(type)                                            \
379 	static void process_##type##_type(struct state *state,               \
380 					  struct die *cache, Dwarf_Die *die) \
381 	{                                                                    \
382 		__process_type(state, cache, die, #type "_type");            \
383 	}
384 
385 DEFINE_PROCESS_TYPE(atomic)
DEFINE_PROCESS_TYPE(const)386 DEFINE_PROCESS_TYPE(const)
387 DEFINE_PROCESS_TYPE(immutable)
388 DEFINE_PROCESS_TYPE(packed)
389 DEFINE_PROCESS_TYPE(pointer)
390 DEFINE_PROCESS_TYPE(reference)
391 DEFINE_PROCESS_TYPE(restrict)
392 DEFINE_PROCESS_TYPE(rvalue_reference)
393 DEFINE_PROCESS_TYPE(shared)
394 DEFINE_PROCESS_TYPE(template_type_parameter)
395 DEFINE_PROCESS_TYPE(volatile)
396 DEFINE_PROCESS_TYPE(typedef)
397 
398 static void process_subrange_type(struct state *state, struct die *cache,
399 				  Dwarf_Die *die)
400 {
401 	Dwarf_Word count = 0;
402 
403 	if (get_udata_attr(die, DW_AT_count, &count))
404 		process_fmt(cache, "[%" PRIu64 "]", count);
405 	else if (get_udata_attr(die, DW_AT_upper_bound, &count))
406 		process_fmt(cache, "[%" PRIu64 "]", count + 1);
407 	else
408 		process(cache, "[]");
409 }
410 
process_array_type(struct state * state,struct die * cache,Dwarf_Die * die)411 static void process_array_type(struct state *state, struct die *cache,
412 			       Dwarf_Die *die)
413 {
414 	process(cache, "array_type");
415 	/* Array size */
416 	check(process_die_container(state, cache, die, process_type,
417 				    match_subrange_type));
418 	process(cache, " {");
419 	process_linebreak(cache, 1);
420 	process_type_attr(state, cache, die);
421 	process_linebreak(cache, -1);
422 	process(cache, "}");
423 }
424 
__process_subroutine_type(struct state * state,struct die * cache,Dwarf_Die * die,const char * type)425 static void __process_subroutine_type(struct state *state, struct die *cache,
426 				      Dwarf_Die *die, const char *type)
427 {
428 	process(cache, type);
429 	process(cache, " (");
430 	process_linebreak(cache, 1);
431 	/* Parameters */
432 	check(process_die_container(state, cache, die, process_type,
433 				    match_formal_parameter_type));
434 	process_linebreak(cache, -1);
435 	process(cache, ")");
436 	process_linebreak(cache, 0);
437 	/* Return type */
438 	process(cache, "-> ");
439 	process_type_attr(state, cache, die);
440 }
441 
process_subroutine_type(struct state * state,struct die * cache,Dwarf_Die * die)442 static void process_subroutine_type(struct state *state, struct die *cache,
443 				    Dwarf_Die *die)
444 {
445 	__process_subroutine_type(state, cache, die, "subroutine_type");
446 }
447 
process_variant_type(struct state * state,struct die * cache,Dwarf_Die * die)448 static void process_variant_type(struct state *state, struct die *cache,
449 				 Dwarf_Die *die)
450 {
451 	process_list_comma(state, cache);
452 	process(cache, "variant {");
453 	process_linebreak(cache, 1);
454 	check(process_die_container(state, cache, die, process_type,
455 				    match_member_type));
456 	process_linebreak(cache, -1);
457 	process(cache, "}");
458 	process_discr_value_attr(cache, die);
459 }
460 
process_variant_part_type(struct state * state,struct die * cache,Dwarf_Die * die)461 static void process_variant_part_type(struct state *state, struct die *cache,
462 				      Dwarf_Die *die)
463 {
464 	process_list_comma(state, cache);
465 	process(cache, "variant_part {");
466 	process_linebreak(cache, 1);
467 	check(process_die_container(state, cache, die, process_type,
468 				    match_all));
469 	process_linebreak(cache, -1);
470 	process(cache, "}");
471 }
472 
get_kabi_status(Dwarf_Die * die,const char ** suffix)473 static int get_kabi_status(Dwarf_Die *die, const char **suffix)
474 {
475 	const char *name = get_name_attr(die);
476 
477 	if (suffix)
478 		*suffix = NULL;
479 
480 	if (is_kabi_prefix(name)) {
481 		name += KABI_PREFIX_LEN;
482 
483 		if (!strncmp(name, KABI_RESERVED_PREFIX,
484 			     KABI_RESERVED_PREFIX_LEN))
485 			return KABI_RESERVED;
486 		if (!strncmp(name, KABI_IGNORED_PREFIX,
487 			     KABI_IGNORED_PREFIX_LEN))
488 			return KABI_IGNORED;
489 
490 		if (!strncmp(name, KABI_RENAMED_PREFIX,
491 			     KABI_RENAMED_PREFIX_LEN)) {
492 			if (suffix) {
493 				name += KABI_RENAMED_PREFIX_LEN;
494 				*suffix = name;
495 			}
496 			return KABI_RESERVED;
497 		}
498 	}
499 
500 	return KABI_NORMAL;
501 }
502 
check_struct_member_kabi_status(struct state * state,struct die * __unused,Dwarf_Die * die)503 static int check_struct_member_kabi_status(struct state *state,
504 					   struct die *__unused, Dwarf_Die *die)
505 {
506 	int res;
507 
508 	assert(dwarf_tag(die) == DW_TAG_member_type);
509 
510 	/*
511 	 * If the union member is a struct, expect the __kabi field to
512 	 * be the first member of the structure, i.e..:
513 	 *
514 	 * union {
515 	 * 	type new_member;
516 	 * 	struct {
517 	 * 		type __kabi_field;
518 	 * 	}
519 	 * };
520 	 */
521 	res = get_kabi_status(die, &state->kabi.orig_name);
522 
523 	if (res == KABI_RESERVED &&
524 	    !get_ref_die_attr(die, DW_AT_type, &state->kabi.placeholder))
525 		error("structure member missing a type?");
526 
527 	return res;
528 }
529 
check_union_member_kabi_status(struct state * state,struct die * __unused,Dwarf_Die * die)530 static int check_union_member_kabi_status(struct state *state,
531 					  struct die *__unused, Dwarf_Die *die)
532 {
533 	Dwarf_Die type;
534 	int res;
535 
536 	assert(dwarf_tag(die) == DW_TAG_member_type);
537 
538 	if (!get_ref_die_attr(die, DW_AT_type, &type))
539 		error("union member missing a type?");
540 
541 	/*
542 	 * We expect a union with two members. Check if either of them
543 	 * has a __kabi name prefix, i.e.:
544 	 *
545 	 * union {
546 	 * 	...
547 	 * 	type memberN; // <- type, N = {0,1}
548 	 *	...
549 	 * };
550 	 *
551 	 * The member can also be a structure type, in which case we'll
552 	 * check the first structure member.
553 	 *
554 	 * In any case, stop processing after we've seen two members.
555 	 */
556 	res = get_kabi_status(die, &state->kabi.orig_name);
557 
558 	if (res == KABI_RESERVED)
559 		state->kabi.placeholder = type;
560 	if (res != KABI_NORMAL)
561 		return res;
562 
563 	if (dwarf_tag(&type) == DW_TAG_structure_type)
564 		res = checkp(process_die_container(
565 			state, NULL, &type, check_struct_member_kabi_status,
566 			match_member_type));
567 
568 	if (res <= KABI_NORMAL && ++state->kabi.members < 2)
569 		return 0; /* Continue */
570 
571 	return res;
572 }
573 
get_union_kabi_status(Dwarf_Die * die,Dwarf_Die * placeholder,const char ** orig_name)574 static int get_union_kabi_status(Dwarf_Die *die, Dwarf_Die *placeholder,
575 				 const char **orig_name)
576 {
577 	struct state state;
578 	int res;
579 
580 	if (!stable)
581 		return KABI_NORMAL;
582 
583 	/*
584 	 * To maintain a stable kABI, distributions may choose to reserve
585 	 * space in structs for later use by adding placeholder members,
586 	 * for example:
587 	 *
588 	 * struct s {
589 	 * 	u32 a;
590 	 *	// an 8-byte placeholder for future use
591 	 * 	u64 __kabi_reserved_0;
592 	 * };
593 	 *
594 	 * When the reserved member is taken into use, the type change
595 	 * would normally cause the symbol version to change as well, but
596 	 * if the replacement uses the following convention, gendwarfksyms
597 	 * continues to use the placeholder type for versioning instead,
598 	 * thus maintaining the same symbol version:
599 	 *
600 	 * struct s {
601 	 * 	u32 a;
602 	 *	union {
603 	 * 		// placeholder replaced with a new member `b`
604 	 * 		struct t b;
605 	 * 		struct {
606 	 * 			// the placeholder type that is still
607 	 *			// used for versioning
608 	 * 			u64 __kabi_reserved_0;
609 	 * 		};
610 	 * 	};
611 	 * };
612 	 *
613 	 * I.e., as long as the replaced member is in a union, and the
614 	 * placeholder has a __kabi_reserved name prefix, we'll continue
615 	 * to use the placeholder type (here u64) for version calculation
616 	 * instead of the union type.
617 	 *
618 	 * It's also possible to ignore new members from versioning if
619 	 * they've been added to alignment holes, for example, by
620 	 * including them in a union with another member that uses the
621 	 * __kabi_ignored name prefix:
622 	 *
623 	 * struct s {
624 	 * 	u32 a;
625 	 *	// an alignment hole is used to add `n`
626 	 * 	union {
627 	 * 		u32 n;
628 	 *		// hide the entire union member from versioning
629 	 * 		u8 __kabi_ignored_0;
630 	 * 	};
631 	 * 	u64 b;
632 	 * };
633 	 *
634 	 * Note that the user of this feature is responsible for ensuring
635 	 * that the structure actually remains ABI compatible.
636 	 */
637 	memset(&state.kabi, 0, sizeof(struct kabi_state));
638 
639 	res = checkp(process_die_container(&state, NULL, die,
640 					   check_union_member_kabi_status,
641 					   match_member_type));
642 
643 	if (res == KABI_RESERVED) {
644 		if (placeholder)
645 			*placeholder = state.kabi.placeholder;
646 		if (orig_name)
647 			*orig_name = state.kabi.orig_name;
648 	}
649 
650 	return res;
651 }
652 
is_kabi_ignored(Dwarf_Die * die)653 static bool is_kabi_ignored(Dwarf_Die *die)
654 {
655 	Dwarf_Die type;
656 
657 	if (!stable)
658 		return false;
659 
660 	if (!get_ref_die_attr(die, DW_AT_type, &type))
661 		error("member missing a type?");
662 
663 	return dwarf_tag(&type) == DW_TAG_union_type &&
664 	       checkp(get_union_kabi_status(&type, NULL, NULL)) == KABI_IGNORED;
665 }
666 
___process_structure_type(struct state * state,struct die * cache,Dwarf_Die * die)667 static int ___process_structure_type(struct state *state, struct die *cache,
668 				     Dwarf_Die *die)
669 {
670 	switch (dwarf_tag(die)) {
671 	case DW_TAG_member:
672 		if (is_kabi_ignored(die))
673 			return 0;
674 		return check(process_type(state, cache, die));
675 	case DW_TAG_variant_part:
676 		return check(process_type(state, cache, die));
677 	case DW_TAG_class_type:
678 	case DW_TAG_enumeration_type:
679 	case DW_TAG_structure_type:
680 	case DW_TAG_template_type_parameter:
681 	case DW_TAG_union_type:
682 	case DW_TAG_subprogram:
683 		/* Skip non-member types, including member functions */
684 		return 0;
685 	default:
686 		error("unexpected structure_type child: %x", dwarf_tag(die));
687 	}
688 }
689 
__process_structure_type(struct state * state,struct die * cache,Dwarf_Die * die,const char * type,die_callback_t process_func,die_match_callback_t match_func)690 static void __process_structure_type(struct state *state, struct die *cache,
691 				     Dwarf_Die *die, const char *type,
692 				     die_callback_t process_func,
693 				     die_match_callback_t match_func)
694 {
695 	bool expand;
696 
697 	process(cache, type);
698 	process_fqn(cache, die);
699 	process(cache, " {");
700 	process_linebreak(cache, 1);
701 
702 	expand = state->expand.expand && is_kabi_definition(cache, die);
703 
704 	if (expand) {
705 		state->expand.current_fqn = cache->fqn;
706 		check(process_die_container(state, cache, die, process_func,
707 					    match_func));
708 	}
709 
710 	process_linebreak(cache, -1);
711 	process(cache, "}");
712 
713 	if (expand) {
714 		process_byte_size_attr(cache, die);
715 		process_alignment_attr(cache, die);
716 	}
717 }
718 
719 #define DEFINE_PROCESS_STRUCTURE_TYPE(structure)                        \
720 	static void process_##structure##_type(                         \
721 		struct state *state, struct die *cache, Dwarf_Die *die) \
722 	{                                                               \
723 		__process_structure_type(state, cache, die,             \
724 					 #structure "_type",            \
725 					 ___process_structure_type,     \
726 					 match_all);                    \
727 	}
728 
729 DEFINE_PROCESS_STRUCTURE_TYPE(class)
DEFINE_PROCESS_STRUCTURE_TYPE(structure)730 DEFINE_PROCESS_STRUCTURE_TYPE(structure)
731 
732 static void process_union_type(struct state *state, struct die *cache,
733 			       Dwarf_Die *die)
734 {
735 	Dwarf_Die placeholder;
736 
737 	int res = checkp(get_union_kabi_status(die, &placeholder,
738 					       &state->kabi.orig_name));
739 
740 	if (res == KABI_RESERVED)
741 		check(process_type(state, cache, &placeholder));
742 	if (res > KABI_NORMAL)
743 		return;
744 
745 	__process_structure_type(state, cache, die, "union_type",
746 				 ___process_structure_type, match_all);
747 }
748 
process_enumerator_type(struct state * state,struct die * cache,Dwarf_Die * die)749 static void process_enumerator_type(struct state *state, struct die *cache,
750 				    Dwarf_Die *die)
751 {
752 	bool overridden = false;
753 	Dwarf_Word value;
754 
755 	if (stable) {
756 		/* Get the fqn before we process anything */
757 		update_fqn(cache, die);
758 
759 		if (kabi_is_enumerator_ignored(state->expand.current_fqn,
760 					       cache->fqn))
761 			return;
762 
763 		overridden = kabi_get_enumerator_value(
764 			state->expand.current_fqn, cache->fqn, &value);
765 	}
766 
767 	process_list_comma(state, cache);
768 	process(cache, "enumerator");
769 	process_fqn(cache, die);
770 
771 	if (overridden || get_udata_attr(die, DW_AT_const_value, &value)) {
772 		process(cache, " = ");
773 		process_fmt(cache, "%" PRIu64, value);
774 	}
775 }
776 
process_enumeration_type(struct state * state,struct die * cache,Dwarf_Die * die)777 static void process_enumeration_type(struct state *state, struct die *cache,
778 				     Dwarf_Die *die)
779 {
780 	__process_structure_type(state, cache, die, "enumeration_type",
781 				 process_type, match_enumerator_type);
782 }
783 
process_base_type(struct state * state,struct die * cache,Dwarf_Die * die)784 static void process_base_type(struct state *state, struct die *cache,
785 			      Dwarf_Die *die)
786 {
787 	process(cache, "base_type");
788 	process_fqn(cache, die);
789 	process_byte_size_attr(cache, die);
790 	process_encoding_attr(cache, die);
791 	process_alignment_attr(cache, die);
792 }
793 
process_unspecified_type(struct state * state,struct die * cache,Dwarf_Die * die)794 static void process_unspecified_type(struct state *state, struct die *cache,
795 				     Dwarf_Die *die)
796 {
797 	/*
798 	 * These can be emitted for stand-alone assembly code, which means we
799 	 * might run into them in vmlinux.o.
800 	 */
801 	process(cache, "unspecified_type");
802 }
803 
process_cached(struct state * state,struct die * cache,Dwarf_Die * die)804 static void process_cached(struct state *state, struct die *cache,
805 			   Dwarf_Die *die)
806 {
807 	struct die_fragment *df;
808 	Dwarf_Die child;
809 
810 	list_for_each_entry(df, &cache->fragments, list) {
811 		switch (df->type) {
812 		case FRAGMENT_STRING:
813 			die_debug_b("cache %p STRING '%s'", cache,
814 				    df->data.str);
815 			process(NULL, df->data.str);
816 			break;
817 		case FRAGMENT_LINEBREAK:
818 			process_linebreak(NULL, df->data.linebreak);
819 			break;
820 		case FRAGMENT_DIE:
821 			if (!dwarf_die_addr_die(dwarf_cu_getdwarf(die->cu),
822 						(void *)df->data.addr, &child))
823 				error("dwarf_die_addr_die failed");
824 			die_debug_b("cache %p DIE addr %" PRIxPTR " tag %x",
825 				    cache, df->data.addr, dwarf_tag(&child));
826 			check(process_type(state, NULL, &child));
827 			break;
828 		default:
829 			error("empty die_fragment");
830 		}
831 	}
832 }
833 
state_init(struct state * state)834 static void state_init(struct state *state)
835 {
836 	state->expand.expand = true;
837 	state->expand.current_fqn = NULL;
838 	cache_init(&state->expansion_cache);
839 }
840 
expansion_state_restore(struct expansion_state * state,struct expansion_state * saved)841 static void expansion_state_restore(struct expansion_state *state,
842 				    struct expansion_state *saved)
843 {
844 	state->expand = saved->expand;
845 	state->current_fqn = saved->current_fqn;
846 }
847 
expansion_state_save(struct expansion_state * state,struct expansion_state * saved)848 static void expansion_state_save(struct expansion_state *state,
849 				 struct expansion_state *saved)
850 {
851 	expansion_state_restore(saved, state);
852 }
853 
is_expanded_type(int tag)854 static bool is_expanded_type(int tag)
855 {
856 	return tag == DW_TAG_class_type || tag == DW_TAG_structure_type ||
857 	       tag == DW_TAG_union_type || tag == DW_TAG_enumeration_type;
858 }
859 
860 #define PROCESS_TYPE(type)                                \
861 	case DW_TAG_##type##_type:                        \
862 		process_##type##_type(state, cache, die); \
863 		break;
864 
process_type(struct state * state,struct die * parent,Dwarf_Die * die)865 static int process_type(struct state *state, struct die *parent, Dwarf_Die *die)
866 {
867 	enum die_state want_state = DIE_COMPLETE;
868 	struct die *cache;
869 	struct expansion_state saved;
870 	int tag = dwarf_tag(die);
871 
872 	expansion_state_save(&state->expand, &saved);
873 
874 	/*
875 	 * Structures and enumeration types are expanded only once per
876 	 * exported symbol. This is sufficient for detecting ABI changes
877 	 * within the structure.
878 	 */
879 	if (is_expanded_type(tag)) {
880 		if (cache_was_expanded(&state->expansion_cache, die->addr))
881 			state->expand.expand = false;
882 
883 		if (state->expand.expand)
884 			cache_mark_expanded(&state->expansion_cache, die->addr);
885 		else
886 			want_state = DIE_UNEXPANDED;
887 	}
888 
889 	/*
890 	 * If we have want_state already cached, use it instead of walking
891 	 * through DWARF.
892 	 */
893 	cache = die_map_get(die, want_state);
894 
895 	if (cache->state == want_state) {
896 		die_debug_g("cached addr %p tag %x -- %s", die->addr, tag,
897 			    die_state_name(cache->state));
898 
899 		process_cached(state, cache, die);
900 		die_map_add_die(parent, cache);
901 
902 		expansion_state_restore(&state->expand, &saved);
903 		return 0;
904 	}
905 
906 	die_debug_g("addr %p tag %x -- %s -> %s", die->addr, tag,
907 		    die_state_name(cache->state), die_state_name(want_state));
908 
909 	switch (tag) {
910 	/* Type modifiers */
911 	PROCESS_TYPE(atomic)
912 	PROCESS_TYPE(const)
913 	PROCESS_TYPE(immutable)
914 	PROCESS_TYPE(packed)
915 	PROCESS_TYPE(pointer)
916 	PROCESS_TYPE(reference)
917 	PROCESS_TYPE(restrict)
918 	PROCESS_TYPE(rvalue_reference)
919 	PROCESS_TYPE(shared)
920 	PROCESS_TYPE(volatile)
921 	/* Container types */
922 	PROCESS_TYPE(class)
923 	PROCESS_TYPE(structure)
924 	PROCESS_TYPE(union)
925 	PROCESS_TYPE(enumeration)
926 	/* Subtypes */
927 	PROCESS_TYPE(enumerator)
928 	PROCESS_TYPE(formal_parameter)
929 	PROCESS_TYPE(member)
930 	PROCESS_TYPE(subrange)
931 	PROCESS_TYPE(template_type_parameter)
932 	PROCESS_TYPE(variant)
933 	PROCESS_TYPE(variant_part)
934 	/* Other types */
935 	PROCESS_TYPE(array)
936 	PROCESS_TYPE(base)
937 	PROCESS_TYPE(subroutine)
938 	PROCESS_TYPE(typedef)
939 	PROCESS_TYPE(unspecified)
940 	default:
941 		error("unexpected type: %x", tag);
942 	}
943 
944 	die_debug_r("parent %p cache %p die addr %p tag %x", parent, cache,
945 		    die->addr, tag);
946 
947 	/* Update cache state and append to the parent (if any) */
948 	cache->tag = tag;
949 	cache->state = want_state;
950 	die_map_add_die(parent, cache);
951 
952 	expansion_state_restore(&state->expand, &saved);
953 	return 0;
954 }
955 
956 /*
957  * Exported symbol processing
958  */
get_symbol_cache(struct state * state,Dwarf_Die * die)959 static struct die *get_symbol_cache(struct state *state, Dwarf_Die *die)
960 {
961 	struct die *cache;
962 
963 	cache = die_map_get(die, DIE_SYMBOL);
964 
965 	if (cache->state != DIE_INCOMPLETE)
966 		return NULL; /* We already processed a symbol for this DIE */
967 
968 	cache->tag = dwarf_tag(die);
969 	return cache;
970 }
971 
process_symbol(struct state * state,Dwarf_Die * die,die_callback_t process_func)972 static void process_symbol(struct state *state, Dwarf_Die *die,
973 			   die_callback_t process_func)
974 {
975 	struct die *cache;
976 
977 	symbol_set_die(state->sym, die);
978 
979 	cache = get_symbol_cache(state, die);
980 	if (!cache)
981 		return;
982 
983 	debug("%s", state->sym->name);
984 	check(process_func(state, cache, die));
985 	cache->state = DIE_SYMBOL;
986 	if (dump_dies)
987 		fputs("\n", stderr);
988 }
989 
__process_subprogram(struct state * state,struct die * cache,Dwarf_Die * die)990 static int __process_subprogram(struct state *state, struct die *cache,
991 				Dwarf_Die *die)
992 {
993 	__process_subroutine_type(state, cache, die, "subprogram");
994 	return 0;
995 }
996 
process_subprogram(struct state * state,Dwarf_Die * die)997 static void process_subprogram(struct state *state, Dwarf_Die *die)
998 {
999 	process_symbol(state, die, __process_subprogram);
1000 }
1001 
__process_variable(struct state * state,struct die * cache,Dwarf_Die * die)1002 static int __process_variable(struct state *state, struct die *cache,
1003 			      Dwarf_Die *die)
1004 {
1005 	process(cache, "variable ");
1006 	process_type_attr(state, cache, die);
1007 	return 0;
1008 }
1009 
process_variable(struct state * state,Dwarf_Die * die)1010 static void process_variable(struct state *state, Dwarf_Die *die)
1011 {
1012 	process_symbol(state, die, __process_variable);
1013 }
1014 
save_symbol_ptr(struct state * state)1015 static void save_symbol_ptr(struct state *state)
1016 {
1017 	Dwarf_Die ptr_type;
1018 	Dwarf_Die type;
1019 
1020 	if (!get_ref_die_attr(&state->die, DW_AT_type, &ptr_type) ||
1021 	    dwarf_tag(&ptr_type) != DW_TAG_pointer_type)
1022 		error("%s must be a pointer type!",
1023 		      get_symbol_name(&state->die));
1024 
1025 	if (!get_ref_die_attr(&ptr_type, DW_AT_type, &type))
1026 		error("%s pointer missing a type attribute?",
1027 		      get_symbol_name(&state->die));
1028 
1029 	/*
1030 	 * Save the symbol pointer DIE in case the actual symbol is
1031 	 * missing from the DWARF. Clang, for example, intentionally
1032 	 * omits external symbols from the debugging information.
1033 	 */
1034 	if (dwarf_tag(&type) == DW_TAG_subroutine_type)
1035 		symbol_set_ptr(state->sym, &type);
1036 	else
1037 		symbol_set_ptr(state->sym, &ptr_type);
1038 }
1039 
process_exported_symbols(struct state * unused,struct die * cache,Dwarf_Die * die)1040 static int process_exported_symbols(struct state *unused, struct die *cache,
1041 				    Dwarf_Die *die)
1042 {
1043 	int tag = dwarf_tag(die);
1044 
1045 	switch (tag) {
1046 	/* Possible containers of exported symbols */
1047 	case DW_TAG_namespace:
1048 	case DW_TAG_class_type:
1049 	case DW_TAG_structure_type:
1050 		return check(process_die_container(
1051 			NULL, cache, die, process_exported_symbols, match_all));
1052 
1053 	/* Possible exported symbols */
1054 	case DW_TAG_subprogram:
1055 	case DW_TAG_variable: {
1056 		struct state state;
1057 
1058 		if (!match_export_symbol(&state, die))
1059 			return 0;
1060 
1061 		state_init(&state);
1062 
1063 		if (is_symbol_ptr(get_symbol_name(&state.die)))
1064 			save_symbol_ptr(&state);
1065 		else if (tag == DW_TAG_subprogram)
1066 			process_subprogram(&state, &state.die);
1067 		else
1068 			process_variable(&state, &state.die);
1069 
1070 		cache_free(&state.expansion_cache);
1071 		return 0;
1072 	}
1073 	default:
1074 		return 0;
1075 	}
1076 }
1077 
process_symbol_ptr(struct symbol * sym,void * arg)1078 static void process_symbol_ptr(struct symbol *sym, void *arg)
1079 {
1080 	struct state state;
1081 	Dwarf *dwarf = arg;
1082 
1083 	if (sym->state != SYMBOL_UNPROCESSED || !sym->ptr_die_addr)
1084 		return;
1085 
1086 	debug("%s", sym->name);
1087 	state_init(&state);
1088 	state.sym = sym;
1089 
1090 	if (!dwarf_die_addr_die(dwarf, (void *)sym->ptr_die_addr, &state.die))
1091 		error("dwarf_die_addr_die failed for symbol ptr: '%s'",
1092 		      sym->name);
1093 
1094 	if (dwarf_tag(&state.die) == DW_TAG_subroutine_type)
1095 		process_subprogram(&state, &state.die);
1096 	else
1097 		process_variable(&state, &state.die);
1098 
1099 	cache_free(&state.expansion_cache);
1100 }
1101 
resolve_fqns(struct state * parent,struct die * unused,Dwarf_Die * die)1102 static int resolve_fqns(struct state *parent, struct die *unused,
1103 			Dwarf_Die *die)
1104 {
1105 	struct state state;
1106 	struct die *cache;
1107 	const char *name;
1108 	bool use_prefix;
1109 	char *prefix = NULL;
1110 	char *fqn = "";
1111 	int tag;
1112 
1113 	if (!__die_map_get((uintptr_t)die->addr, DIE_FQN, &cache))
1114 		return 0;
1115 
1116 	tag = dwarf_tag(die);
1117 
1118 	/*
1119 	 * Only namespaces and structures need to pass a prefix to the next
1120 	 * scope.
1121 	 */
1122 	use_prefix = tag == DW_TAG_namespace || tag == DW_TAG_class_type ||
1123 		     tag == DW_TAG_structure_type;
1124 
1125 	state.expand.current_fqn = NULL;
1126 	name = get_name_attr(die);
1127 
1128 	if (parent && parent->expand.current_fqn && (use_prefix || name)) {
1129 		/*
1130 		 * The fqn for the current DIE, and if needed, a prefix for the
1131 		 * next scope.
1132 		 */
1133 		if (asprintf(&prefix, "%s::%s", parent->expand.current_fqn,
1134 			     name ? name : "<anonymous>") < 0)
1135 			error("asprintf failed");
1136 
1137 		if (use_prefix)
1138 			state.expand.current_fqn = prefix;
1139 
1140 		/*
1141 		 * Use fqn only if the DIE has a name. Otherwise fqn will
1142 		 * remain empty.
1143 		 */
1144 		if (name) {
1145 			fqn = prefix;
1146 			/* prefix will be freed by die_map. */
1147 			prefix = NULL;
1148 		}
1149 	} else if (name) {
1150 		/* No prefix from the previous scope. Use only the name. */
1151 		fqn = xstrdup(name);
1152 
1153 		if (use_prefix)
1154 			state.expand.current_fqn = fqn;
1155 	}
1156 
1157 	/* If the DIE has a non-empty name, cache it. */
1158 	if (*fqn) {
1159 		cache = die_map_get(die, DIE_FQN);
1160 		/* Move ownership of fqn to die_map. */
1161 		cache->fqn = fqn;
1162 		cache->state = DIE_FQN;
1163 	}
1164 
1165 	check(process_die_container(&state, NULL, die, resolve_fqns,
1166 				    match_all));
1167 
1168 	free(prefix);
1169 	return 0;
1170 }
1171 
process_cu(Dwarf_Die * cudie)1172 void process_cu(Dwarf_Die *cudie)
1173 {
1174 	check(process_die_container(NULL, NULL, cudie, resolve_fqns,
1175 				    match_all));
1176 
1177 	check(process_die_container(NULL, NULL, cudie, process_exported_symbols,
1178 				    match_all));
1179 
1180 	symbol_for_each(process_symbol_ptr, dwarf_cu_getdwarf(cudie->cu));
1181 
1182 	cache_free(&srcfile_cache);
1183 }
1184