1 /* 2 * This file is part of cparser. 3 * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de> 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation; either version 2 8 * of the License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 18 * 02111-1307, USA. 19 */ 20 #ifndef TYPE_H 21 #define TYPE_H 22 23 #include <stdio.h> 24 #include <stdbool.h> 25 #include "ast.h" 26 #include "symbol.h" 27 28 /** Type used to express sizes. */ 29 typedef unsigned long il_size_t; 30 typedef unsigned char il_alignment_t; 31 32 /* note that the constant values represent the rank of the types as defined 33 * in § 6.3.1 */ 34 typedef enum atomic_type_kind_t { 35 ATOMIC_TYPE_VOID = 1, 36 ATOMIC_TYPE_BOOL, 37 ATOMIC_TYPE_WCHAR_T, /* only used in C++, in C code wchar_t is a pp-macro */ 38 ATOMIC_TYPE_CHAR, 39 ATOMIC_TYPE_SCHAR, 40 ATOMIC_TYPE_UCHAR, 41 ATOMIC_TYPE_SHORT, 42 ATOMIC_TYPE_USHORT, 43 ATOMIC_TYPE_INT, 44 ATOMIC_TYPE_UINT, 45 ATOMIC_TYPE_LONG, 46 ATOMIC_TYPE_ULONG, 47 ATOMIC_TYPE_LONGLONG, 48 ATOMIC_TYPE_ULONGLONG, 49 ATOMIC_TYPE_FLOAT, 50 ATOMIC_TYPE_DOUBLE, 51 ATOMIC_TYPE_LONG_DOUBLE, 52 53 ATOMIC_TYPE_LAST = ATOMIC_TYPE_LONG_DOUBLE 54 } atomic_type_kind_t; 55 56 typedef enum atomic_type_flag_t { 57 ATOMIC_TYPE_FLAG_NONE = 0, 58 ATOMIC_TYPE_FLAG_SIGNED = 1 << 0, 59 ATOMIC_TYPE_FLAG_INTEGER = 1 << 1, 60 ATOMIC_TYPE_FLAG_FLOAT = 1 << 2, 61 ATOMIC_TYPE_FLAG_ARITHMETIC = 1 << 3, 62 ATOMIC_TYPE_FLAG_COMPLEX = 1 << 4, 63 } atomic_type_flag_t; 64 65 typedef enum type_qualifier_t { 66 TYPE_QUALIFIER_NONE = 0, 67 TYPE_QUALIFIER_CONST = 1 << 0, 68 TYPE_QUALIFIER_RESTRICT = 1 << 1, 69 TYPE_QUALIFIER_VOLATILE = 1 << 2, 70 /* microsoft extended qualifiers */ 71 TYPE_QUALIFIER_W64 = 1 << 3, 72 TYPE_QUALIFIER_PTR32 = 1 << 4, 73 TYPE_QUALIFIER_PTR64 = 1 << 5, 74 TYPE_QUALIFIER_SPTR = 1 << 6, 75 TYPE_QUALIFIER_UPTR = 1 << 7, 76 } type_qualifier_t; 77 typedef unsigned short type_qualifiers_t; 78 79 typedef struct type_base_t type_base_t; 80 typedef struct atomic_type_t atomic_type_t; 81 typedef struct complex_type_t complex_type_t; 82 typedef struct imaginary_type_t imaginary_type_t; 83 typedef struct pointer_type_t pointer_type_t; 84 typedef struct reference_type_t reference_type_t; 85 typedef struct function_parameter_t function_parameter_t; 86 typedef struct function_type_t function_type_t; 87 typedef struct compound_type_t compound_type_t; 88 typedef struct enum_type_t enum_type_t; 89 typedef struct builtin_type_t builtin_type_t; 90 typedef struct array_type_t array_type_t; 91 typedef struct typedef_type_t typedef_type_t; 92 typedef struct bitfield_type_t bitfield_type_t; 93 typedef struct typeof_type_t typeof_type_t; 94 typedef union type_t type_t; 95 96 /** 97 * Initializes the type system. Attempts to set some defaults on the atomic 98 * types based on a given machine size. 99 * These type properties are not final but you should adapt them to your system 100 * as your architecture and operating systems application binary interface (ABI) 101 * requires. 102 */ 103 void init_types(unsigned machine_size); 104 void exit_types(void); 105 106 /** 107 * Prints a type. 108 * 109 * @param type The type. 110 */ 111 void print_type(const type_t *type); 112 113 /** 114 * prints a human readable form of @p type. prints an abstract typename 115 * if symbol is NULL 116 */ 117 void print_type_ext(const type_t *type, const symbol_t *symbol, 118 const scope_t *parameters); 119 120 typedef enum QualifierSeparators { 121 QUAL_SEP_NONE = 0, 122 QUAL_SEP_START = 1U << 0, 123 QUAL_SEP_END = 1U << 1 124 } QualifierSeparators; 125 126 void print_type_qualifiers(type_qualifiers_t qualifiers, QualifierSeparators); 127 128 /** 129 * Prints an enum definition. 130 * 131 * @param declaration The enum's type declaration. 132 */ 133 void print_enum_definition(const enum_t *enume); 134 135 /** 136 * Print the compound part of a compound type. 137 */ 138 void print_compound_definition(const compound_t *compound); 139 140 void inc_type_visited(void); 141 142 /** 143 * Returns true if the given type is an integer type. 144 * 145 * @param type The type to check. 146 * @return True if type is an integer type. 147 */ 148 bool is_type_integer(const type_t *type); 149 150 /** 151 * Returns true if the given type is an enum type. 152 * 153 * @param type The type to check. 154 * @return True if type is an enum type. 155 */ 156 bool is_type_enum(const type_t *type); 157 158 /** 159 * Returns true if the given type is a signed type. 160 * 161 * @param type The type to check. 162 * @return True if type is a signed type. 163 */ 164 bool is_type_signed(const type_t *type); 165 166 /** 167 * Returns true if the given type is a floating point type. 168 * 169 * @param type The type to check. 170 * @return True if type is a floating point type. 171 */ 172 bool is_type_float(const type_t *type); 173 174 /** 175 * Returns true if the given type is a complex type. 176 * 177 * @param type The type to check. 178 * @return True if type is a complex type. 179 */ 180 bool is_type_complex(const type_t *type); 181 182 /** 183 * Returns true if the given type is an integer or float type. 184 * 185 * @param type The type to check. 186 * @return True if type is an integer or float type. 187 */ 188 bool is_type_real(const type_t *type); 189 190 /** 191 * Returns true if the type is an arithmetic type (§6.2.5 clause 18) 192 * 193 * @param type The type to check. 194 * @return True if type represents an arithmetic type. 195 */ 196 bool is_type_arithmetic(const type_t *type); 197 198 /** 199 * Returns true if the type is a scalar type (§6.2.5 clause 21) 200 * 201 * @param type The type to check. 202 * @return True if type represents a scalar type. 203 */ 204 bool is_type_scalar(const type_t *type); 205 206 /** 207 * Check if a given type is incomplete. 208 * 209 * @param type The type to check. 210 * @return True if the given type is incomplete (ie. just forward). 211 */ 212 bool is_type_incomplete(const type_t *type); 213 214 bool is_type_object(const type_t *type); 215 216 /** 217 * Check if two types are compatible. 218 */ 219 bool types_compatible(const type_t *type1, const type_t *type2); 220 221 /** 222 * Returns the unqualified type of a given type. 223 * 224 * @param type The type. 225 * @returns The unqualified type. 226 */ 227 type_t *get_unqualified_type(type_t *type); 228 229 type_t *get_qualified_type(type_t*, type_qualifiers_t); 230 type_t *skip_typeref(type_t *type); 231 232 /** 233 * Return the type qualifier set of a type. If skip_array_type 234 * is true, skip all array types. 235 */ 236 type_qualifiers_t get_type_qualifier(const type_t *type, bool skip_array_type); 237 238 /** 239 * returns size of an atomic type kind in bytes 240 */ 241 unsigned get_atomic_type_size(atomic_type_kind_t kind); 242 243 /** 244 * returns alignment of an atomic type kind in bytes 245 */ 246 unsigned get_atomic_type_alignment(atomic_type_kind_t kind); 247 248 unsigned get_type_alignment(type_t *type); 249 unsigned get_type_size(type_t *type); 250 decl_modifiers_t get_type_modifiers(const type_t *type); 251 252 /** 253 * returns flags of an atomic type kind 254 */ 255 unsigned get_atomic_type_flags(atomic_type_kind_t kind); 256 257 /** 258 * Find the atomic type kind representing a given size (signed). 259 */ 260 atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size); 261 262 /** 263 * Find the atomic type kind representing a given size (unsigned). 264 */ 265 atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size); 266 267 const char *get_atomic_kind_name(atomic_type_kind_t kind); 268 269 /** 270 * Finish the construction of a struct type by calculating its size, offsets, 271 * alignment. 272 */ 273 void layout_struct_type(compound_type_t *type); 274 275 /** 276 * Finish the construction of an union type by calculating 277 * its size and alignment. 278 */ 279 void layout_union_type(compound_type_t *type); 280 281 #endif 282