#include "symbol.h" #include "target.h" #include "machine.h" #include "builtin.h" static void predefine_i386(const struct target *self) { predefine("__i386__", 1, "1"); predefine("__i386", 1, "1"); predefine_nostd("i386"); } static void predefine_x86_64(const struct target *self) { predefine("__x86_64__", 1, "1"); predefine("__x86_64", 1, "1"); predefine("__amd64__", 1, "1"); predefine("__amd64", 1, "1"); } static void init_x86_common(const struct target *target) { switch (arch_os) { case OS_CYGWIN: wchar_ctype = &ushort_ctype; break; case OS_FREEBSD: wint_ctype = &int_ctype; break; case OS_OPENBSD: size_t_ctype = &ulong_ctype; ssize_t_ctype = &long_ctype; wchar_ctype = &int_ctype; wint_ctype = &int_ctype; fast16_ctype = &short_ctype; ufast16_ctype = &ushort_ctype; break; } } static const struct builtin_fn builtins_x86_common[] = { { "__builtin_ia32_pause", &void_ctype, 0, }, { } }; static void init_i386(const struct target *target) { fast16_ctype = &int_ctype; ufast16_ctype = &uint_ctype; fast32_ctype = &int_ctype; ufast32_ctype = &uint_ctype; init_x86_common(target); } const struct target target_i386 = { .mach = MACH_I386, .bitness = ARCH_LP32, .big_endian = 0, .unsigned_char = 0, .wchar = &long_ctype, .bits_in_longdouble = 96, .max_fp_alignment = 4, .target_64bit = &target_x86_64, .init = init_i386, .predefine = predefine_i386, .builtins = builtins_x86_common, }; static void init_x86_x32(const struct target *target) { init_x86_common(target); max_int_alignment = 8; fast16_ctype = &int_ctype; ufast16_ctype = &uint_ctype; fast32_ctype = &int_ctype; ufast32_ctype = &uint_ctype; wchar_ctype = &long_ctype; } static const struct target target_x86_x32 = { .mach = MACH_X86_64, .bitness = ARCH_X32, .big_endian = 0, .unsigned_char = 0, .has_int128 = 1, .bits_in_longdouble = 128, .max_fp_alignment = 16, .target_32bit = &target_i386, .target_64bit = &target_x86_64, .init = init_x86_x32, .predefine = predefine_x86_64, }; static void init_x86_64(const struct target *target) { init_x86_common(target); switch (arch_os) { case OS_CYGWIN: break; case OS_DARWIN: int64_ctype = &llong_ctype; uint64_ctype = &ullong_ctype; wint_ctype = &int_ctype; fast16_ctype = &short_ctype; ufast16_ctype = &ushort_ctype; fast32_ctype = &int_ctype; ufast32_ctype = &uint_ctype; fast64_ctype = &llong_ctype; ufast64_ctype = &ullong_ctype; break; case OS_FREEBSD: fast16_ctype = &short_ctype; ufast16_ctype = &ushort_ctype; fast32_ctype = &int_ctype; ufast32_ctype = &uint_ctype; break; case OS_NETBSD: fast8_ctype = &int_ctype; ufast8_ctype = &uint_ctype; fast16_ctype = &int_ctype; ufast16_ctype = &uint_ctype; fast32_ctype = &int_ctype; ufast32_ctype = &uint_ctype; wint_ctype = &int_ctype; break; case OS_OPENBSD: fast32_ctype = &int_ctype; ufast32_ctype = &uint_ctype; int64_ctype = &llong_ctype; uint64_ctype = &ullong_ctype; intmax_ctype = &llong_ctype; uintmax_ctype = &ullong_ctype; least64_ctype = &long_ctype; uleast64_ctype = &ulong_ctype; break; } } const struct target target_x86_64 = { .mach = MACH_X86_64, .bitness = ARCH_LP64, .big_endian = 0, .unsigned_char = 0, .has_int128 = 1, .bits_in_longdouble = 128, .max_fp_alignment = 16, .target_32bit = &target_i386, .target_x32bit = &target_x86_x32, .init = init_x86_64, .predefine = predefine_x86_64, .builtins = builtins_x86_common, };