xref: /illumos-gate/usr/src/tools/smatch/src/target.h (revision c85f09cc)
1 #ifndef TARGET_H
2 #define TARGET_H
3 
4 extern struct symbol *size_t_ctype;
5 extern struct symbol *ssize_t_ctype;
6 extern struct symbol *intmax_ctype;
7 extern struct symbol *uintmax_ctype;
8 extern struct symbol *int64_ctype;
9 extern struct symbol *uint64_ctype;
10 extern struct symbol *int32_ctype;
11 extern struct symbol *uint32_ctype;
12 extern struct symbol *wchar_ctype;
13 extern struct symbol *wint_ctype;
14 
15 /*
16  * For "__attribute__((aligned))"
17  */
18 extern int max_alignment;
19 
20 /*
21  * Integer data types
22  */
23 extern int bits_in_bool;
24 extern int bits_in_char;
25 extern int bits_in_short;
26 extern int bits_in_int;
27 extern int bits_in_long;
28 extern int bits_in_longlong;
29 extern int bits_in_longlonglong;
30 
31 extern int max_int_alignment;
32 
33 /*
34  * Floating point data types
35  */
36 extern int bits_in_float;
37 extern int bits_in_double;
38 extern int bits_in_longdouble;
39 
40 extern int max_fp_alignment;
41 
42 /*
43  * Pointer data type
44  */
45 extern int bits_in_pointer;
46 extern int pointer_alignment;
47 
48 /*
49  * Enum data types
50  */
51 extern int bits_in_enum;
52 extern int enum_alignment;
53 
54 /*
55  * Helper functions for converting bits to bytes and vice versa.
56  */
57 
bits_to_bytes(int bits)58 static inline int bits_to_bytes(int bits)
59 {
60 	return bits >= 0 ? (bits + bits_in_char - 1) / bits_in_char : -1;
61 }
62 
bytes_to_bits(int bytes)63 static inline int bytes_to_bits(int bytes)
64 {
65 	return bytes * bits_in_char;
66 }
67 
array_element_offset(unsigned long base_bits,int idx)68 static inline unsigned long array_element_offset(unsigned long base_bits, int idx)
69 {
70 	int fragment = base_bits % bits_in_char;
71 	if (fragment)
72 		base_bits += bits_in_char - fragment;
73 	return base_bits * idx;
74 }
75 
76 #endif
77