1#include "symbol.h" 2#include "target.h" 3#include "machine.h" 4#include "builtin.h" 5 6 7static void predefine_i386(const struct target *self) 8{ 9 predefine("__i386__", 1, "1"); 10 predefine("__i386", 1, "1"); 11 predefine_nostd("i386"); 12} 13 14static void predefine_x86_64(const struct target *self) 15{ 16 predefine("__x86_64__", 1, "1"); 17 predefine("__x86_64", 1, "1"); 18 predefine("__amd64__", 1, "1"); 19 predefine("__amd64", 1, "1"); 20} 21 22 23static void init_x86_common(const struct target *target) 24{ 25 switch (arch_os) { 26 case OS_CYGWIN: 27 wchar_ctype = &ushort_ctype; 28 break; 29 case OS_FREEBSD: 30 wint_ctype = &int_ctype; 31 break; 32 case OS_OPENBSD: 33 size_t_ctype = &ulong_ctype; 34 ssize_t_ctype = &long_ctype; 35 wchar_ctype = &int_ctype; 36 wint_ctype = &int_ctype; 37 fast16_ctype = &short_ctype; 38 ufast16_ctype = &ushort_ctype; 39 break; 40 } 41} 42 43static const struct builtin_fn builtins_x86_common[] = { 44 { "__builtin_ia32_pause", &void_ctype, 0, }, 45 { } 46}; 47 48 49static void init_i386(const struct target *target) 50{ 51 fast16_ctype = &int_ctype; 52 ufast16_ctype = &uint_ctype; 53 fast32_ctype = &int_ctype; 54 ufast32_ctype = &uint_ctype; 55 56 init_x86_common(target); 57} 58 59const struct target target_i386 = { 60 .mach = MACH_I386, 61 .bitness = ARCH_LP32, 62 .big_endian = 0, 63 .unsigned_char = 0, 64 65 .wchar = &long_ctype, 66 .bits_in_longdouble = 96, 67 .max_fp_alignment = 4, 68 69 .target_64bit = &target_x86_64, 70 71 .init = init_i386, 72 .predefine = predefine_i386, 73 .builtins = builtins_x86_common, 74}; 75 76 77static void init_x86_x32(const struct target *target) 78{ 79 init_x86_common(target); 80 81 max_int_alignment = 8; 82 83 fast16_ctype = &int_ctype; 84 ufast16_ctype = &uint_ctype; 85 fast32_ctype = &int_ctype; 86 ufast32_ctype = &uint_ctype; 87 wchar_ctype = &long_ctype; 88} 89 90static const struct target target_x86_x32 = { 91 .mach = MACH_X86_64, 92 .bitness = ARCH_X32, 93 .big_endian = 0, 94 .unsigned_char = 0, 95 .has_int128 = 1, 96 97 .bits_in_longdouble = 128, 98 .max_fp_alignment = 16, 99 100 .target_32bit = &target_i386, 101 .target_64bit = &target_x86_64, 102 103 .init = init_x86_x32, 104 .predefine = predefine_x86_64, 105}; 106 107 108static void init_x86_64(const struct target *target) 109{ 110 init_x86_common(target); 111 112 switch (arch_os) { 113 case OS_CYGWIN: 114 break; 115 case OS_DARWIN: 116 int64_ctype = &llong_ctype; 117 uint64_ctype = &ullong_ctype; 118 wint_ctype = &int_ctype; 119 fast16_ctype = &short_ctype; 120 ufast16_ctype = &ushort_ctype; 121 fast32_ctype = &int_ctype; 122 ufast32_ctype = &uint_ctype; 123 fast64_ctype = &llong_ctype; 124 ufast64_ctype = &ullong_ctype; 125 break; 126 case OS_FREEBSD: 127 fast16_ctype = &short_ctype; 128 ufast16_ctype = &ushort_ctype; 129 fast32_ctype = &int_ctype; 130 ufast32_ctype = &uint_ctype; 131 break; 132 case OS_NETBSD: 133 fast8_ctype = &int_ctype; 134 ufast8_ctype = &uint_ctype; 135 fast16_ctype = &int_ctype; 136 ufast16_ctype = &uint_ctype; 137 fast32_ctype = &int_ctype; 138 ufast32_ctype = &uint_ctype; 139 wint_ctype = &int_ctype; 140 break; 141 case OS_OPENBSD: 142 fast32_ctype = &int_ctype; 143 ufast32_ctype = &uint_ctype; 144 int64_ctype = &llong_ctype; 145 uint64_ctype = &ullong_ctype; 146 intmax_ctype = &llong_ctype; 147 uintmax_ctype = &ullong_ctype; 148 least64_ctype = &long_ctype; 149 uleast64_ctype = &ulong_ctype; 150 break; 151 } 152} 153 154const struct target target_x86_64 = { 155 .mach = MACH_X86_64, 156 .bitness = ARCH_LP64, 157 .big_endian = 0, 158 .unsigned_char = 0, 159 .has_int128 = 1, 160 161 .bits_in_longdouble = 128, 162 .max_fp_alignment = 16, 163 164 .target_32bit = &target_i386, 165 .target_x32bit = &target_x86_x32, 166 167 .init = init_x86_64, 168 .predefine = predefine_x86_64, 169 .builtins = builtins_x86_common, 170}; 171