1 #include <stdio.h> 2 3 #include "symbol.h" 4 #include "target.h" 5 #include "machine.h" 6 7 struct symbol *size_t_ctype = &ulong_ctype; 8 struct symbol *ssize_t_ctype = &long_ctype; 9 struct symbol *intmax_ctype = &llong_ctype; 10 struct symbol *uintmax_ctype = &ullong_ctype; 11 struct symbol *int64_ctype = &long_ctype; 12 struct symbol *uint64_ctype = &ulong_ctype; 13 struct symbol *int32_ctype = &int_ctype; 14 struct symbol *uint32_ctype = &uint_ctype; 15 struct symbol *wchar_ctype = &int_ctype; 16 struct symbol *wint_ctype = &uint_ctype; 17 18 /* 19 * For "__attribute__((aligned))" 20 */ 21 int max_alignment = 16; 22 23 /* 24 * Integer data types 25 */ 26 int bits_in_bool = 1; 27 int bits_in_char = 8; 28 int bits_in_short = 16; 29 int bits_in_int = 32; 30 int bits_in_long = 32; 31 int bits_in_longlong = 64; 32 int bits_in_longlonglong = 128; 33 34 int max_int_alignment = 4; 35 36 /* 37 * Floating point data types 38 */ 39 int bits_in_float = 32; 40 int bits_in_double = 64; 41 int bits_in_longdouble = 128; 42 43 int max_fp_alignment = 16; 44 45 /* 46 * Pointer data type 47 */ 48 int bits_in_pointer = 32; 49 int pointer_alignment = 4; 50 51 /* 52 * Enum data types 53 */ 54 int bits_in_enum = 32; 55 int enum_alignment = 4; 56 57 init_target(void)58void init_target(void) 59 { 60 switch (arch_mach) { 61 case MACH_X86_64: 62 if (arch_m64 == ARCH_LP64) 63 break; 64 /* fall through */ 65 case MACH_I386: 66 case MACH_M68K: 67 case MACH_SPARC32: 68 case MACH_PPC32: 69 wchar_ctype = &long_ctype; 70 break; 71 case MACH_ARM: 72 case MACH_ARM64: 73 wchar_ctype = &uint_ctype; 74 break; 75 default: 76 break; 77 } 78 79 switch (arch_mach) { 80 case MACH_MIPS64: 81 if (arch_m64 == ARCH_LP64) 82 break; 83 /* fall through */ 84 case MACH_M68K: 85 case MACH_SPARC32: 86 case MACH_PPC32: 87 case MACH_MIPS32: 88 case MACH_RISCV32: 89 arch_m64 = ARCH_LP32; 90 int32_ctype = &long_ctype; 91 uint32_ctype = &ulong_ctype; 92 break; 93 default: 94 break; 95 } 96 97 switch (arch_mach) { 98 case MACH_ARM: 99 case MACH_MIPS32: 100 case MACH_S390X: 101 case MACH_SPARC32: 102 bits_in_longdouble = 64; 103 max_fp_alignment = 8; 104 break; 105 case MACH_X86_64: 106 if (arch_m64 == ARCH_LP64 || arch_m64 == ARCH_X32) 107 break; 108 /* fall through */ 109 case MACH_I386: 110 case MACH_M68K: 111 bits_in_longdouble = 96; 112 max_fp_alignment = 4; 113 break; 114 default: 115 break; 116 } 117 118 switch (arch_m64) { 119 case ARCH_X32: 120 max_int_alignment = 8; 121 int64_ctype = &llong_ctype; 122 uint64_ctype = &ullong_ctype; 123 break; 124 case ARCH_LP32: 125 /* default values */ 126 int64_ctype = &llong_ctype; 127 uint64_ctype = &ullong_ctype; 128 intmax_ctype = &llong_ctype; 129 uintmax_ctype = &ullong_ctype; 130 break; 131 case ARCH_LP64: 132 bits_in_long = 64; 133 max_int_alignment = 8; 134 size_t_ctype = &ulong_ctype; 135 ssize_t_ctype = &long_ctype; 136 intmax_ctype = &long_ctype; 137 uintmax_ctype = &ulong_ctype; 138 goto case_64bit_common; 139 case ARCH_LLP64: 140 bits_in_long = 32; 141 max_int_alignment = 8; 142 size_t_ctype = &ullong_ctype; 143 ssize_t_ctype = &llong_ctype; 144 int64_ctype = &llong_ctype; 145 uint64_ctype = &ullong_ctype; 146 goto case_64bit_common; 147 case_64bit_common: 148 bits_in_pointer = 64; 149 pointer_alignment = 8; 150 break; 151 } 152 153 #if defined(__CYGWIN__) 154 wchar_ctype = &ushort_ctype; 155 #endif 156 #if defined(__FreeBSD__) || defined(__APPLE__) 157 wint_ctype = &int_ctype; 158 #endif 159 #if defined(__APPLE__) 160 int64_ctype = &llong_ctype; 161 uint64_ctype = &ullong_ctype; 162 #endif 163 } 164