From 7232f32cc33fa87eaf00c33df6b41a0bedf07a8b Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 19 Dec 2019 18:26:47 +0200 Subject: [PATCH] Detect compiler and arch --- platforms/app/main.c | 4 +- source/m3_config_platforms.h | 125 +++++++++++++++++++++++++++++++++++ source/m3_core.h | 45 ------------- 3 files changed, 128 insertions(+), 46 deletions(-) diff --git a/platforms/app/main.c b/platforms/app/main.c index e77c276..bd59e04 100644 --- a/platforms/app/main.c +++ b/platforms/app/main.c @@ -121,7 +121,7 @@ int split_argv(char *str, char** argv) } void print_version() { - puts("wasm3 v0.4.0"); + puts("wasm3 v0.4.0 (" __DATE__ " " __TIME__ ", " M3_COMPILER_VER ", " M3_ARCH ")"); } void print_usage() { @@ -216,6 +216,8 @@ int main (int i_argc, const char* i_argv[]) M3Result result = c_m3Err_none; if (!strcmp(":init", argv[0])) { result = repl_init(env, &runtime); + } else if (!strcmp(":version", argv[0])) { + print_version(); } else if (!strcmp(":exit", argv[0])) { repl_free(&runtime); return 0; diff --git a/source/m3_config_platforms.h b/source/m3_config_platforms.h index 8f3afbb..81ee976 100644 --- a/source/m3_config_platforms.h +++ b/source/m3_config_platforms.h @@ -1,8 +1,27 @@ #ifndef m3_config_platforms_h #define m3_config_platforms_h +/* + * Helpers + */ + +#define M3_STR___(x) #x +#define M3_STR(x) M3_STR___(x) + +# if !defined(__cplusplus) +# define not ! +# define and && +# define or || +# endif + +/* + * Detect platform + */ + # if defined(__clang__) # define M3_COMPILER_CLANG 1 +# elif defined(__INTEL_COMPILER) +# define M3_COMPILER_ICC 1 # elif defined(__GNUC__) || defined(__GNUG__) # define M3_COMPILER_GCC 1 # elif defined(_MSC_VER) @@ -11,6 +30,112 @@ # warning "Compiler not detected" # endif +# if defined(M3_COMPILER_CLANG) || defined(M3_COMPILER_GCC) +# if defined(__wasm__) +# define M3_ARCH "wasm" +# elif defined(__x86_64__) +# define M3_ARCH "x86_64" +# elif defined(__i386__) +# define M3_ARCH "x86" +# elif defined(__aarch64__) +# define M3_ARCH "arm64-v8a" +# elif defined(__arm__) +# if defined(__ARM_ARCH_7A__) +# if defined(__ARM_NEON__) +# if defined(__ARM_PCS_VFP) +# define M3_ARCH "armeabi-v7a/NEON (hard-float)" +# else +# define M3_ARCH "armeabi-v7a/NEON" +# endif +# else +# if defined(__ARM_PCS_VFP) +# define M3_ARCH "armeabi-v7a (hard-float)" +# else +# define M3_ARCH "armeabi-v7a" +# endif +# endif +# else +# define M3_ARCH "armeabi" +# endif +# elif defined(__mips64) +# define M3_ARCH "mips64" +# elif defined(__mips__) +# define M3_ARCH "mips" +# endif +# elif defined(M3_COMPILER_MSVC) +# if defined(_M_X64) +# define M3_ARCH "x64" +# elif defined(_M_IX86) +# define M3_ARCH "x86" +# elif defined(_M_ARM64) +# define M3_ARCH "arm64" +# elif defined(_M_ARM) +# define M3_ARCH "arm" +# endif +# endif + +# if !defined(M3_ARCH) +# warning "Architecture not detected" +# define M3_ARCH "unknown" +# endif + +# if defined(M3_COMPILER_CLANG) +# define M3_COMPILER_VER __VERSION__ +# elif defined(M3_COMPILER_GCC) +# define M3_COMPILER_VER "GCC "__VERSION__ +# elif defined(M3_COMPILER_MSVC) +# define M3_COMPILER_VER "MSVC " M3_STR(_MSC_VER) +# else +# define M3_COMPILER_VER "unknown" +# endif + +/* + * Detect/define features + */ + +# if defined(M3_COMPILER_MSVC) +# include +# if UINTPTR_MAX == 0xFFFFFFFF +# define M3_SIZEOF_PTR 4 +# elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFu +# define M3_SIZEOF_PTR 8 +# else +# error Pointer size not supported +# endif +# else +# define M3_SIZEOF_PTR __SIZEOF_POINTER__ +# endif + +# if defined(M3_COMPILER_MSVC) +# define UNLIKELY(x) (x) +# define LIKELY(x) (x) +# else +# define UNLIKELY(x) __builtin_expect(!!(x), 0) +# define LIKELY(x) __builtin_expect(!!(x), 1) +# endif + + +# if defined(M3_COMPILER_MSVC) +# define M3_WEAK +# else +# define M3_WEAK __attribute__((weak)) +# endif + +# ifndef min +# define min(A,B) (A < B) ? A : B +# endif +# ifndef max +# define max(A,B) (A > B) ? A : B +# endif + +#define M3_INIT(field) memset(&field, 0, sizeof(field)) + +#define M3_COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) + +/* + * Apply settings + */ + # if defined(PARTICLE) # define d_m3LogOutput false # define d_m3MaxFunctionStackHeight 256 diff --git a/source/m3_core.h b/source/m3_core.h index a70aafa..0f7e60f 100644 --- a/source/m3_core.h +++ b/source/m3_core.h @@ -39,51 +39,6 @@ typedef u64 * m3stack_t; typedef const void * const cvptr_t; -# if !defined(__cplusplus) -# define not ! -# define and && -# define or || -# endif - -# if defined(M3_COMPILER_MSVC) -# include -# if UINTPTR_MAX == 0xFFFFFFFF -# define M3_SIZEOF_PTR 4 -# elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFu -# define M3_SIZEOF_PTR 8 -# else -# error Pointer size not supported -# endif -# else -# define M3_SIZEOF_PTR __SIZEOF_POINTER__ -# endif - -# if defined(M3_COMPILER_MSVC) -# define M3_WEAK -# else -# define M3_WEAK __attribute__((weak)) -# endif - -# if defined(M3_COMPILER_MSVC) -# define UNLIKELY(x) (x) -# define LIKELY(x) (x) -# else -# define UNLIKELY(x) __builtin_expect(!!(x), 0) -# define LIKELY(x) __builtin_expect(!!(x), 1) -# endif - -# ifndef min -# define min(A,B) (A < B) ? A : B -# endif -# ifndef max -# define max(A,B) (A > B) ? A : B -# endif - -#define M3_INIT(field) memset(&field, 0, sizeof(field)) - -#define M3_COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) - - # define d_m3Log_parse d_m3LogParse // required for m3logif # define d_m3Log_stack d_m3LogWasmStack # define d_m3Log_runtime d_m3LogRuntime