Skip to content

Commit 82a998c

Browse files
committed
Part two of dynCall removal
This change now passes flags to binaryen to limit the creation of the dynCall functions and removes more internal use of the legacy dynCall functions.
1 parent fa91e13 commit 82a998c

31 files changed

+108
-160
lines changed

emcc.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1260,6 +1260,9 @@ def check(input_file):
12601260
if shared.Settings.RELOCATABLE:
12611261
shared.Settings.ALLOW_TABLE_GROWTH = 1
12621262

1263+
if shared.Settings.WASM2C or shared.Settings.ASYNCIFY or shared.Settings.EMBIND:
1264+
shared.Settings.USE_LEGACY_DYNCALLS = 1
1265+
12631266
# Reconfigure the cache now that settings have been applied. Some settings
12641267
# such as LTO and SIDE_MODULE/MAIN_MODULE effect which cache directory we use.
12651268
shared.reconfigure_cache()
@@ -1515,20 +1518,18 @@ def check(input_file):
15151518
'removeRunDependency',
15161519
]
15171520

1518-
if not shared.Settings.MINIMAL_RUNTIME or (shared.Settings.USE_PTHREADS or shared.Settings.EXIT_RUNTIME):
1521+
if not shared.Settings.MINIMAL_RUNTIME or shared.Settings.EXIT_RUNTIME:
15191522
# MINIMAL_RUNTIME only needs callRuntimeCallbacks in certain cases, but the normal runtime
15201523
# always does.
15211524
shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$callRuntimeCallbacks']
15221525

1526+
if shared.Settings.USE_PTHREADS:
1527+
shared.Settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE += ['$dynCall']
1528+
15231529
if shared.Settings.USE_PTHREADS:
15241530
# memalign is used to ensure allocated thread stacks are aligned.
15251531
shared.Settings.EXPORTED_FUNCTIONS += ['_memalign', '_malloc']
15261532

1527-
# dynCall_ii is used to call pthread entry points in worker.js (as
1528-
# metadce does not consider worker.js, which is external, we must
1529-
# consider it a user export, i.e., one which can never be removed).
1530-
building.user_requested_exports += ['dynCall_ii']
1531-
15321533
if shared.Settings.MINIMAL_RUNTIME:
15331534
building.user_requested_exports += ['exit']
15341535

emscripten.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,13 @@ def finalize_wasm(temp_files, infile, outfile, memfile, DEBUG):
549549
args.append('-g')
550550
if shared.Settings.WASM_BIGINT:
551551
args.append('--bigint')
552+
553+
if not shared.Settings.USE_LEGACY_DYNCALLS:
554+
if shared.Settings.WASM_BIGINT:
555+
args.append('--no-dyncalls')
556+
else:
557+
args.append('--dyncalls-i64')
558+
552559
if shared.Settings.LEGALIZE_JS_FFI != 1:
553560
args.append('--no-legalize-javascript-ffi')
554561
if not shared.Settings.MEM_INIT_IN_WASM:

src/library.js

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3867,7 +3867,7 @@ LibraryManager.library = {
38673867

38683868
// libunwind
38693869

3870-
_Unwind_Backtrace__deps: ['emscripten_get_callstack_js'],
3870+
_Unwind_Backtrace__deps: ['emscripten_get_callstack_js', '$getDynCaller'],
38713871
_Unwind_Backtrace: function(func, arg) {
38723872
var trace = _emscripten_get_callstack_js();
38733873
var parts = trace.split('\n');
@@ -3918,6 +3918,7 @@ LibraryManager.library = {
39183918

39193919
// special runtime support
39203920

3921+
emscripten_scan_stack__deps: ['$getDynCaller'],
39213922
emscripten_scan_stack: function(func) {
39223923
var base = STACK_BASE; // TODO verify this is right on pthreads
39233924
var end = stackSave();
@@ -4004,6 +4005,50 @@ LibraryManager.library = {
40044005
});
40054006
},
40064007

4008+
#if USE_LEGACY_DYNCALLS || !WASM_BIGINT
4009+
$dynCallLegacy: function(sig, ptr, args) {
4010+
#if ASSERTIONS
4011+
assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\'');
4012+
if (args && args.length) {
4013+
// j (64-bit integer) must be passed in as two numbers [low 32, high 32].
4014+
assert(args.length === sig.substring(1).replace(/j/g, '--').length);
4015+
} else {
4016+
assert(sig.length == 1);
4017+
}
4018+
#endif
4019+
if (args && args.length) {
4020+
return Module['dynCall_' + sig].apply(null, [ptr].concat(args));
4021+
}
4022+
return Module['dynCall_' + sig].call(null, ptr);
4023+
},
4024+
$dynCall__deps: ['$dynCallLegacy'],
4025+
#endif
4026+
4027+
$dynCall: function (sig, ptr, args) {
4028+
#if USE_LEGACY_DYNCALLS
4029+
return dynCallLegacy(sig, ptr, args);
4030+
#else
4031+
#if !WASM_BIGINT
4032+
// Without WASM_BIGINT support we cannot directly call function with i64 as
4033+
// part of thier signature, so we rely the dynCall functions generated by
4034+
// wasm-emscripten-finalize
4035+
if (sig.indexOf('j') != -1) {
4036+
return dynCallLegacy(sig, ptr, args);
4037+
}
4038+
#endif
4039+
4040+
return wasmTable.get(ptr).apply(null, args)
4041+
#endif
4042+
},
4043+
4044+
$getDynCaller__deps: ['$dynCall'],
4045+
$getDynCaller: function(sig) {
4046+
return function(ptr) {
4047+
return dynCall(sig, ptr, Array.prototype.slice.call(arguments, 1));
4048+
};
4049+
},
4050+
4051+
$callRuntimeCallbacks__deps: ['$dynCall'],
40074052
$callRuntimeCallbacks: function(callbacks) {
40084053
while(callbacks.length > 0) {
40094054
var callback = callbacks.shift();
@@ -4014,9 +4059,9 @@ LibraryManager.library = {
40144059
var func = callback.func;
40154060
if (typeof func === 'number') {
40164061
if (callback.arg === undefined) {
4017-
dynCall_v(func);
4062+
dynCall('v', func);
40184063
} else {
4019-
dynCall_vi(func, callback.arg);
4064+
dynCall('vi', func, [callback.arg]);
40204065
}
40214066
} else {
40224067
func(callback.arg === undefined ? null : callback.arg);

src/library_async.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ mergeInto(LibraryManager.library, {
340340
});
341341
},
342342

343+
emscripten_scan_registers__deps: ['$getDynCaller'],
343344
emscripten_scan_registers: function(func) {
344345
Asyncify.handleSleep(function(wakeUp) {
345346
// We must first unwind, so things are spilled to the stack. We
@@ -364,7 +365,7 @@ mergeInto(LibraryManager.library, {
364365
});
365366
},
366367

367-
$Fibers__deps: ['$Asyncify'],
368+
$Fibers__deps: ['$Asyncify', '$getDynCaller'],
368369
$Fibers: {
369370
nextFiber: 0,
370371
trampolineRunning: false,

src/library_browser.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,7 @@ var LibraryBrowser = {
861861

862862
$funcWrappers: {},
863863

864-
$getFuncWrapper__deps: ['$funcWrappers'],
864+
$getFuncWrapper__deps: ['$funcWrappers', '$dynCall'],
865865
$getFuncWrapper: function(func, sig) {
866866
if (!func) return; // on null pointer, return undefined
867867
assert(sig);
@@ -1196,7 +1196,7 @@ var LibraryBrowser = {
11961196
return 0;
11971197
},
11981198

1199-
emscripten_set_main_loop__deps: ['$setMainLoop'],
1199+
emscripten_set_main_loop__deps: ['$setMainLoop', '$getDynCaller'],
12001200
emscripten_set_main_loop__docs: '/** @param {number|boolean=} noSetTiming */',
12011201
emscripten_set_main_loop: function(func, fps, simulateInfiniteLoop, arg, noSetTiming) {
12021202
var browserIterationFunc = function() { {{{ makeDynCall('v') }}}(func); };

src/library_exceptions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ var LibraryExceptions = {
179179
info.add_ref();
180180
},
181181

182-
$exception_decRef__deps: ['__cxa_free_exception'
182+
$exception_decRef__deps: ['__cxa_free_exception', '$getDynCaller',
183183
#if EXCEPTION_DEBUG
184184
, '$exceptionLast', '$exceptionCaught'
185185
#endif

src/library_html5.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ var LibraryJSEvents = {
234234
},
235235
},
236236

237-
_registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget'],
237+
_registerKeyEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getDynCaller'],
238238
_registerKeyEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
239239
#if USE_PTHREADS
240240
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -502,7 +502,7 @@ var LibraryJSEvents = {
502502
#endif
503503
},
504504

505-
_registerMouseEventCallback__deps: ['$JSEvents', '_fillMouseEventData', '$findEventTarget'],
505+
_registerMouseEventCallback__deps: ['$JSEvents', '_fillMouseEventData', '$findEventTarget', '$getDynCaller'],
506506
_registerMouseEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
507507
#if USE_PTHREADS
508508
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -706,7 +706,7 @@ var LibraryJSEvents = {
706706
}
707707
},
708708

709-
_registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget'],
709+
_registerUiEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getDynCaller'],
710710
_registerUiEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
711711
#if USE_PTHREADS
712712
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -859,7 +859,7 @@ var LibraryJSEvents = {
859859
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenDeviceOrientationEvent.absolute, 'e.absolute', 'i32') }}};
860860
},
861861

862-
_registerDeviceOrientationEventCallback__deps: ['$JSEvents', '_fillDeviceOrientationEventData', '$findEventTarget'],
862+
_registerDeviceOrientationEventCallback__deps: ['$JSEvents', '_fillDeviceOrientationEventData', '$findEventTarget', '$getDynCaller'],
863863
_registerDeviceOrientationEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
864864
#if USE_PTHREADS
865865
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -1006,7 +1006,7 @@ var LibraryJSEvents = {
10061006
{{{ makeSetValue('eventStruct', C_STRUCTS.EmscriptenOrientationChangeEvent.orientationAngle, 'orientation', 'i32') }}};
10071007
},
10081008

1009-
_registerOrientationChangeEventCallback__deps: ['$JSEvents', '_fillOrientationChangeEventData', '$findEventTarget'],
1009+
_registerOrientationChangeEventCallback__deps: ['$JSEvents', '_fillOrientationChangeEventData', '$findEventTarget', '$getDynCaller'],
10101010
_registerOrientationChangeEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
10111011
#if USE_PTHREADS
10121012
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);
@@ -2656,6 +2656,7 @@ var LibraryJSEvents = {
26562656
cancelAnimationFrame(id);
26572657
},
26582658

2659+
emscripten_request_animation_frame_loop__deps: ['$getDynCaller'],
26592660
emscripten_request_animation_frame_loop: function(cb, userData) {
26602661
function tick(timeStamp) {
26612662
if ({{{ makeDynCall('idi') }}}(cb, timeStamp, userData)) {

src/library_html5_webgl.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ var LibraryHtml5WebGL = {
382382
#endif
383383
},
384384

385-
_registerWebGlEventCallback__deps: ['$JSEvents', '$findEventTarget'],
385+
_registerWebGlEventCallback__deps: ['$JSEvents', '$findEventTarget', '$getDynCaller'],
386386
_registerWebGlEventCallback: function(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) {
387387
#if USE_PTHREADS
388388
targetThread = JSEvents.getTargetThreadForEventCallback(targetThread);

src/library_pthread_stub.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ var LibraryPThreadStub = {
7171
pthread_setcancelstate: function() { return 0; },
7272
pthread_setcanceltype: function() { return 0; },
7373

74+
pthread_cleanup_push__deps: ['$makeDynCaller'],
7475
pthread_cleanup_push__sig: 'vii',
7576
pthread_cleanup_push: function(routine, arg) {
7677
__ATEXIT__.push(function() { {{{ makeDynCall('vi') }}}(routine, arg) })

src/parseTools.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,9 +1455,13 @@ function asmFFICoercion(value, type) {
14551455
}
14561456

14571457
function makeDynCall(sig) {
1458-
// TODO(sbc): Should this be: exportedAsmFunc('dynCall_' + sig);
1459-
// See https://github.com/emscripten-core/emscripten/pull/11991;
1460-
return 'dynCall_' + sig;
1458+
if (USE_LEGACY_DYNCALLS) {
1459+
// TODO(sbc): Should this be: exportedAsmFunc('dynCall_' + sig);
1460+
// See https://github.com/emscripten-core/emscripten/pull/11991;
1461+
return 'dynCall_' + sig;
1462+
} else {
1463+
return 'getDynCaller("' + sig + '")';
1464+
}
14611465
}
14621466

14631467
function heapAndOffset(heap, ptr) { // given HEAP8, ptr , we return splitChunk, relptr

src/postamble_minimal.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ function initRuntime(asm) {
5656
// Export needed variables that worker.js needs to Module.
5757
Module['_emscripten_tls_init'] = _emscripten_tls_init;
5858
Module['HEAPU32'] = HEAPU32;
59-
Module['dynCall_ii'] = dynCall_ii;
6059
Module['registerPthreadPtr'] = registerPthreadPtr;
6160
Module['_pthread_self'] = _pthread_self;
6261

src/settings_internal.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,3 +201,5 @@ var EXPECT_MAIN = 1;
201201
// Provide and export a .ready() Promise. This is currently used by default with
202202
// MODULARIZE, and returned from the factory function.
203203
var EXPORT_READY_PROMISE = 1;
204+
205+
var USE_LEGACY_DYNCALLS = 0;

src/support.js

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -571,33 +571,6 @@ function makeBigInt(low, high, unsigned) {
571571
return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0));
572572
}
573573

574-
/** @param {Array=} args */
575-
function dynCall(sig, ptr, args) {
576-
#if !WASM_BIGINT
577-
// Without WASM_BIGINT support we cannot directly call function with i64 as
578-
// part of their signature, so we rely on the dynCall functions generated by
579-
// wasm-emscripten-finalize
580-
if (sig.indexOf('j') != -1) {
581-
#if ASSERTIONS
582-
assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\'');
583-
if (args && args.length) {
584-
// j (64-bit integer) must be passed in as two numbers [low 32, high 32].
585-
assert(args.length === sig.substring(1).replace(/j/g, '--').length);
586-
} else {
587-
assert(sig.length == 1);
588-
}
589-
#endif
590-
if (args && args.length) {
591-
return Module['dynCall_' + sig].apply(null, [ptr].concat(args));
592-
} else {
593-
return Module['dynCall_' + sig].call(null, ptr);
594-
}
595-
}
596-
#endif
597-
598-
return wasmTable.get(ptr).apply(null, args)
599-
}
600-
601574
var tempRet0 = 0;
602575

603576
var setTempRet0 = function(value) {

src/worker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ this.onmessage = function(e) {
200200
// enable that to work. If you find the following line to crash, either change the signature
201201
// to "proper" void *ThreadMain(void *arg) form, or try linking with the Emscripten linker
202202
// flag -s EMULATE_FUNCTION_POINTER_CASTS=1 to add in emulation for this x86 ABI extension.
203-
var result = Module['dynCall_ii'](e.data.start_routine, e.data.arg);
203+
var result = dynCall('ii', e.data.start_routine, [e.data.arg]);
204204

205205
#if STACK_OVERFLOW_CHECK
206206
Module['checkStackCookie']();
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 563,
33
"a.html.gz": 377,
4-
"a.js": 5064,
5-
"a.js.gz": 2417,
6-
"a.wasm": 10917,
7-
"a.wasm.gz": 6935,
8-
"total": 16544,
9-
"total_gz": 9729
4+
"a.js": 5166,
5+
"a.js.gz": 2460,
6+
"a.wasm": 10893,
7+
"a.wasm.gz": 6922,
8+
"total": 16622,
9+
"total_gz": 9759
1010
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 588,
33
"a.html.gz": 386,
4-
"a.js": 22182,
5-
"a.js.gz": 8483,
4+
"a.js": 22220,
5+
"a.js.gz": 8497,
66
"a.mem": 3168,
77
"a.mem.gz": 2711,
8-
"total": 25938,
9-
"total_gz": 11580
8+
"total": 25976,
9+
"total_gz": 11594
1010
}

tests/code_size/hello_webgl_wasm.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 563,
33
"a.html.gz": 377,
4-
"a.js": 4549,
5-
"a.js.gz": 2240,
6-
"a.wasm": 10917,
7-
"a.wasm.gz": 6935,
8-
"total": 16029,
9-
"total_gz": 9552
4+
"a.js": 4651,
5+
"a.js.gz": 2282,
6+
"a.wasm": 10893,
7+
"a.wasm.gz": 6922,
8+
"total": 16107,
9+
"total_gz": 9581
1010
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"a.html": 588,
33
"a.html.gz": 386,
4-
"a.js": 21671,
5-
"a.js.gz": 8324,
4+
"a.js": 21709,
5+
"a.js.gz": 8336,
66
"a.mem": 3168,
77
"a.mem.gz": 2711,
8-
"total": 25427,
9-
"total_gz": 11421
8+
"total": 25465,
9+
"total_gz": 11433
1010
}

0 commit comments

Comments
 (0)