forked from Ports/perfect_dark
91 lines
2.1 KiB
C
91 lines
2.1 KiB
C
#ifndef _IN_PLATFORM_H
|
|
#define _IN_PLATFORM_H
|
|
|
|
// detect OS
|
|
#if defined(_WIN32)
|
|
#define PLATFORM_WIN32 1
|
|
#elif defined(__SWITCH__)
|
|
#define PLATFORM_POSIX 1
|
|
#define PLATFORM_NSWITCH 1
|
|
#elif defined(__linux__)
|
|
#define PLATFORM_POSIX 1
|
|
#define PLATFORM_LINUX 1
|
|
#else
|
|
// assume POSIX-compatible
|
|
#define PLATFORM_POSIX 1
|
|
#warning "Unknown OS. Please add it to platform.h."
|
|
#endif
|
|
|
|
// detect arch
|
|
#if defined(__x86_64__) || defined(_M_X64)
|
|
#define PLATFORM_X86_64 1
|
|
#define PLATFORM_64BIT 1
|
|
#elif defined(__i386__) || defined(_X86_) || defined(_M_IX86)
|
|
#define PLATFORM_X86 1
|
|
#elif defined(__aarch64__) || defined(_M_ARM64)
|
|
#define PLATFORM_ARM 8
|
|
#define PLATFORM_64BIT 1
|
|
#elif defined(__arm__) || defined(_M_ARM)
|
|
// assume armv7
|
|
#define PLATFORM_ARM 7
|
|
#else
|
|
#error "Unknown CPU arch."
|
|
#endif
|
|
|
|
// detect endianness
|
|
#if defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__)
|
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
#define PLATFORM_BIG_ENDIAN 1
|
|
#else
|
|
#define PLATFORM_LITTLE_ENDIAN 1
|
|
#endif
|
|
#elif __BIG_ENDIAN__
|
|
#define PLATFORM_BIG_ENDIAN 1
|
|
#else
|
|
#error "Could not determine endianness."
|
|
#endif
|
|
|
|
// byteswap macros
|
|
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
#define PD_BSWAP16(x) __builtin_bswap16(x)
|
|
#define PD_BSWAP32(x) __builtin_bswap32(x)
|
|
#define PD_BSWAP64(x) __builtin_bswap64(x)
|
|
#else
|
|
#error "Implement PD_BSWAP macros for your compiler."
|
|
#endif
|
|
|
|
#ifdef PLATFORM_BIG_ENDIAN
|
|
#define PD_BE16(x) (x)
|
|
#define PD_BE32(x) (x)
|
|
#define PD_BE64(x) (x)
|
|
#define PD_LE16(x) PD_BSWAP16(x)
|
|
#define PD_LE32(x) PD_BSWAP32(x)
|
|
#define PD_LE64(x) PD_BSWAP64(x)
|
|
#else
|
|
#define PD_BE16(x) PD_BSWAP16(x)
|
|
#define PD_BE32(x) PD_BSWAP32(x)
|
|
#define PD_BE64(x) PD_BSWAP64(x)
|
|
#define PD_LE16(x) (x)
|
|
#define PD_LE32(x) (x)
|
|
#define PD_LE64(x) (x)
|
|
#endif
|
|
|
|
// TODO: use uintptr_t or something
|
|
#ifdef PLATFORM_64BIT
|
|
#define PD_BEPTR(x) PD_BE64(x)
|
|
#define PD_LEPTR(x) PD_LE64(x)
|
|
#else
|
|
#define PD_BEPTR(x) PD_BE32(x)
|
|
#define PD_LEPTR(x) PD_LE32(x)
|
|
#endif
|
|
|
|
// module constructor function attribute
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
#define PD_CONSTRUCTOR __attribute__((constructor))
|
|
#else
|
|
#error "Implement PD_CONSTRUCTOR macro for your compiler."
|
|
#endif
|
|
|
|
#endif
|