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