_atomic_modes[ATOMIC_TYPE_LONG_DOUBLE] = mode_E;
_atomic_modes[ATOMIC_TYPE_BOOL] = get_umode(int_size);
- _atomic_modes[ATOMIC_TYPE_INT8] = get_smode(1);
- _atomic_modes[ATOMIC_TYPE_INT16] = get_smode(2);
- _atomic_modes[ATOMIC_TYPE_INT32] = get_smode(4);
- _atomic_modes[ATOMIC_TYPE_INT64] = get_smode(8);
- _atomic_modes[ATOMIC_TYPE_INT128] = get_smode(16);
- _atomic_modes[ATOMIC_TYPE_UINT8] = get_umode(1);
- _atomic_modes[ATOMIC_TYPE_UINT16] = get_umode(2);
- _atomic_modes[ATOMIC_TYPE_UINT32] = get_umode(4);
- _atomic_modes[ATOMIC_TYPE_UINT64] = get_umode(8);
- _atomic_modes[ATOMIC_TYPE_UINT128] = get_umode(16);
-
_atomic_modes[ATOMIC_TYPE_BOOL] = _atomic_modes[ATOMIC_TYPE_INT];
_atomic_modes[ATOMIC_TYPE_FLOAT_IMAGINARY] = _atomic_modes[ATOMIC_TYPE_FLOAT];
_atomic_modes[ATOMIC_TYPE_DOUBLE_IMAGINARY] = _atomic_modes[ATOMIC_TYPE_DOUBLE];
case ATOMIC_TYPE_LONGLONG:
case ATOMIC_TYPE_ULONGLONG:
case ATOMIC_TYPE_BOOL: /* gcc handles this as integer */
- /* microsoft types */
- case ATOMIC_TYPE_INT8:
- case ATOMIC_TYPE_INT16:
- case ATOMIC_TYPE_INT32:
- case ATOMIC_TYPE_INT64:
- case ATOMIC_TYPE_INT128:
- case ATOMIC_TYPE_UINT8:
- case ATOMIC_TYPE_UINT16:
- case ATOMIC_TYPE_UINT32:
- case ATOMIC_TYPE_UINT64:
- case ATOMIC_TYPE_UINT128:
tc = integer_type_class;
goto make_const;
if(type->kind == TYPE_BITFIELD)
type = type->bitfield.base;
- /* handle microsofts explicit size types */
- atomic_type_kind_t kind = type->atomic.akind;
- if(kind >= ATOMIC_TYPE_INT8 && kind <= ATOMIC_TYPE_UINT128) {
- unsigned size = get_atomic_type_size(kind);
- if(kind <= ATOMIC_TYPE_INT128) {
- if(size <= get_atomic_type_size(ATOMIC_TYPE_INT)) {
- return type_int;
- }
- } else {
- if(size <= get_atomic_type_size(ATOMIC_TYPE_UINT)) {
- return type_unsigned_int;
- }
- }
-
- return type;
- }
-
if(get_rank(type) < ATOMIC_TYPE_INT)
type = type_int;
break;
case SPECIFIER_UNSIGNED | SPECIFIER_INT8:
- atomic_type = ATOMIC_TYPE_UINT8;
+ atomic_type = unsigned_int8_type_kind;
break;
case SPECIFIER_UNSIGNED | SPECIFIER_INT16:
- atomic_type = ATOMIC_TYPE_UINT16;
+ atomic_type = unsigned_int16_type_kind;
break;
case SPECIFIER_UNSIGNED | SPECIFIER_INT32:
- atomic_type = ATOMIC_TYPE_UINT32;
+ atomic_type = unsigned_int32_type_kind;
break;
case SPECIFIER_UNSIGNED | SPECIFIER_INT64:
- atomic_type = ATOMIC_TYPE_UINT64;
+ atomic_type = unsigned_int64_type_kind;
break;
case SPECIFIER_UNSIGNED | SPECIFIER_INT128:
- atomic_type = ATOMIC_TYPE_UINT128;
+ atomic_type = unsigned_int128_type_kind;
break;
case SPECIFIER_INT8:
case SPECIFIER_SIGNED | SPECIFIER_INT8:
- atomic_type = ATOMIC_TYPE_INT8;
+ atomic_type = int8_type_kind;
break;
case SPECIFIER_INT16:
case SPECIFIER_SIGNED | SPECIFIER_INT16:
- atomic_type = ATOMIC_TYPE_INT16;
+ atomic_type = int16_type_kind;
break;
case SPECIFIER_INT32:
case SPECIFIER_SIGNED | SPECIFIER_INT32:
- atomic_type = ATOMIC_TYPE_INT32;
+ atomic_type = int32_type_kind;
break;
case SPECIFIER_INT64:
case SPECIFIER_SIGNED | SPECIFIER_INT64:
- atomic_type = ATOMIC_TYPE_INT64;
+ atomic_type = int64_type_kind;
break;
case SPECIFIER_INT128:
case SPECIFIER_SIGNED | SPECIFIER_INT128:
- atomic_type = ATOMIC_TYPE_INT128;
+ atomic_type = int128_type_kind;
break;
case SPECIFIER_FLOAT:
case ATOMIC_TYPE_LONG_DOUBLE: s = "long double"; break;
case ATOMIC_TYPE_FLOAT: s = "float"; break;
case ATOMIC_TYPE_DOUBLE: s = "double"; break;
- case ATOMIC_TYPE_INT8: s = "__int8"; break;
- case ATOMIC_TYPE_INT16: s = "__int16"; break;
- case ATOMIC_TYPE_INT32: s = "__int32"; break;
- case ATOMIC_TYPE_INT64: s = "__int64"; break;
- case ATOMIC_TYPE_INT128: s = "__int128"; break;
- case ATOMIC_TYPE_UINT8: s = "unsigned __int8"; break;
- case ATOMIC_TYPE_UINT16: s = "unsigned __int16"; break;
- case ATOMIC_TYPE_UINT32: s = "unsigned __int32"; break;
- case ATOMIC_TYPE_UINT64: s = "unsigned __int64"; break;
- case ATOMIC_TYPE_UINT128: s = "unsigned __int128"; break;
case ATOMIC_TYPE_FLOAT_COMPLEX: s = "_Complex float"; break;
case ATOMIC_TYPE_DOUBLE_COMPLEX: s = "_Complex float"; break;
case ATOMIC_TYPE_LONG_DOUBLE_COMPLEX: s = "_Complex float"; break;
case ATOMIC_TYPE_ULONG:
case ATOMIC_TYPE_LONGLONG:
case ATOMIC_TYPE_ULONGLONG:
- case ATOMIC_TYPE_INT8:
- case ATOMIC_TYPE_INT16:
- case ATOMIC_TYPE_INT32:
- case ATOMIC_TYPE_INT64:
- case ATOMIC_TYPE_INT128:
- case ATOMIC_TYPE_UINT8:
- case ATOMIC_TYPE_UINT16:
- case ATOMIC_TYPE_UINT32:
- case ATOMIC_TYPE_UINT64:
- case ATOMIC_TYPE_UINT128:
return true;
case ATOMIC_TYPE_INVALID:
case ATOMIC_TYPE_ULONG:
case ATOMIC_TYPE_LONGLONG:
case ATOMIC_TYPE_ULONGLONG:
- case ATOMIC_TYPE_INT8:
- case ATOMIC_TYPE_INT16:
- case ATOMIC_TYPE_INT32:
- case ATOMIC_TYPE_INT64:
- case ATOMIC_TYPE_INT128:
- case ATOMIC_TYPE_UINT8:
- case ATOMIC_TYPE_UINT16:
- case ATOMIC_TYPE_UINT32:
- case ATOMIC_TYPE_UINT64:
- case ATOMIC_TYPE_UINT128:
return false;
}
case ATOMIC_TYPE_FLOAT:
case ATOMIC_TYPE_DOUBLE:
case ATOMIC_TYPE_LONG_DOUBLE:
- case ATOMIC_TYPE_INT8:
- case ATOMIC_TYPE_INT16:
- case ATOMIC_TYPE_INT32:
- case ATOMIC_TYPE_INT64:
- case ATOMIC_TYPE_INT128:
case ATOMIC_TYPE_FLOAT_COMPLEX:
case ATOMIC_TYPE_DOUBLE_COMPLEX:
case ATOMIC_TYPE_LONG_DOUBLE_COMPLEX:
case ATOMIC_TYPE_UINT:
case ATOMIC_TYPE_ULONG:
case ATOMIC_TYPE_ULONGLONG:
- case ATOMIC_TYPE_UINT8:
- case ATOMIC_TYPE_UINT16:
- case ATOMIC_TYPE_UINT32:
- case ATOMIC_TYPE_UINT64:
- case ATOMIC_TYPE_UINT128:
return false;
case ATOMIC_TYPE_VOID:
case ATOMIC_TYPE_CHAR:
case ATOMIC_TYPE_SCHAR:
case ATOMIC_TYPE_UCHAR:
- case ATOMIC_TYPE_INT8:
- case ATOMIC_TYPE_UINT8:
return 1;
case ATOMIC_TYPE_SHORT:
case ATOMIC_TYPE_USHORT:
- case ATOMIC_TYPE_INT16:
- case ATOMIC_TYPE_UINT16:
return 2;
- case ATOMIC_TYPE_INT32:
- case ATOMIC_TYPE_UINT32:
- return 4;
-
- case ATOMIC_TYPE_INT64:
- case ATOMIC_TYPE_UINT64:
- return 8;
-
- case ATOMIC_TYPE_INT128:
- case ATOMIC_TYPE_UINT128:
- return 16;
-
case ATOMIC_TYPE_BOOL:
case ATOMIC_TYPE_INT:
case ATOMIC_TYPE_UINT:
panic("Trying to determine size of invalid atomic type");
}
+/**
+ * Find the atomic type kind representing a given size (signed).
+ */
+atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size) {
+ static atomic_type_kind_t kinds[32];
+
+ assert(size < 32);
+ atomic_type_kind_t kind = kinds[size];
+ if(kind == ATOMIC_TYPE_INVALID) {
+ static const possible_kinds[] = {
+ ATOMIC_TYPE_SCHAR,
+ ATOMIC_TYPE_SHORT,
+ ATOMIC_TYPE_INT,
+ ATOMIC_TYPE_LONG,
+ ATOMIC_TYPE_LONGLONG
+ };
+ for(int i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
+ if(get_atomic_type_size(possible_kinds[i]) == size) {
+ kind = possible_kinds[i];
+ break;
+ }
+ }
+ kinds[size] = kind;
+ }
+ return kind;
+}
+
+/**
+ * Find the atomic type kind representing a given size (signed).
+ */
+atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size) {
+ static atomic_type_kind_t kinds[32];
+
+ assert(size < 32);
+ atomic_type_kind_t kind = kinds[size];
+ if(kind == ATOMIC_TYPE_INVALID) {
+ static const possible_kinds[] = {
+ ATOMIC_TYPE_UCHAR,
+ ATOMIC_TYPE_USHORT,
+ ATOMIC_TYPE_UINT,
+ ATOMIC_TYPE_ULONG,
+ ATOMIC_TYPE_ULONGLONG
+ };
+ for(int i = 0; i < sizeof(possible_kinds)/sizeof(possible_kinds[0]); ++i) {
+ if(get_atomic_type_size(possible_kinds[i]) == size) {
+ kind = possible_kinds[i];
+ break;
+ }
+ }
+ kinds[size] = kind;
+ }
+ return kind;
+}
+
/**
* Hash the given type and return the "singleton" version
* of it.
type->base.alignment = 0;
type->atomic.akind = atype;
- /* TODO: set the aligmnent depending on the atype here */
+ /* TODO: set the alignment depending on the atype here */
return identify_new_type(type);
}
/**
* Creates a new pointer type.
*
- * @param points_to The points-to type for teh new type.
+ * @param points_to The points-to type for the new type.
* @param qualifiers Type qualifiers for the new type.
*/
type_t *make_pointer_type(type_t *points_to, type_qualifiers_t qualifiers)
ATOMIC_TYPE_DOUBLE,
ATOMIC_TYPE_LONG_DOUBLE,
ATOMIC_TYPE_BOOL,
- /* microsoft extensions */
- ATOMIC_TYPE_INT8,
- ATOMIC_TYPE_INT16,
- ATOMIC_TYPE_INT32,
- ATOMIC_TYPE_INT64,
- ATOMIC_TYPE_INT128,
- ATOMIC_TYPE_UINT8,
- ATOMIC_TYPE_UINT16,
- ATOMIC_TYPE_UINT32,
- ATOMIC_TYPE_UINT64,
- ATOMIC_TYPE_UINT128,
ATOMIC_TYPE_FLOAT_COMPLEX,
ATOMIC_TYPE_DOUBLE_COMPLEX,
*/
unsigned get_atomic_type_align(atomic_type_kind_t kind);
+/**
+ * Find the atomic type kind representing a given size (signed).
+ */
+atomic_type_kind_t find_signed_int_atomic_type_kind_for_size(unsigned size);
+
+/**
+ * Find the atomic type kind representing a given size (unsigned).
+ */
+atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size);
+
#endif
*/
#include "type_t.h"
#include "types.h"
+#include "lang_features.h"
/** The error type. */
type_t *type_error_type;
type_t *type_wchar_t_ptr;
/* microsoft types */
+atomic_type_kind_t int8_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t int16_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t int32_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t int64_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t int128_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t unsigned_int8_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t unsigned_int16_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t unsigned_int32_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t unsigned_int64_type_kind = ATOMIC_TYPE_INVALID;
+atomic_type_kind_t unsigned_int128_type_kind = ATOMIC_TYPE_INVALID;
+
type_t *type_int8;
type_t *type_int16;
type_t *type_int32;
type_void = make_atomic_type(ATOMIC_TYPE_VOID, TYPE_QUALIFIER_NONE);
/* microsoft types */
- type_int8 = make_atomic_type(ATOMIC_TYPE_CHAR, TYPE_QUALIFIER_NONE);
- type_int16 = make_atomic_type(ATOMIC_TYPE_SHORT, TYPE_QUALIFIER_NONE);
- type_int32 = make_atomic_type(ATOMIC_TYPE_INT, TYPE_QUALIFIER_NONE);
- type_int64 = make_atomic_type(ATOMIC_TYPE_LONGLONG, TYPE_QUALIFIER_NONE);
- type_unsigned_int8 = make_atomic_type(ATOMIC_TYPE_UCHAR, TYPE_QUALIFIER_NONE);
- type_unsigned_int16 = make_atomic_type(ATOMIC_TYPE_USHORT, TYPE_QUALIFIER_NONE);
- type_unsigned_int32 = make_atomic_type(ATOMIC_TYPE_UINT, TYPE_QUALIFIER_NONE);
- type_unsigned_int64 = make_atomic_type(ATOMIC_TYPE_ULONGLONG, TYPE_QUALIFIER_NONE);
+ if(c_mode & _MS) {
+ int8_type_kind = find_signed_int_atomic_type_kind_for_size(1);
+ type_int8 = make_atomic_type(int8_type_kind, TYPE_QUALIFIER_NONE);
+ int16_type_kind = find_signed_int_atomic_type_kind_for_size(2);
+ type_int16 = make_atomic_type(int16_type_kind, TYPE_QUALIFIER_NONE);
+ int32_type_kind = find_signed_int_atomic_type_kind_for_size(4);
+ type_int32 = make_atomic_type(int32_type_kind, TYPE_QUALIFIER_NONE);
+ int64_type_kind = find_signed_int_atomic_type_kind_for_size(8);
+ type_int64 = make_atomic_type(int64_type_kind, TYPE_QUALIFIER_NONE);
+ unsigned_int8_type_kind = find_unsigned_int_atomic_type_kind_for_size(1);
+ type_unsigned_int8 = make_atomic_type(unsigned_int8_type_kind, TYPE_QUALIFIER_NONE);
+ unsigned_int16_type_kind = find_unsigned_int_atomic_type_kind_for_size(2);
+ type_unsigned_int16 = make_atomic_type(unsigned_int16_type_kind, TYPE_QUALIFIER_NONE);
+ unsigned_int32_type_kind = find_unsigned_int_atomic_type_kind_for_size(4);
+ type_unsigned_int32 = make_atomic_type(unsigned_int32_type_kind, TYPE_QUALIFIER_NONE);
+ unsigned_int64_type_kind = find_unsigned_int_atomic_type_kind_for_size(8);
+ type_unsigned_int64 = make_atomic_type(unsigned_int64_type_kind, TYPE_QUALIFIER_NONE);
+ }
/* pointer types */
type_void_ptr = make_pointer_type(type_void, TYPE_QUALIFIER_NONE);
extern type_t *type_wchar_t_ptr;
/* microsoft types */
+extern atomic_type_kind_t int8_type_kind;
+extern atomic_type_kind_t int16_type_kind;
+extern atomic_type_kind_t int32_type_kind;
+extern atomic_type_kind_t int64_type_kind;
+extern atomic_type_kind_t int128_type_kind;
+extern atomic_type_kind_t unsigned_int8_type_kind;
+extern atomic_type_kind_t unsigned_int16_type_kind;
+extern atomic_type_kind_t unsigned_int32_type_kind;
+extern atomic_type_kind_t unsigned_int64_type_kind;
+extern atomic_type_kind_t unsigned_int128_type_kind;
+
extern type_t *type_int8;
extern type_t *type_int16;
extern type_t *type_int32;
extern type_t *type_int64;
+extern type_t *type_int128;
extern type_t *type_unsigned_int8;
extern type_t *type_unsigned_int16;
extern type_t *type_unsigned_int32;
extern type_t *type_unsigned_int64;
+extern type_t *type_unsigned_int128;
void init_basic_types(void);