Print this page
new smatch

*** 1,12 **** --- 1,21 ---- #include <stdio.h> #include "symbol.h" #include "target.h" + #include "machine.h" struct symbol *size_t_ctype = &ulong_ctype; struct symbol *ssize_t_ctype = &long_ctype; + struct symbol *intmax_ctype = &llong_ctype; + struct symbol *uintmax_ctype = &ullong_ctype; + struct symbol *int64_ctype = &long_ctype; + struct symbol *uint64_ctype = &ulong_ctype; + struct symbol *int32_ctype = &int_ctype; + struct symbol *uint32_ctype = &uint_ctype; + struct symbol *wchar_ctype = &int_ctype; + struct symbol *wint_ctype = &uint_ctype; /* * For "__attribute__((aligned))" */ int max_alignment = 16;
*** 20,41 **** int bits_in_int = 32; int bits_in_long = 32; int bits_in_longlong = 64; int bits_in_longlonglong = 128; - int bits_in_wchar = 32; - int max_int_alignment = 4; /* * Floating point data types */ int bits_in_float = 32; int bits_in_double = 64; ! int bits_in_longdouble = 80; ! int max_fp_alignment = 8; /* * Pointer data type */ int bits_in_pointer = 32; --- 29,48 ---- int bits_in_int = 32; int bits_in_long = 32; int bits_in_longlong = 64; int bits_in_longlonglong = 128; int max_int_alignment = 4; /* * Floating point data types */ int bits_in_float = 32; int bits_in_double = 64; ! int bits_in_longdouble = 128; ! int max_fp_alignment = 16; /* * Pointer data type */ int bits_in_pointer = 32;
*** 44,48 **** --- 51,163 ---- /* * Enum data types */ int bits_in_enum = 32; int enum_alignment = 4; + + + void init_target(void) + { + switch (arch_mach) { + case MACH_X86_64: + if (arch_m64 == ARCH_LP64) + break; + /* fall through */ + case MACH_I386: + case MACH_M68K: + case MACH_SPARC32: + case MACH_PPC32: + wchar_ctype = &long_ctype; + break; + case MACH_ARM: + case MACH_ARM64: + wchar_ctype = &uint_ctype; + break; + default: + break; + } + + switch (arch_mach) { + case MACH_MIPS64: + if (arch_m64 == ARCH_LP64) + break; + /* fall through */ + case MACH_M68K: + case MACH_SPARC32: + case MACH_PPC32: + case MACH_MIPS32: + case MACH_RISCV32: + arch_m64 = ARCH_LP32; + int32_ctype = &long_ctype; + uint32_ctype = &ulong_ctype; + break; + default: + break; + } + + switch (arch_mach) { + case MACH_ARM: + case MACH_MIPS32: + case MACH_S390X: + case MACH_SPARC32: + bits_in_longdouble = 64; + max_fp_alignment = 8; + break; + case MACH_X86_64: + if (arch_m64 == ARCH_LP64 || arch_m64 == ARCH_X32) + break; + /* fall through */ + case MACH_I386: + case MACH_M68K: + bits_in_longdouble = 96; + max_fp_alignment = 4; + break; + default: + break; + } + + switch (arch_m64) { + case ARCH_X32: + max_int_alignment = 8; + int64_ctype = &llong_ctype; + uint64_ctype = &ullong_ctype; + break; + case ARCH_LP32: + /* default values */ + int64_ctype = &llong_ctype; + uint64_ctype = &ullong_ctype; + intmax_ctype = &llong_ctype; + uintmax_ctype = &ullong_ctype; + break; + case ARCH_LP64: + bits_in_long = 64; + max_int_alignment = 8; + size_t_ctype = &ulong_ctype; + ssize_t_ctype = &long_ctype; + intmax_ctype = &long_ctype; + uintmax_ctype = &ulong_ctype; + goto case_64bit_common; + case ARCH_LLP64: + bits_in_long = 32; + max_int_alignment = 8; + size_t_ctype = &ullong_ctype; + ssize_t_ctype = &llong_ctype; + int64_ctype = &llong_ctype; + uint64_ctype = &ullong_ctype; + goto case_64bit_common; + case_64bit_common: + bits_in_pointer = 64; + pointer_alignment = 8; + break; + } + + #if defined(__CYGWIN__) + wchar_ctype = &ushort_ctype; + #endif + #if defined(__FreeBSD__) || defined(__APPLE__) + wint_ctype = &int_ctype; + #endif + #if defined(__APPLE__) + int64_ctype = &llong_ctype; + uint64_ctype = &ullong_ctype; + #endif + }