-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlib.go
More file actions
128 lines (117 loc) · 4.51 KB
/
Copy pathlib.go
File metadata and controls
128 lines (117 loc) · 4.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main
/*
#include <stdlib.h>
// Forward-declare LLVMAddSymbol so the JIT can resolve host functions.
extern void LLVMAddSymbol(const char *name, void *addr);
// All runtime functions are defined in lib.c (also used for native linking).
extern double printd(double x);
extern double printi(double x);
extern double putchard(double x);
extern double println(double x);
extern int64_t print_int(int64_t x);
extern int64_t print_bool(int64_t x);
extern const char* print_str(const char* s);
extern double acos_(double x);
extern double asin_(double x);
extern double atan_(double x);
extern double atan2_(double x, double y);
extern double ceil_(double x);
extern double cos_(double x);
extern double cosh_(double x);
extern double exp_(double x);
extern double exp2_(double x);
extern double floor_(double x);
extern double fmod_(double x, double y);
extern double log_(double x);
extern double log2_(double x);
extern double log10_(double x);
extern double pow_(double x, double y);
extern double sin_(double x);
extern double sinh_(double x);
extern double sqrt_(double x);
extern double tan_(double x);
extern double tanh_(double x);
extern void* get_printd_addr(void);
extern void* get_printi_addr(void);
extern void* get_putchard_addr(void);
extern void* get_println_addr(void);
extern void* get_print_int_addr(void);
extern void* get_print_bool_addr(void);
extern void* get_print_str_addr(void);
extern void* get_acos__addr(void);
extern void* get_asin__addr(void);
extern void* get_atan__addr(void);
extern void* get_atan2__addr(void);
extern void* get_ceil__addr(void);
extern void* get_cos__addr(void);
extern void* get_cosh__addr(void);
extern void* get_exp__addr(void);
extern void* get_exp2__addr(void);
extern void* get_floor__addr(void);
extern void* get_fmod__addr(void);
extern void* get_log__addr(void);
extern void* get_log2__addr(void);
extern void* get_log10__addr(void);
extern void* get_pow__addr(void);
extern void* get_sin__addr(void);
extern void* get_sinh__addr(void);
extern void* get_sqrt__addr(void);
extern void* get_tan__addr(void);
extern void* get_tanh__addr(void);
extern double call_fn_ptr(void* fn);
extern int64_t call_fn_int_ptr(void* fn);
// llvm_add_symbol wraps LLVMAddSymbol for Go to call.
static void llvm_add_symbol(const char* name, void* addr) {
LLVMAddSymbol(name, addr);
}
*/
import "C"
import "unsafe"
// hostSymbolAddrs returns the host addresses of the C functions so the
// JIT engine can resolve calls to them.
func hostSymbolAddrs() map[string]unsafe.Pointer {
return map[string]unsafe.Pointer{
"printd": unsafe.Pointer(C.get_printd_addr()),
"printi": unsafe.Pointer(C.get_printi_addr()),
"putchard": unsafe.Pointer(C.get_putchard_addr()),
"println": unsafe.Pointer(C.get_println_addr()),
"print_int": unsafe.Pointer(C.get_print_int_addr()),
"print_bool": unsafe.Pointer(C.get_print_bool_addr()),
"print_str": unsafe.Pointer(C.get_print_str_addr()),
"acos_": unsafe.Pointer(C.get_acos__addr()),
"asin_": unsafe.Pointer(C.get_asin__addr()),
"atan_": unsafe.Pointer(C.get_atan__addr()),
"atan2_": unsafe.Pointer(C.get_atan2__addr()),
"ceil_": unsafe.Pointer(C.get_ceil__addr()),
"cos_": unsafe.Pointer(C.get_cos__addr()),
"cosh_": unsafe.Pointer(C.get_cosh__addr()),
"exp_": unsafe.Pointer(C.get_exp__addr()),
"exp2_": unsafe.Pointer(C.get_exp2__addr()),
"floor_": unsafe.Pointer(C.get_floor__addr()),
"fmod_": unsafe.Pointer(C.get_fmod__addr()),
"log_": unsafe.Pointer(C.get_log__addr()),
"log2_": unsafe.Pointer(C.get_log2__addr()),
"log10_": unsafe.Pointer(C.get_log10__addr()),
"pow_": unsafe.Pointer(C.get_pow__addr()),
"sin_": unsafe.Pointer(C.get_sin__addr()),
"sinh_": unsafe.Pointer(C.get_sinh__addr()),
"sqrt_": unsafe.Pointer(C.get_sqrt__addr()),
"tan_": unsafe.Pointer(C.get_tan__addr()),
"tanh_": unsafe.Pointer(C.get_tanh__addr()),
}
}
// callNativeFunc invokes a no-arg native function pointer that returns double.
func callNativeFunc(fnPtr unsafe.Pointer) float64 {
return float64(C.call_fn_ptr(fnPtr))
}
// callNativeFuncInt invokes a no-arg native function pointer that returns int64.
func callNativeFuncInt(fnPtr unsafe.Pointer) int64 {
return int64(C.call_fn_int_ptr(fnPtr))
}
// registerLLVMSymbol registers a host symbol with LLVM's global symbol table
// so the JIT can resolve calls to it.
func registerLLVMSymbol(name string, addr unsafe.Pointer) {
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
C.llvm_add_symbol(cname, addr)
}