203 lines
5.3 KiB
C
203 lines
5.3 KiB
C
//
|
|
// m3_config_platforms.h
|
|
//
|
|
// Created by Volodymyr Shymanskyy on 11/20/19.
|
|
// Copyright © 2019 Volodymyr Shymanskyy. All rights reserved.
|
|
//
|
|
|
|
#ifndef m3_config_platforms_h
|
|
#define m3_config_platforms_h
|
|
|
|
#include "wasm3_defs.h"
|
|
|
|
/*
|
|
* Internal helpers
|
|
*/
|
|
|
|
# if !defined(__cplusplus) || defined(_MSC_VER)
|
|
# define not !
|
|
# define and &&
|
|
# define or ||
|
|
# endif
|
|
|
|
/*
|
|
* Detect/define features
|
|
*/
|
|
|
|
# if defined(M3_COMPILER_MSVC)
|
|
# include <stdint.h>
|
|
# 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
|
|
# elif defined(__SIZEOF_POINTER__)
|
|
# define M3_SIZEOF_PTR __SIZEOF_POINTER__
|
|
#else
|
|
# error "Pointer size not detected"
|
|
# endif
|
|
|
|
# if defined(M3_BIG_ENDIAN)
|
|
# define M3_BSWAP_u8(X) {}
|
|
# define M3_BSWAP_u16(X) { (X)=m3_bswap16((X)); }
|
|
# define M3_BSWAP_u32(X) { (X)=m3_bswap32((X)); }
|
|
# define M3_BSWAP_u64(X) { (X)=m3_bswap64((X)); }
|
|
# define M3_BSWAP_i8(X) {}
|
|
# define M3_BSWAP_i16(X) M3_BSWAP_u16(X)
|
|
# define M3_BSWAP_i32(X) M3_BSWAP_u32(X)
|
|
# define M3_BSWAP_i64(X) M3_BSWAP_u64(X)
|
|
# define M3_BSWAP_f32(X) { union { f32 f; u32 i; } u; u.f = (X); M3_BSWAP_u32(u.i); (X) = u.f; }
|
|
# define M3_BSWAP_f64(X) { union { f64 f; u64 i; } u; u.f = (X); M3_BSWAP_u64(u.i); (X) = u.f; }
|
|
# else
|
|
# define M3_BSWAP_u8(X) {}
|
|
# define M3_BSWAP_u16(x) {}
|
|
# define M3_BSWAP_u32(x) {}
|
|
# define M3_BSWAP_u64(x) {}
|
|
# define M3_BSWAP_i8(X) {}
|
|
# define M3_BSWAP_i16(X) {}
|
|
# define M3_BSWAP_i32(X) {}
|
|
# define M3_BSWAP_i64(X) {}
|
|
# define M3_BSWAP_f32(X) {}
|
|
# define M3_BSWAP_f64(X) {}
|
|
# endif
|
|
|
|
# if defined(M3_COMPILER_MSVC)
|
|
# define M3_WEAK //__declspec(selectany)
|
|
# define M3_NO_UBSAN
|
|
# define M3_NOINLINE
|
|
# elif defined(__MINGW32__) || defined(__CYGWIN__)
|
|
# define M3_WEAK //__attribute__((selectany))
|
|
# define M3_NO_UBSAN
|
|
# define M3_NOINLINE __attribute__((noinline))
|
|
# else
|
|
# define M3_WEAK __attribute__((weak))
|
|
# define M3_NO_UBSAN //__attribute__((no_sanitize("undefined")))
|
|
// Workaround for Cosmopolitan noinline conflict: https://github.com/jart/cosmopolitan/issues/310
|
|
# if defined(noinline)
|
|
# define M3_NOINLINE noinline
|
|
# else
|
|
# define M3_NOINLINE __attribute__((noinline))
|
|
# endif
|
|
# endif
|
|
|
|
# ifndef M3_MIN
|
|
# define M3_MIN(A,B) (((A) < (B)) ? (A) : (B))
|
|
# endif
|
|
# ifndef M3_MAX
|
|
# define M3_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])))))
|
|
|
|
#if defined(__AVR__)
|
|
|
|
#include <inttypes.h>
|
|
|
|
# define PRIu64 "llu"
|
|
# define PRIi64 "lli"
|
|
|
|
# define d_m3ShortTypesDefined
|
|
typedef double f64;
|
|
typedef float f32;
|
|
typedef uint64_t u64;
|
|
typedef int64_t i64;
|
|
typedef uint32_t u32;
|
|
typedef int32_t i32;
|
|
typedef short unsigned u16;
|
|
typedef short i16;
|
|
typedef uint8_t u8;
|
|
typedef int8_t i8;
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Apply settings
|
|
*/
|
|
|
|
# if defined (M3_COMPILER_MSVC)
|
|
# define vectorcall // For MSVC, better not to specify any call convention
|
|
# elif defined(__x86_64__)
|
|
# define vectorcall __attribute__((aligned(32)))
|
|
//# elif defined(__riscv) && (__riscv_xlen == 64)
|
|
//# define vectorcall __attribute__((aligned(16)))
|
|
# elif defined(__MINGW32__)
|
|
# define vectorcall
|
|
# elif defined(WIN32)
|
|
# define vectorcall __vectorcall
|
|
# elif defined (ESP8266)
|
|
# include <c_types.h>
|
|
# define vectorcall //ICACHE_FLASH_ATTR
|
|
# elif defined (ESP32)
|
|
# if defined(M3_IN_IRAM) // the interpreter is in IRAM, attribute not needed
|
|
# define vectorcall
|
|
# else
|
|
# include "esp_system.h"
|
|
# define vectorcall IRAM_ATTR
|
|
# endif
|
|
# elif defined (FOMU)
|
|
# define vectorcall __attribute__((section(".ramtext")))
|
|
# endif
|
|
|
|
#ifndef vectorcall
|
|
#define vectorcall
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Device-specific defaults
|
|
*/
|
|
|
|
# ifndef d_m3MaxFunctionStackHeight
|
|
# if defined(ESP8266) || defined(ESP32) || defined(ARDUINO_AMEBA) || defined(TEENSYDUINO)
|
|
# define d_m3MaxFunctionStackHeight 128
|
|
# endif
|
|
# endif
|
|
|
|
# ifndef d_m3FixedHeap
|
|
# if defined(ARDUINO_AMEBA)
|
|
# define d_m3FixedHeap (128*1024)
|
|
# elif defined(BLUE_PILL) || defined(FOMU)
|
|
# define d_m3FixedHeap (12*1024)
|
|
# elif defined(ARDUINO_ARCH_ARC32) // Arduino 101
|
|
# define d_m3FixedHeap (10*1024)
|
|
# endif
|
|
# endif
|
|
|
|
/*
|
|
* Platform-specific defaults
|
|
*/
|
|
|
|
# if defined(ARDUINO) || defined(PARTICLE) || defined(PLATFORMIO) || defined(__MBED__) || \
|
|
defined(ESP8266) || defined(ESP32) || defined(BLUE_PILL) || defined(WM_W600) || defined(FOMU)
|
|
# ifndef d_m3CascadedOpcodes
|
|
# define d_m3CascadedOpcodes 0
|
|
# endif
|
|
# ifndef d_m3VerboseErrorMessages
|
|
# define d_m3VerboseErrorMessages 0
|
|
# endif
|
|
# ifndef d_m3MaxConstantTableSize
|
|
# define d_m3MaxConstantTableSize 64
|
|
# endif
|
|
# ifndef d_m3MaxFunctionStackHeight
|
|
# define d_m3MaxFunctionStackHeight 64
|
|
# endif
|
|
# ifndef d_m3CodePageAlignSize
|
|
# define d_m3CodePageAlignSize 1024
|
|
# endif
|
|
# endif
|
|
|
|
/*
|
|
* Arch-specific defaults
|
|
*/
|
|
#if defined(__riscv) && (__riscv_xlen == 64)
|
|
# ifndef d_m3Use32BitSlots
|
|
# define d_m3Use32BitSlots 0
|
|
# endif
|
|
#endif
|
|
|
|
#endif // m3_config_platforms_h
|