diff mbox series

[v3,17/19] add predefined macros for [u]int32_t

Message ID 20181214001536.6259-18-luc.vanoostenryck@gmail.com (mailing list archive)
State Mainlined, archived
Headers show
Series predefined macros for intmax_t/intptr_t/... | expand

Commit Message

Luc Van Oostenryck Dec. 14, 2018, 12:15 a.m. UTC
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(+)
diff mbox series

Patch

diff --git a/lib.c b/lib.c
index f9015ef35..3084b6197 100644
--- a/lib.c
+++ b/lib.c
@@ -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);
 
diff --git a/target.c b/target.c
index fe3756f80..ad12b630c 100644
--- a/target.c
+++ b/target.c
@@ -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
diff --git a/target.h b/target.h
index 7b1d96498..8bbe494f8 100644
--- a/target.h
+++ b/target.h
@@ -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;
 
diff --git a/validation/preprocessor/predef.c b/validation/preprocessor/predef.c
index f00a471fc..5678acedf 100644
--- a/validation/preprocessor/predef.c
+++ b/validation/preprocessor/predef.c
@@ -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__);