orca/src/platform/platform.h

127 lines
3.4 KiB
C

/*************************************************************************
*
* Orca
* Copyright 2023 Martin Fouilleul and the Orca project contributors
* See LICENSE.txt for licensing information
*
**************************************************************************/
#ifndef __PLATFORM_H_
#define __PLATFORM_H_
//-----------------------------------------------------------------
// Compiler identification
//-----------------------------------------------------------------
#if defined(__clang__)
#define OC_COMPILER_CLANG 1
#if defined(__apple_build_version__)
#define OC_COMPILER_CLANG_APPLE 1
#elif defined(_MSC_VER)
#define OC_COMPILER_CLANG_CL 1
#endif
#elif defined(_MSC_VER)
#define OC_COMPILER_CL 1
#elif defined(__GNUC__)
#define OC_COMPILER_GCC 1
#else
#error "Can't identify compiler"
#endif
//-----------------------------------------------------------------
// OS identification
//-----------------------------------------------------------------
#if defined(_WIN64)
#define OC_PLATFORM_WINDOWS 1
#elif defined(_WIN32)
#error "Unsupported OS (32bit only version of Windows)"
#elif defined(__APPLE__) && defined(__MACH__)
#define OC_PLATFORM_MACOS 1
#elif defined(__gnu_linux__)
#define PLATFORM_LINUX 1
#elif defined(__ORCA__)
#define OC_PLATFORM_ORCA 1
#else
#error "Can't identify platform"
#endif
//-----------------------------------------------------------------
// Architecture identification
//-----------------------------------------------------------------
#if defined(OC_COMPILER_CL)
#if defined(_M_AMD64)
#define OC_ARCH_X64 1
#elif defined(_M_I86)
#define OC_ARCH_X86 1
#elif defined(_M_ARM64)
#define OC_ARCH_ARM64 1
#elif defined(_M_ARM)
#define OC_ARCH_ARM32 1
#else
#error "Can't identify architecture"
#endif
#else
#if defined(__x86_64__)
#define OC_ARCH_X64 1
#elif defined(__i386__)
#define OC_ARCH_X86 1
#elif defined(__arm__)
#define OC_ARCH_ARM32 1
#elif defined(__aarch64__)
#define OC_ARCH_ARM64 1
#elif defined(__ORCA__)
#define OC_ARCH_WASM32 1
#else
#error "Can't identify architecture"
#endif
#endif
//-----------------------------------------------------------------
// platform helper macros
//-----------------------------------------------------------------
#if defined(OC_COMPILER_CL)
#if defined(OC_BUILD_DLL)
#define ORCA_API __declspec(dllexport)
#else
#define ORCA_API __declspec(dllimport)
#endif
#elif defined(OC_COMPILER_GCC) || defined(OC_COMPILER_CLANG)
#define ORCA_API
#endif
#if OC_PLATFORM_ORCA
#define oc_thread_local // no tls (or threads) for now on wasm orca
#elif defined(OC_COMPILER_CL)
#define oc_thread_local __declspec(thread)
#elif defined(OC_COMPILER_GCC) || defined(OC_COMPILER_CLANG)
#define oc_thread_local __thread
#endif
#if OC_PLATFORM_ORCA
#define ORCA_IMPORT(f) __attribute__((import_name(#f))) f
#if OC_COMPILER_CLANG
#define ORCA_EXPORT __attribute__((visibility("default")))
#else
#error "Orca apps can only be compiled with clang for now"
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef enum
{
OC_HOST_PLATFORM_MACOS,
OC_HOST_PLATFORM_WINDOWS,
} oc_host_platform;
ORCA_API oc_host_platform oc_get_host_platform();
#ifdef __cplusplus
} // extern "C"
#endif
#endif // __PLATFORM_H_