xref: /openbsd/usr.bin/ctfconv/itype.h (revision ad9a875c)
1 /*	$OpenBSD: itype.h,v 1.5 2019/11/11 19:10:35 mpi Exp $ */
2 
3 /*
4  * Copyright (c) 2016-2017 Martin Pieuchot
5  * Copyright (c) 2016 Jasper Lievisse Adriaanse <jasper@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef _ITTYPE_H_
21 #define _ITTYPE_H_
22 
23 #define ITNAME_MAX	128
24 
25 struct imember;
26 struct itref;
27 
28 /*
29  * Internal type representation.
30  *
31  * Some bits of DWARF that we want to keep around to resolve types and
32  * variables to their intrinsics.
33  */
34 struct itype {
35 	TAILQ_ENTRY(itype)	 it_next;   /* itype: global queue of types */
36 	TAILQ_ENTRY(itype)	 it_symb;   /* itype: global queue of symbol */
37 	RB_ENTRY(itype)		 it_node;   /* itype: per-type tree of types */
38 
39 	SIMPLEQ_HEAD(, itref)	 it_refs;   /* itype: backpointing refs */
40 
41 	TAILQ_HEAD(, imember)	 it_members;/* itype: members of struct/union */
42 
43 	size_t			 it_off;    /* DWARF: matching .abbrev offset */
44 	uint64_t		 it_ref;    /* DWARF: CU offset of ref. type */
45 
46 	struct itype		*it_refp;   /* itype: resolved type */
47 
48 	char			 it_name[ITNAME_MAX];/* CTF: type name */
49 	uint32_t		 it_size;   /* CTF: size in byte or bits */
50 	uint32_t		 it_nelems; /* CTF: # of members or arguments */
51 	uint16_t		 it_enc;    /* CTF: base type encoding */
52 	uint16_t		 it_idx;    /* CTF: generated type ID */
53 	uint16_t		 it_type;   /* CTF: type */
54 	uint8_t			 __pad[2];
55 
56 	unsigned int		 it_flags;  /* itype: parser flags */
57 #define	ITF_UNRES		 0x01	    /* needs to be resolved */
58 #define	ITF_UNRES_MEMB		 0x02	    /* members need to be resolved */
59 #define	ITF_FUNC		 0x04	    /* is a function */
60 #define	ITF_OBJ			 0x08	    /* is an object */
61 #define	ITF_FORWARD		 0x10	    /* is a forward declaration */
62 #define	ITF_INSERTED		 0x20	    /* already found/inserted */
63 #define	ITF_USED		 0x40	    /* referenced in the current CU */
64 #define	ITF_ANON		 0x80	    /* type without name */
65 #define	ITF_MASK		(ITF_INSERTED|ITF_USED)
66 };
67 
68 /*
69  * Member for types with a variable length (struct, array, etc).
70  */
71 struct imember {
72 	TAILQ_ENTRY(imember)	 im_next;
73 	char			 im_name[ITNAME_MAX]; /* struct field name */
74 	size_t			 im_ref;    /* CU offset of the field type */
75 	size_t			 im_off;    /* field offset in struct/union */
76 	struct itype		*im_refp;   /* resolved CTF type */
77 	unsigned int		 im_flags;  /* parser flags */
78 #define	IMF_ANON		 0x01	    /* member without name */
79 };
80 
81 /*
82  * Used to build a list of backpointing references to speed up
83  * merging duplicated types.
84  */
85 struct itref {
86 	SIMPLEQ_ENTRY(itref)	 ir_next;
87 	struct itype		*ir_itp;
88 };
89 
90 TAILQ_HEAD(itype_queue, itype);
91 RB_HEAD(isymb_tree, itype);
92 
93 /* lists of types, functions & data objects */
94 extern struct itype_queue itypeq, ifuncq, iobjq;
95 extern struct isymb_tree isymbt;	    /* tree of symbols */
96 extern uint16_t tidx;		    	    /* type index */
97 extern uint16_t long_tidx;		    /* type ID for "long" */
98 
99 RB_PROTOTYPE(isymb_tree, itype, it_node, it_name_cmp);
100 
101 struct itype *it_dup(struct itype *);
102 const char *it_name(struct itype *);
103 const char *im_name(struct imember *);
104 
105 #endif /*_ITTYPE_H_ */
106