From 7b979dd789fe7003c079407894812fbe0f30f5c9 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Wed, 13 Jan 2021 10:01:49 +0700 Subject: [PATCH] Add maiko/platform.h to detect OS + CPU. (#216) This also adds a bit to the `-info` output to say which OS and CPU are being targeted. This can be used in subsequent commits to drive whether or not we need `BYTESWAP` and whether or not unaligned memory access is okay. We'll be able to remove per-platform defines from all of the makefiles and cmake. --- inc/maiko/platform.h | 148 +++++++++++++++++++++++++++++++++++++++++++ inc/version.h | 2 + src/main.c | 1 + 3 files changed, 151 insertions(+) create mode 100644 inc/maiko/platform.h diff --git a/inc/maiko/platform.h b/inc/maiko/platform.h new file mode 100644 index 0000000..f5f79a5 --- /dev/null +++ b/inc/maiko/platform.h @@ -0,0 +1,148 @@ +#ifndef MAIKO_PLATFORM_H +#define MAIKO_PLATFORM_H 1 + +/* + * Set up various preprocessor definitions based upon + * the platform. + */ + +#if defined(__APPLE__) && defined(__MACH__) +# define MAIKO_OS_MACOS 1 +# define MAIKO_OS_NAME "macOS" +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#ifdef __CYGWIN__ +# define MAIKO_OS_CYGWIN 1 +# define MAIKO_OS_NAME "Cygwin" +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#ifdef __DragonFly__ +# define MAIKO_OS_DRAGONFLYBSD 1 +# define MAIKO_OS_NAME "DragonFly BSD" +# define MAIKO_OS_BSD_LIKE 1 +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#ifdef __FreeBSD__ +# define MAIKO_OS_FREEBSD 1 +# define MAIKO_OS_NAME "FreeBSD" +# define MAIKO_OS_BSD_LIKE 1 +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#ifdef __linux__ +# define MAIKO_OS_LINUX 1 +# define MAIKO_OS_NAME "Linux" +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#ifdef __NetBSD__ +# define MAIKO_OS_NETBSD 1 +# define MAIKO_OS_NAME "NetBSD" +# define MAIKO_OS_BSD_LIKE 1 +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#ifdef __OpenBSD__ +# define MAIKO_OS_OPENBSD 1 +# define MAIKO_OS_NAME "OpenBSD" +# define MAIKO_OS_BSD_LIKE 1 +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +/* __SVR4: Defined by clang, gcc, and Sun Studio. + * __SVR4__ was only defined by Sun Studio. */ +#if defined(__sun) && defined(__SVR4) +# define MAIKO_OS_SOLARIS 1 +# define MAIKO_OS_NAME "Solaris" +# define MAIKO_OS_UNIX_LIKE 1 +# define MAIKO_OS_DETECTED 1 +#endif + +#if defined(_WIN32) || defined(__WINDOWS__) +# define MAIKO_OS_WINDOWS 1 +# define MAIKO_OS_NAME "Windows" +# define MAIKO_OS_DETECTED 1 +#endif + +/* __x86_64__: GNU C, __x86_64: Sun Studio, _M_AMD64: Visual Studio */ +#if defined(__x86_64__) || defined(__x86_64) || defined(_M_AMD64) +# define MAIKO_ARCH_X86_64 1 +# define MAIKO_ARCH_NAME "x86_64" +# define MAIKO_ARCH_WORD_BITS 64 +# define MAIKO_ARCH_DETECTED 1 +#endif + +/* __arm__: GNU C */ +#ifdef __arm__ +# define MAIKO_ARCH_ARM 1 +# define MAIKO_ARCH_NAME "arm" +# define MAIKO_ARCH_WORD_BITS 32 +# define MAIKO_ARCH_DETECTED 1 +#endif + +/* __aarch64__: GNU C */ +#ifdef __aarch64__ +# define MAIKO_ARCH_ARM64 1 +# define MAIKO_ARCH_NAME "arm64" +# define MAIKO_ARCH_WORD_BITS 64 +# define MAIKO_ARCH_DETECTED 1 +#endif + +/* __i386: GNU C, Sun Studio, _M_IX86: Visual Studio */ +#if defined(__i386) || defined(_M_IX86) +# define MAIKO_ARCH_X86 1 +# define MAIKO_ARCH_NAME "x86" +# define MAIKO_ARCH_WORD_BITS 32 +# define MAIKO_ARCH_DETECTED 1 +#endif + +#if defined(__ppc__) || defined(__ppc64__) +# define MAIKO_ARCH_POWERPC 1 +# define MAIKO_ARCH_NAME "PowerPC" +# ifdef __ppc64__ +# define MAIKO_ARCH_WORD_BITS 64 +# else +# define MAIKO_ARCH_WORD_BITS 32 +# endif +# define MAIKO_ARCH_DETECTED 1 +#endif + +/* Documented at https://github.com/riscv/riscv-toolchain-conventions */ +#ifdef __riscv +# define MAIKO_ARCH_RISCV 1 +# define MAIKO_ARCH_NAME "RISC-V" +# define MAIKO_ARCH_WORD_BITS __riscv_xlen +# define MAIKO_ARCH_DETECTED 1 +#endif + +/* __sparc__: GNU C, __sparc: Sun Studio */ +#if defined(__sparc__) || defined(__sparc) +# define MAIKO_ARCH_SPARC 1 +# define MAIKO_ARCH_NAME "SPARC" +# ifdef __sparcv9 +# define MAIKO_ARCH_WORD_BITS 64 +# else +# define MAIKO_ARCH_WORD_BITS 32 +# endif +# define MAIKO_ARCH_DETECTED 1 +#endif + +#ifndef MAIKO_OS_DETECTED +# error "Could not detect OS." +#endif + +#ifndef MAIKO_ARCH_DETECTED +# error "Could not detect system architecture." +#endif + +#endif /* MAIKO_PLATFORM_H */ diff --git a/inc/version.h b/inc/version.h index c0d1bac..867f69e 100644 --- a/inc/version.h +++ b/inc/version.h @@ -11,6 +11,8 @@ /* */ /************************************************************************/ +#include "maiko/platform.h" + /************************************************************************/ /* */ /* V E R S I O N . H */ diff --git a/src/main.c b/src/main.c index 2e09aac..e740460 100644 --- a/src/main.c +++ b/src/main.c @@ -736,6 +736,7 @@ void print_info_lines() { #elif (RELEASE == 351) printf("Emulator for Medley release 3.51\n"); #endif /* RELEASE */ + printf("Compiled for %s (%s) (%d bit).\n", MAIKO_OS_NAME, MAIKO_ARCH_NAME, MAIKO_ARCH_WORD_BITS); printf("Creation date: %s", ctime(&MDate)); #ifdef LPSOLVE printf("Contains lp_solve LP solver.\n");