@@ -476,6 +476,14 @@ static void handle_arch_m64_finalize(void)
goto case_x86_64;
case ARCH_LP32:
/* default values */
+#if defined(__m68k__) \
+ || ((defined(__sparc__) || defined(__sparc)) && !defined(__sparc_v9__)) \
+ || defined(__mips__) || defined(__mips) \
+ || defined(__powerpc__) || defined(__PPC__) || defined(PPC) \
+ || defined(__riscv__) || defined(__riscv)
+ int32_ctype = &long_ctype;
+ uint32_ctype = &ulong_ctype;
+#endif
int64_ctype = &llong_ctype;
uint64_ctype = &ullong_ctype;
intmax_ctype = &llong_ctype;
@@ -1251,6 +1259,8 @@ static void predefined_macros(void)
predefined_ctype("UINT8", &uchar_ctype, PTYPE_MAX|PTYPE_TYPE);
predefined_ctype("INT16", &short_ctype, PTYPE_MAX|PTYPE_TYPE);
predefined_ctype("UINT16", &ushort_ctype, PTYPE_MAX|PTYPE_TYPE);
+ predefined_ctype("INT32", int32_ctype, PTYPE_MAX|PTYPE_TYPE);
+ predefined_ctype("UINT32", uint32_ctype, PTYPE_MAX|PTYPE_TYPE);
predefined_ctype("INT64", int64_ctype, PTYPE_MAX|PTYPE_TYPE);
predefined_ctype("UINT64", uint64_ctype, PTYPE_MAX|PTYPE_TYPE);
@@ -10,6 +10,8 @@ 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;
@@ -74,6 +76,23 @@ void init_target(void)
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:
+ int32_ctype = &long_ctype;
+ uint32_ctype = &ulong_ctype;
+ break;
+ default:
+ break;
+ }
+
#if defined(__FreeBSD__) || defined(__APPLE__)
wint_ctype = &int_ctype;
#endif
@@ -7,6 +7,8 @@ extern struct symbol *intmax_ctype;
extern struct symbol *uintmax_ctype;
extern struct symbol *int64_ctype;
extern struct symbol *uint64_ctype;
+extern struct symbol *int32_ctype;
+extern struct symbol *uint32_ctype;
extern struct symbol *wchar_ctype;
extern struct symbol *wint_ctype;
@@ -21,6 +21,8 @@ int test(void)
TEST_MAX(UINT8, 0xffU);
TEST_MAX( INT16, 0x7fff);
TEST_MAX(UINT16, 0xffffU);
+ TEST_MAX( INT32, 0x7fffffff);
+ TEST_MAX(UINT32, 0xffffffffU);
TEST_MAX( INT64, 0x7fffffffffffffffLL);
TEST_MAX(UINT64, 0xffffffffffffffffULL);
TEST_SMAX(INTMAX, __INTMAX_TYPE__);
These are a pain. All LP64 archs use [u]int. Good. But some LP32 archs use [u]int and some others use [u]long. Some even use [u]int for some ABI and [u]loing for some others (bare metal). This really need to be target-specific to be correct. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- lib.c | 10 ++++++++++ target.c | 19 +++++++++++++++++++ target.h | 2 ++ validation/preprocessor/predef.c | 2 ++ 4 files changed, 33 insertions(+)