Skip to content

Commit 79c84d3

Browse files
committed
[wasm64] making JS bindings wasm64 aware
1 parent 73c20f6 commit 79c84d3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+394
-117
lines changed

embuilder.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ def main():
124124
help='build relocatable objects for suitable for dynamic linking')
125125
parser.add_argument('--force', action='store_true',
126126
help='force rebuild of target (by removing it first)')
127+
parser.add_argument('--wasm64', action='store_true',
128+
help='use wasm64 architecture')
127129
parser.add_argument('operation', help='currently only "build" is supported')
128130
parser.add_argument('targets', nargs='+', help='see below')
129131
args = parser.parse_args()
@@ -144,6 +146,9 @@ def main():
144146
if args.pic:
145147
settings.RELOCATABLE = 1
146148

149+
if args.wasm64:
150+
settings.MEMORY64 = 2
151+
147152
if args.force:
148153
force = True
149154

emscripten.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ def update_settings_glue(metadata, DEBUG):
127127

128128
# start with the MVP features, and add any detected features.
129129
settings.BINARYEN_FEATURES = ['--mvp-features'] + metadata['features']
130+
if settings.MEMORY64 and '--enable-memory64' not in settings.BINARYEN_FEATURES:
131+
settings.BINARYEN_FEATURES += ['--enable-memory64']
130132
if settings.USE_PTHREADS:
131133
assert '--enable-threads' in settings.BINARYEN_FEATURES
132134
if settings.MEMORY64:

src/embind/embind.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ var LibraryEmbind = {
405405
},
406406

407407
$heap32VectorToArray: function(count, firstElement) {
408+
{{{ from64('firstElement') }}}
408409
var array = [];
409410
for (var i = 0; i < count; i++) {
410411
array.push(HEAP32[(firstElement >> 2) + i]);
@@ -476,6 +477,7 @@ var LibraryEmbind = {
476477

477478
$getShiftFromSize__deps: [],
478479
$getShiftFromSize: function(size) {
480+
{{{ from64('size') }}}
479481
switch (size) {
480482
case 1: return 0;
481483
case 2: return 1;
@@ -874,6 +876,10 @@ var LibraryEmbind = {
874876
Uint32Array,
875877
Float32Array,
876878
Float64Array,
879+
#if WASM_BIGINT
880+
BigInt64Array,
881+
BigUint64Array,
882+
#endif
877883
];
878884

879885
var TA = typeMapping[dataTypeIndex];

src/library.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ LibraryManager.library = {
9191
utime__proxy: 'sync',
9292
utime__sig: 'iii',
9393
utime: function(path, times) {
94+
{{{ from64('times') }}};
9495
// int utime(const char *path, const struct utimbuf *times);
9596
// http://pubs.opengroup.org/onlinepubs/009695399/basedefs/utime.h.html
9697
var time;
@@ -294,7 +295,7 @@ LibraryManager.library = {
294295

295296
// Memory resize rules:
296297
// 1. Always increase heap size to at least the requested size, rounded up to next page multiple.
297-
// 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap geometrically: increase the heap size according to
298+
// 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap geometrically: increase the heap size according to
298299
// MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%),
299300
// At most overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB).
300301
// 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap linearly: increase the heap size by at least MEMORY_GROWTH_LINEAR_STEP bytes.
@@ -519,6 +520,7 @@ LibraryManager.library = {
519520

520521
time__sig: 'ii',
521522
time: function(ptr) {
523+
{{{ from64('ptr') }}};
522524
var ret = (Date.now()/1000)|0;
523525
if (ptr) {
524526
{{{ makeSetValue('ptr', 0, 'ret', 'i32') }}};
@@ -722,7 +724,7 @@ LibraryManager.library = {
722724
var summerOffset = summer.getTimezoneOffset();
723725

724726
// Local standard timezone offset. Local standard time is not adjusted for daylight savings.
725-
// This code uses the fact that getTimezoneOffset returns a greater value during Standard Time versus Daylight Saving Time (DST).
727+
// This code uses the fact that getTimezoneOffset returns a greater value during Standard Time versus Daylight Saving Time (DST).
726728
// Thus it determines the expected output during Standard Time, and it compares whether the output of the given date the same (Standard) or less (DST).
727729
var stdTimezoneOffset = Math.max(winterOffset, summerOffset);
728730

@@ -3254,6 +3256,7 @@ LibraryManager.library = {
32543256
$readAsmConstArgsArray: '=[]',
32553257
$readAsmConstArgs__deps: ['$readAsmConstArgsArray'],
32563258
$readAsmConstArgs: function(sigPtr, buf) {
3259+
{{{ from64(['sigPtr', 'buf']) }}};
32573260
#if ASSERTIONS
32583261
// Nobody should have mutated _readAsmConstArgsArray underneath us to be something else than an array.
32593262
assert(Array.isArray(readAsmConstArgsArray));
@@ -3771,20 +3774,26 @@ LibraryManager.library = {
37713774
// mode are created here and imported by the module.
37723775
// Mark with `__import` so these are usable from native code. This is needed
37733776
// because, by default, only functions can be be imported.
3774-
__stack_pointer: "new WebAssembly.Global({'value': 'i32', 'mutable': true}, {{{ STACK_BASE }}})",
3777+
__stack_pointer:
3778+
"new WebAssembly.Global({'value': '{{{ SIZE_TYPE }}}', 'mutable': true}, {{{ to64(STACK_BASE) }}})",
37753779
__stack_pointer__import: true,
37763780
// tell the memory segments where to place themselves
3777-
__memory_base: '{{{ GLOBAL_BASE }}}',
3781+
__memory_base:
3782+
"new WebAssembly.Global({'value': '{{{ SIZE_TYPE}}}', 'mutable': false}, {{{ to64(GLOBAL_BASE) }}})",
37783783
__memory_base__import: true,
37793784
// the wasm backend reserves slot 0 for the NULL function pointer
3780-
__table_base: 1,
3785+
__table_base:
3786+
"new WebAssembly.Global({'value': '{{{ SIZE_TYPE }}}', 'mutable': false}, {{{ to64(1) }}})",
37813787
__table_base__import: true,
3788+
#if MEMORY64
3789+
__table_base32: 1,
3790+
#endif
37823791
// To support such allocations during startup, track them on __heap_base and
37833792
// then when the main module is loaded it reads that value and uses it to
37843793
// initialize sbrk (the main module is relocatable itself, and so it does not
37853794
// have __heap_base hardcoded into it - it receives it from JS as an extern
37863795
// global, basically).
3787-
__heap_base: '{{{ HEAP_BASE }}}',
3796+
__heap_base: '{{{ to64(HEAP_BASE) }}}',
37883797
__heap_base__import: true,
37893798
#endif
37903799
};

src/library_dylink.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ var LibraryDylink = {
4343
$GOTHandler: {
4444
'get': function(obj, symName) {
4545
if (!GOT[symName]) {
46-
GOT[symName] = new WebAssembly.Global({'value': 'i32', 'mutable': true});
46+
GOT[symName] = new WebAssembly.Global({'value':
47+
#if MEMORY64
48+
'i64',
49+
#else
50+
'i32',
51+
#endif
52+
'mutable': true});
4753
#if DYLINK_DEBUG
4854
err("new GOT entry: " + symName);
4955
#endif
@@ -97,6 +103,8 @@ var LibraryDylink = {
97103
#endif
98104
} else if (typeof value === 'number') {
99105
GOT[symName].value = value;
106+
} else if (typeof value === 'bigint') {
107+
GOT[symName].value = Number(value);
100108
} else {
101109
err("unhandled export type for `" + symName + "`: " + (typeof value));
102110
}

src/library_exceptions.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,17 @@ var LibraryExceptions = {
120120
};
121121

122122
this.set_adjusted_ptr = function(adjustedPtr) {
123-
{{{ makeSetValue('this.ptr', Runtime.POINTER_SIZE, 'adjustedPtr', '*') }}};
123+
var ptrSize = {{{ `${Runtime.POINTER_SIZE}` }}};
124+
{{{ makeSetValue('this.ptr', 'ptrSize', 'adjustedPtr', '*') }}};
124125
};
125126

126127
this.get_adjusted_ptr_addr = function() {
127128
return this.ptr + {{{ Runtime.POINTER_SIZE }}};
128129
}
129130

130131
this.get_adjusted_ptr = function() {
131-
return {{{ makeGetValue('this.ptr', Runtime.POINTER_SIZE, '*') }}};
132+
var ptrSize = {{{ `${Runtime.POINTER_SIZE}` }}};
133+
return {{{ makeGetValue('this.ptr', 'ptrSize', '*') }}};
132134
};
133135

134136
// Get pointer which is expected to be received by catch clause in C++ code. It may be adjusted
@@ -153,7 +155,7 @@ var LibraryExceptions = {
153155
};
154156

155157
if (ptr === undefined) {
156-
this.ptr = _malloc({{{ Runtime.POINTER_SIZE * 2 }}});
158+
this.ptr = _malloc({{{ `${Runtime.POINTER_SIZE}` * 2 }}});
157159
this.set_adjusted_ptr(0);
158160
} else {
159161
this.ptr = ptr;

src/library_formatString.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ mergeInto(LibraryManager.library, {
5252
#endif
5353
],
5454
$formatString: function(format, varargs) {
55+
{{{ from64(['format', 'varargs']) }}};
5556
#if ASSERTIONS
5657
assert((varargs & 3) === 0);
5758
#endif
@@ -470,6 +471,7 @@ mergeInto(LibraryManager.library, {
470471
// printf/puts/strlen implementations for when musl is not pulled in - very
471472
// partial. useful for tests, and when bootstrapping structInfo
472473
strlen: function(ptr) {
474+
{{{ from64('ptr') }}};
473475
var end = ptr;
474476
while (HEAPU8[end]) ++end;
475477
return end - ptr;

src/library_glfw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,7 @@ var LibraryGLFW = {
12411241
glfwGetMonitors: function(count) {
12421242
setValue(count, 1, 'i32');
12431243
if (!GLFW.monitors) {
1244-
GLFW.monitors = {{{ makeMalloc('glfwGetMonitors', Runtime.POINTER_SIZE) }}};
1244+
GLFW.monitors = {{{ makeMalloc('glfwGetMonitors', `${Runtime.POINTER_SIZE}`) }}};
12451245
setValue(GLFW.monitors, 1, 'i32');
12461246
}
12471247
return GLFW.monitors;

src/library_syscall.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,7 @@ var SyscallsLibrary = {
679679
for (var i = 0; i < num; i++) {
680680
var iovbase = {{{ makeGetValue('iov', '(' + C_STRUCTS.iovec.__size__ + ' * i) + ' + C_STRUCTS.iovec.iov_base, 'i8*') }}};
681681
var iovlen = {{{ makeGetValue('iov', '(' + C_STRUCTS.iovec.__size__ + ' * i) + ' + C_STRUCTS.iovec.iov_len, 'i32') }}};
682-
for (var j = 0; j < iovlen; j++) {
682+
for (var j = 0; j < iovlen; j++) {
683683
view[offset++] = {{{ makeGetValue('iovbase', 'j', 'i8') }}};
684684
}
685685
}
@@ -796,7 +796,7 @@ var SyscallsLibrary = {
796796
#endif
797797

798798
var total = 0;
799-
799+
800800
var srcReadLow = (readfds ? {{{ makeGetValue('readfds', 0, 'i32') }}} : 0),
801801
srcReadHigh = (readfds ? {{{ makeGetValue('readfds', 4, 'i32') }}} : 0);
802802
var srcWriteLow = (writefds ? {{{ makeGetValue('writefds', 0, 'i32') }}} : 0),
@@ -863,7 +863,7 @@ var SyscallsLibrary = {
863863
{{{ makeSetValue('exceptfds', '0', 'dstExceptLow', 'i32') }}};
864864
{{{ makeSetValue('exceptfds', '4', 'dstExceptHigh', 'i32') }}};
865865
}
866-
866+
867867
return total;
868868
},
869869
__sys_msync: function(addr, len, flags) {
@@ -1425,6 +1425,18 @@ function wrapSyscallFunction(x, library, isWasi) {
14251425
var bodyEnd = t.lastIndexOf('}');
14261426
t = t.substring(0, bodyEnd) + post + t.substring(bodyEnd);
14271427
}
1428+
1429+
if (MEMORY64 && !isWasi) {
1430+
t = modifyFunction(t, function(name, args, body) {
1431+
var argnums = args.split(",").map((a) => 'Number(' + a + ')').join();
1432+
return 'function ' + name + '(' + args + ') {\n' +
1433+
' return BigInt((function ' + name + '_inner(' + args + ') {\n' +
1434+
body +
1435+
' })(' + argnums + '));' +
1436+
'}';
1437+
});
1438+
}
1439+
14281440
library[x] = eval('(' + t + ')');
14291441
if (!library[x + '__deps']) library[x + '__deps'] = [];
14301442
library[x + '__deps'].push('$SYSCALLS');

src/library_wasi.js

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,16 @@ var WasiLibrary = {
9090
args_sizes_get__nothrow: true,
9191
args_sizes_get__sig: 'iii',
9292
args_sizes_get: function(pargc, pargv_buf_size) {
93+
{{{ from64(['pargc', 'pargv_buf_size']) }}};
9394
#if MAIN_READS_PARAMS
94-
{{{ makeSetValue('pargc', 0, 'mainArgs.length', 'i32') }}};
95+
{{{ makeSetValue('pargc', 0, 'mainArgs.length', `${SIZE_TYPE}`) }}};
9596
var bufSize = 0;
9697
mainArgs.forEach(function(arg) {
9798
bufSize += arg.length + 1;
9899
});
99-
{{{ makeSetValue('pargv_buf_size', 0, 'bufSize', 'i32') }}};
100+
{{{ makeSetValue('pargv_buf_size', 0, 'bufSize', `${SIZE_TYPE}`) }}};
100101
#else
101-
{{{ makeSetValue('pargc', 0, '0', 'i32') }}};
102+
{{{ makeSetValue('pargc', 0, '0', `${SIZE_TYPE}`) }}};
102103
#endif
103104
return 0;
104105
},
@@ -109,11 +110,12 @@ var WasiLibrary = {
109110
args_get__deps: ['$writeAsciiToMemory'],
110111
#endif
111112
args_get: function(argv, argv_buf) {
113+
{{{ from64(['argv', 'argv_buf']) }}};
112114
#if MAIN_READS_PARAMS
113115
var bufSize = 0;
114116
mainArgs.forEach(function(arg, i) {
115117
var ptr = argv_buf + bufSize;
116-
{{{ makeSetValue('argv', 'i * 4', 'ptr', 'i32') }}};
118+
{{{ makeSetValue('argv', `i*${Runtime.POINTER_SIZE}`, 'ptr', `${POINTER_TYPE}`) }}};
117119
writeAsciiToMemory(arg, ptr);
118120
bufSize += arg.length + 1;
119121
});
@@ -181,7 +183,7 @@ var WasiLibrary = {
181183
#if SYSCALLS_REQUIRE_FILESYSTEM == 0 && (!MINIMAL_RUNTIME || EXIT_RUNTIME)
182184
$flush_NO_FILESYSTEM: function() {
183185
// flush anything remaining in the buffers during shutdown
184-
if (typeof _fflush !== 'undefined') _fflush(0);
186+
if (typeof _fflush !== 'undefined') _fflush({{{ sizeT(0) }}});
185187
var buffers = SYSCALLS.buffers;
186188
if (buffers[1].length) SYSCALLS.printChar(1, {{{ charCode("\n") }}});
187189
if (buffers[2].length) SYSCALLS.printChar(2, {{{ charCode("\n") }}});
@@ -193,22 +195,23 @@ var WasiLibrary = {
193195
#endif
194196
fd_write__sig: 'iiiii',
195197
fd_write: function(fd, iov, iovcnt, pnum) {
198+
{{{ from64(['iov', 'iovcnt', 'pnum']) }}};
196199
#if SYSCALLS_REQUIRE_FILESYSTEM
197200
var stream = SYSCALLS.getStreamFromFD(fd);
198201
var num = SYSCALLS.doWritev(stream, iov, iovcnt);
199202
#else
200203
// hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
201204
var num = 0;
202205
for (var i = 0; i < iovcnt; i++) {
203-
var ptr = {{{ makeGetValue('iov', 'i*8', 'i32') }}};
204-
var len = {{{ makeGetValue('iov', 'i*8 + 4', 'i32') }}};
206+
var ptr = {{{ makeGetValue('iov', `i*${Runtime.POINTER_SIZE}*2`, `${POINTER_TYPE}`) }}};
207+
var len = {{{ makeGetValue('iov', `i*${Runtime.POINTER_SIZE}*2 + ${Runtime.POINTER_SIZE}`, `${POINTER_TYPE}`) }}};
205208
for (var j = 0; j < len; j++) {
206209
SYSCALLS.printChar(fd, HEAPU8[ptr+j]);
207210
}
208211
num += len;
209212
}
210213
#endif // SYSCALLS_REQUIRE_FILESYSTEM
211-
{{{ makeSetValue('pnum', 0, 'num', 'i32') }}}
214+
{{{ makeSetValue('pnum', 0, 'num', `${SIZE_TYPE}`) }}}
212215
return 0;
213216
},
214217

0 commit comments

Comments
 (0)