241 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			V
		
	
	
module compiler
 | 
						|
 | 
						|
const (
 | 
						|
	c_common_macros = '
 | 
						|
 | 
						|
#define EMPTY_STRUCT_DECLARATION
 | 
						|
#define EMPTY_STRUCT_INITIALIZATION 0
 | 
						|
// Due to a tcc bug, the length of an array needs to be specified, but GCC crashes if it is...
 | 
						|
#define EMPTY_ARRAY_OF_ELEMS(x,n) (x[])
 | 
						|
#define TCCSKIP(x) x
 | 
						|
 | 
						|
#ifdef __TINYC__
 | 
						|
#undef EMPTY_STRUCT_DECLARATION
 | 
						|
#undef EMPTY_STRUCT_INITIALIZATION
 | 
						|
#define EMPTY_STRUCT_DECLARATION char _dummy
 | 
						|
#define EMPTY_STRUCT_INITIALIZATION 0
 | 
						|
#undef EMPTY_ARRAY_OF_ELEMS
 | 
						|
#define EMPTY_ARRAY_OF_ELEMS(x,n) (x[n])
 | 
						|
#undef TCCSKIP
 | 
						|
#define TCCSKIP(x)
 | 
						|
#endif
 | 
						|
 | 
						|
// for __offset_of
 | 
						|
#ifndef __offsetof
 | 
						|
#define __offsetof(s,memb) \\
 | 
						|
    ((size_t)((char *)&((s *)0)->memb - (char *)0))
 | 
						|
#endif
 | 
						|
 | 
						|
#define OPTION_CAST(x) (x)
 | 
						|
'
 | 
						|
	c_headers = '
 | 
						|
 | 
						|
//#include <inttypes.h>  // int64_t etc
 | 
						|
#include <stdio.h>  // TODO remove all these includes, define all function signatures and types manually
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
//#include "fns.h"
 | 
						|
#include <signal.h>
 | 
						|
#include <stdarg.h> // for va_list
 | 
						|
#include <string.h> // memcpy
 | 
						|
 | 
						|
#if INTPTR_MAX == INT32_MAX
 | 
						|
    #define TARGET_IS_32BIT 1
 | 
						|
#elif INTPTR_MAX == INT64_MAX
 | 
						|
    #define TARGET_IS_64BIT 1
 | 
						|
#else
 | 
						|
    #error "The environment is not 32 or 64-bit."
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ || defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || defined(__BIG_ENDIAN__) || defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || defined(_MIBSEB) || defined(__MIBSEB) || defined(__MIBSEB__)
 | 
						|
    #define TARGET_ORDER_IS_BIG
 | 
						|
#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN || defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IX86)
 | 
						|
    #define TARGET_ORDER_IS_LITTLE
 | 
						|
#else
 | 
						|
    #error "Unknown architecture endianness"
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef _WIN32
 | 
						|
#include <ctype.h>
 | 
						|
#include <locale.h> // tolower
 | 
						|
#include <sys/time.h>
 | 
						|
#include <unistd.h> // sleep
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(__CYGWIN__) && !defined(_WIN32)
 | 
						|
#error Cygwin is not supported, please use MinGW or Visual Studio.
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef __linux__
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/wait.h> // os__wait uses wait on nix
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __FreeBSD__
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/wait.h> // os__wait uses wait on nix
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __DragonFly__
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/wait.h> // os__wait uses wait on nix
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __OpenBSD__
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/resource.h>
 | 
						|
#include <sys/wait.h> // os__wait uses wait on nix
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef __NetBSD__
 | 
						|
#include <sys/wait.h> // os__wait uses wait on nix
 | 
						|
#endif
 | 
						|
 | 
						|
$c_common_macros
 | 
						|
 | 
						|
#ifdef _WIN32
 | 
						|
#define WINVER 0x0600
 | 
						|
#ifdef _WIN32_WINNT
 | 
						|
#undef _WIN32_WINNT
 | 
						|
#endif
 | 
						|
#define _WIN32_WINNT 0x0600
 | 
						|
#define WIN32_LEAN_AND_MEAN
 | 
						|
#define _UNICODE
 | 
						|
#define UNICODE
 | 
						|
#include <windows.h>
 | 
						|
 | 
						|
#include <io.h> // _waccess
 | 
						|
#include <direct.h> // _wgetcwd
 | 
						|
//#include <WinSock2.h>
 | 
						|
#ifdef _MSC_VER
 | 
						|
// On MSVC these are the same (as long as /volatile:ms is passed)
 | 
						|
#define _Atomic volatile
 | 
						|
 | 
						|
// MSVC cannot parse some things properly
 | 
						|
#undef EMPTY_STRUCT_DECLARATION
 | 
						|
#undef OPTION_CAST
 | 
						|
 | 
						|
#define EMPTY_STRUCT_DECLARATION int ____dummy_variable
 | 
						|
#define OPTION_CAST(x)
 | 
						|
 | 
						|
#include <dbghelp.h>
 | 
						|
#pragma comment(lib, "Dbghelp.lib")
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
#else
 | 
						|
#include <pthread.h>
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
//============================== HELPER C MACROS =============================*/
 | 
						|
#define _PUSH(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push(arr, &tmp);}
 | 
						|
#define _PUSH_MANY(arr, val, tmp, tmp_typ) {tmp_typ tmp = (val); array_push_many(arr, tmp.data, tmp.len);}
 | 
						|
#define _IN(typ, val, arr) array_##typ##_contains(arr, val)
 | 
						|
#define _IN_MAP(val, m) map_exists(m, val)
 | 
						|
#define DEFAULT_EQUAL(a, b) (a == b)
 | 
						|
#define DEFAULT_NOT_EQUAL(a, b) (a != b)
 | 
						|
#define DEFAULT_LT(a, b) (a < b)
 | 
						|
#define DEFAULT_LE(a, b) (a <= b)
 | 
						|
#define DEFAULT_GT(a, b) (a > b)
 | 
						|
#define DEFAULT_GE(a, b) (a >= b)
 | 
						|
 | 
						|
// NB: macro_fXX_eq and macro_fXX_ne are NOT used 
 | 
						|
// in the generated C code. They are here just for 
 | 
						|
// completeness/testing.
 | 
						|
 | 
						|
#define macro_f64_eq(a, b) (a == b)
 | 
						|
#define macro_f64_ne(a, b) (a != b)
 | 
						|
#define macro_f64_lt(a, b) (a <  b)
 | 
						|
#define macro_f64_le(a, b) (a <= b)
 | 
						|
#define macro_f64_gt(a, b) (a >  b)
 | 
						|
#define macro_f64_ge(a, b) (a >= b)
 | 
						|
 | 
						|
#define macro_f32_eq(a, b) (a == b)
 | 
						|
#define macro_f32_ne(a, b) (a != b)
 | 
						|
#define macro_f32_lt(a, b) (a <  b)
 | 
						|
#define macro_f32_le(a, b) (a <= b)
 | 
						|
#define macro_f32_gt(a, b) (a >  b)
 | 
						|
#define macro_f32_ge(a, b) (a >= b)
 | 
						|
 | 
						|
//================================== GLOBALS =================================*/
 | 
						|
byte g_str_buf[1024];
 | 
						|
int load_so(byteptr);
 | 
						|
void reload_so();
 | 
						|
 | 
						|
'
 | 
						|
	js_headers = '
 | 
						|
 | 
						|
var array_string = function() {}
 | 
						|
var array_byte = function() {}
 | 
						|
var array_int = function() {}
 | 
						|
var byte = function() {}
 | 
						|
var double = function() {}
 | 
						|
var int = function() {}
 | 
						|
var f64 = function() {}
 | 
						|
var f32 = function() {}
 | 
						|
var i64 = function() {}
 | 
						|
var i32 = function() {}
 | 
						|
var i16 = function() {}
 | 
						|
var u64 = function() {}
 | 
						|
var u32 = function() {}
 | 
						|
var u16 = function() {}
 | 
						|
var i8 = function() {}
 | 
						|
var bool = function() {}
 | 
						|
var rune = function() {}
 | 
						|
var map_string = function() {}
 | 
						|
var map_int = function() {}
 | 
						|
 | 
						|
'
 | 
						|
	c_builtin_types = '
 | 
						|
 | 
						|
//#include <inttypes.h>  // int64_t etc
 | 
						|
//#include <stdint.h>  // int64_t etc
 | 
						|
 | 
						|
//================================== TYPEDEFS ================================*/
 | 
						|
 | 
						|
typedef int64_t i64;
 | 
						|
typedef int16_t i16;
 | 
						|
typedef int8_t i8;
 | 
						|
typedef uint64_t u64;
 | 
						|
typedef uint32_t u32;
 | 
						|
typedef uint16_t u16;
 | 
						|
typedef uint8_t byte;
 | 
						|
typedef uint32_t rune;
 | 
						|
typedef float f32;
 | 
						|
typedef double f64;
 | 
						|
typedef unsigned char* byteptr;
 | 
						|
typedef int* intptr;
 | 
						|
typedef void* voidptr;
 | 
						|
typedef char* charptr;
 | 
						|
typedef struct array array;
 | 
						|
typedef struct map map;
 | 
						|
typedef array array_string;
 | 
						|
typedef array array_int;
 | 
						|
typedef array array_byte;
 | 
						|
typedef array array_f32;
 | 
						|
typedef array array_f64;
 | 
						|
typedef array array_u16;
 | 
						|
typedef array array_u32;
 | 
						|
typedef array array_u64;
 | 
						|
typedef map map_int;
 | 
						|
typedef map map_string;
 | 
						|
#ifndef bool
 | 
						|
	typedef int bool;
 | 
						|
	#define true 1
 | 
						|
	#define false 0
 | 
						|
#endif
 | 
						|
'
 | 
						|
	bare_c_headers = '
 | 
						|
 | 
						|
$c_common_macros
 | 
						|
 | 
						|
#ifndef exit
 | 
						|
#define exit(rc) sys_exit(rc)
 | 
						|
void sys_exit (int);
 | 
						|
#endif
 | 
						|
'
 | 
						|
)
 | 
						|
 |