File: ctf.h

package info (click to toggle)
dwarves-dfsg 1.12-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 812 kB
  • sloc: ansic: 14,573; python: 903; makefile: 36
file content (154 lines) | stat: -rw-r--r-- 4,436 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef _CTF_H
#define _CTF_H

#include <stdint.h>

struct ctf_header {
	uint16_t	ctf_magic;	/* Header magic value            */
#define CTF_MAGIC	0xcff1
#define CTF_MAGIC_SWAP	0xf1cf

	uint8_t		ctf_version;	/* Header version                */
#define CTF_VERSION	2

	uint8_t		ctf_flags;	/* Header flags                  */
#define CTF_FLAGS_COMPR	0x01

	uint32_t	ctf_parent_label; /* Label of parent CTF object  */
	uint32_t	ctf_parent_name;  /* Name of parent CTF object   */

	/* All offsets are in bytes are relative to the end of
	 * this header.
	 */
	uint32_t	ctf_label_off;	/* Offset of label section       */
	uint32_t	ctf_object_off;	/* Offset of data object section */
	uint32_t	ctf_func_off;	/* Offset of function section    */
	uint32_t	ctf_type_off;	/* Offset of type section        */
	uint32_t	ctf_str_off;	/* Offset of string section      */
	uint32_t	ctf_str_len;	/* Length of string section      */
};

#define CTF_REF_OFFSET(REF)	((REF) & 0x7fffffff)
#define CTF_REF_TBL_ID(REF)	(((REF) >> 31) & 0x1)
#define CTF_STR_TBL_ID_0	0
#define CTF_STR_TBL_ID_1	1

#define CTF_REF_ENCODE(TBL, OFF) (((TBL) << 31) | (OFF))

struct ctf_label_ent {
	uint32_t	ctf_label_ref;
	uint32_t	ctf_type_index;
};

/* Types are encoded with ctf_short_type so long as the ctf_size
 * field can be fully represented in a uint16_t.  If not, then
 * the ctf_size is given the value 0xffff and ctf_full_type is
 * used.
 */
struct ctf_short_type {
	uint32_t		ctf_name;
	uint16_t		ctf_info;
	union {
		uint16_t	ctf_size;
		uint16_t	ctf_type;
	};
};

struct ctf_full_type {
	struct ctf_short_type	base;
	uint32_t		ctf_size_high;
	uint32_t		ctf_size_low;
};

#define CTF_GET_KIND(VAL)	(((VAL) >> 11) & 0x1f)
#define CTF_GET_VLEN(VAL)	((VAL) & 0x3ff)
#define CTF_ISROOT(VAL)		(((VAL) & 0x400) != 0)

#define CTF_INFO_ENCODE(KIND, VLEN, ISROOT) \
	(((ISROOT) ? 0x400 : 0) | ((KIND) << 11) | (VLEN))

#define CTF_TYPE_KIND_UNKN	0	/* Unknown	*/
#define CTF_TYPE_KIND_INT	1	/* Integer	*/
#define CTF_TYPE_KIND_FLT	2	/* Float	*/
#define CTF_TYPE_KIND_PTR	3	/* Pointer	*/
#define CTF_TYPE_KIND_ARR	4	/* Array	*/
#define CTF_TYPE_KIND_FUNC	5	/* Function	*/
#define CTF_TYPE_KIND_STR	6	/* Struct	*/
#define CTF_TYPE_KIND_UNION	7	/* Union	*/
#define CTF_TYPE_KIND_ENUM	8	/* Enumeration	*/
#define CTF_TYPE_KIND_FWD	9	/* Forward	*/
#define CTF_TYPE_KIND_TYPDEF	10	/* Typedef	*/
#define CTF_TYPE_KIND_VOLATILE	11	/* Volatile	*/
#define CTF_TYPE_KIND_CONST	12	/* Const	*/
#define CTF_TYPE_KIND_RESTRICT	13	/* Restrict	*/
#define CTF_TYPE_KIND_MAX	31

#define CTF_TYPE_INT_ATTRS(VAL)		((VAL) >> 24)
#define CTF_TYPE_INT_OFFSET(VAL)	(((VAL) >> 16) & 0xff)
#define CTF_TYPE_INT_BITS(VAL)		((VAL) & 0xffff)

#define CTF_TYPE_INT_ENCODE(ATTRS, OFF, BITS) \
	(((ATTRS) << 24) | ((OFF) << 16) | (BITS))

/* Integer type attributes */
#define CTF_TYPE_INT_SIGNED	0x1
#define CTF_TYPE_INT_CHAR	0x2
#define CTF_TYPE_INT_BOOL	0x4
#define CTF_TYPE_INT_VARARGS	0x8

#define CTF_TYPE_FP_ATTRS(VAL)		((VAL) >> 24)
#define CTF_TYPE_FP_OFFSET(VAL)		(((VAL) >> 16) & 0xff)
#define CTF_TYPE_FP_BITS(VAL)		((VAL) & 0xffff)

#define CTF_TYPE_FP_ENCODE(ATTRS, OFF, BITS) \
	(((ATTRS) << 24) | ((OFF) << 16) | (BITS))

/* Possible values for the float type attribute field */
#define CTF_TYPE_FP_SINGLE	1
#define CTF_TYPE_FP_DOUBLE	2
#define CTF_TYPE_FP_CMPLX	3
#define CTF_TYPE_FP_CMPLX_DBL	4
#define CTF_TYPE_FP_CMPLX_LDBL	5
#define CTF_TYPE_FP_LDBL	6
#define CTF_TYPE_FP_INTVL	7
#define CTF_TYPE_FP_INTVL_DBL	8
#define CTF_TYPE_FP_INTVL_LDBL	9
#define CTF_TYPE_FP_IMGRY	10
#define CTF_TYPE_FP_IMGRY_DBL	11
#define CTF_TYPE_FP_IMGRY_LDBL	12
#define CTF_TYPE_FP_MAX		12

struct ctf_enum {
	uint32_t	ctf_enum_name;
	uint32_t	ctf_enum_val;
};

struct ctf_array {
	uint16_t	ctf_array_type;
	uint16_t	ctf_array_index_type;
	uint32_t	ctf_array_nelems;
};

/* Struct members are encoded with either ctf_short_member or
 * ctf_full_member, depending upon the 'size' of the struct or
 * union being defined.  If it is less than CTF_SHORT_MEMBER_LIMIT
 * then ctf_short_member objects are used to encode, else
 * ctf_full_member is used.
 */
#define CTF_SHORT_MEMBER_LIMIT	8192

struct ctf_short_member {
	uint32_t	ctf_member_name;
	uint16_t	ctf_member_type;
	uint16_t	ctf_member_offset;
};

struct ctf_full_member {
	uint32_t	ctf_member_name;
	uint16_t	ctf_member_type;
	uint16_t	ctf_member_unused;
	uint32_t	ctf_member_offset_high;
	uint32_t	ctf_member_offset_low;
};

#endif /* _CTF_H */