#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(__APPLE__) #include #else #include #endif #if !defined(__SIZEOF_POINTER__) #error pointer size unknown #elif __SIZEOF_POINTER__ == 8 #define BITS64 #if defined(__aarch64__) // this one's special since aarch64 may use tagged pointers #define FWD_BIT (1ULL<<55) #endif #endif #if !defined(FWD_BIT) #if defined(BITS64) #define FWD_BIT (sl_v)(1ULL<<63) #else #define FWD_BIT (sl_v)(1U<<31) #endif #endif #if defined(__linux__) #define __os_name__ "linux" #elif defined(__OpenBSD__) #define __os_name__ "openbsd" #elif defined(__FreeBSD__) #define __os_name__ "freebsd" #elif defined(__NetBSD__) #define __os_name__ "netbsd" #elif defined(__DragonFly__) #define __os_name__ "dragonflybsd" #elif defined(__APPLE__) #define __os_name__ "macosx" #elif defined(__HAIKU__) #define __os_name__ "haiku" // FIXME(sigrid): why is this not exposed? int vdprintf(int fd, const char *restrict format, va_list ap); #elif defined(__sun__) #define __os_name__ "sun" #undef FWD_BIT // mmap returns top bits set, let's not bother at all #else #define __os_name__ "unknown" #endif extern char *os_version; #define __os_version__ os_version #define SYS_DEV_NULL "/dev/null" typedef sigjmp_buf sl_jmp_buf; #define sl_setjmp(e) sigsetjmp((e), 0) #define sl_longjmp(e, v) siglongjmp((e), (v)) #define sys_exit(status, code) do{ \ exit((status) == nil && (code) == 0 ? 0 : (code)); \ }while(0) #define sysfatal(...) do{ \ fprintf(stderr, __VA_ARGS__); \ fputc('\n', stderr); \ exit(99); \ }while(0) #define getcallerpc(a) __builtin_extract_return_addr(__builtin_return_address(0)) #define sys_setcallpc(arg) do{sl.cpc = getcallerpc(&arg); USED(arg);}while(0) void sys_setcurrpc(int dummy); void sys_seed(void *p, int sz); #define nil NULL #define USED(x) ((void)(x)) #define nelem(x) (int)(sizeof(x)/sizeof((x)[0])) #if !defined(UBSAN) #if defined(__386__) || defined(__x86_64__) || defined(__aarch64__) #define MEM_UNALIGNED_ACCESS #endif #endif #include "inc/cc.h" #include "inc/mem.h" #include "mp.h" #include "utf.h"