Eliminate leftover temporary function types using latest Binaryen

This commit is contained in:
dcodeIO 2018-05-09 16:33:42 +02:00
parent dae9880428
commit ef9b43740d
46 changed files with 48 additions and 79 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6
package-lock.json generated
View File

@ -1267,9 +1267,9 @@
"dev": true
},
"binaryen": {
"version": "47.0.0-nightly.20180507",
"resolved": "https://registry.npmjs.org/binaryen/-/binaryen-47.0.0-nightly.20180507.tgz",
"integrity": "sha512-XeCcFosf0Ch8z13fZcUR5O7NwRFHuhZIUCgEyQNKVoJolwt7pBdSMB0ntG+O/3ZD+PptXkbREs/UpcAyfSU+QA=="
"version": "47.0.0-nightly.20180509",
"resolved": "https://registry.npmjs.org/binaryen/-/binaryen-47.0.0-nightly.20180509.tgz",
"integrity": "sha512-NlJAQGajqq4akizkkhQYYGiqBR8XboIe5cWtdYnLCYS9tY+f7jAlyyzjz5kg/vI8uuD8cuiuF7J2WdgSZ/dejw=="
},
"binaryextensions": {
"version": "2.1.1",

View File

@ -12,7 +12,7 @@
},
"dependencies": {
"@protobufjs/utf8": "^1.1.0",
"binaryen": "47.0.0-nightly.20180507",
"binaryen": "47.0.0-nightly.20180509",
"glob": "^7.1.2",
"long": "^4.0.0",
"minimist": "^1.2.0",

View File

@ -2311,21 +2311,10 @@ export class Compiler extends DiagnosticEmitter {
var module = this.module;
var type = this.currentType;
var nativeType = type.toNativeType();
var typeRef = module.getFunctionTypeBySignature(nativeType, null);
var typeRefAdded = false;
if (!typeRef) {
typeRef = module.addFunctionType(type.toSignatureString(), nativeType, null);
typeRefAdded = true;
}
var funcRef = module.addFunction("__precompute", typeRef, null, expr);
var funcRef = module.addTemporaryFunction(nativeType, null, expr);
module.runPasses([ "precompute" ], funcRef);
var ret = getFunctionBody(funcRef);
module.removeFunction("__precompute");
if (typeRefAdded) {
// TODO: also remove the function type somehow if no longer used or make the C-API accept
// a `null` typeRef, using an implicit type.
// module.removeFunctionType(typeRef);
}
module.removeTemporaryFunction();
return ret;
}

View File

@ -358,6 +358,7 @@ declare type BinaryenFunctionTypeRef = usize;
declare function _BinaryenAddFunctionType(module: BinaryenModuleRef, name: usize, result: BinaryenType, paramTypes: usize, numParams: BinaryenIndex): BinaryenFunctionTypeRef;
declare function _BinaryenGetFunctionTypeBySignature(module: BinaryenModuleRef, result: BinaryenType, paramTypes: usize, numParams: BinaryenIndex): BinaryenFunctionTypeRef;
declare function _BinaryenRemoveFunctionType(module: BinaryenModuleRef, name: usize): void;
declare function _BinaryenFunctionTypeGetName(ftype: BinaryenFunctionTypeRef): usize;
declare function _BinaryenFunctionTypeGetNumParams(ftype: BinaryenFunctionTypeRef): BinaryenIndex;

View File

@ -297,6 +297,15 @@ export class Module {
}
}
removeFunctionType(name: string): void {
var cStr = allocString(name);
try {
_BinaryenRemoveFunctionType(this.ref, cStr);
} finally {
free_memory(cStr);
}
}
// constants
createI32(value: i32): ExpressionRef {
@ -663,6 +672,28 @@ export class Module {
}
}
private tempName: usize = 0;
private hasTempFunc: bool = false;
addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {
this.hasTempFunc = assert(!this.hasTempFunc);
if (!this.tempName) this.tempName = allocString(""); // works because strings are interned
var cArr = allocI32Array(paramTypes);
try {
let typeRef = _BinaryenAddFunctionType(this.ref, this.tempName, result, cArr, paramTypes ? paramTypes.length : 0);
return _BinaryenAddFunction(this.ref, this.tempName, typeRef, 0, 0, body);
} finally {
free_memory(cArr);
}
}
removeTemporaryFunction(): void {
this.hasTempFunc = !assert(this.hasTempFunc);
var tempName = assert(this.tempName);
_BinaryenRemoveFunction(this.ref, tempName);
_BinaryenRemoveFunctionType(this.ref, tempName);
}
addFunctionExport(
internalName: string,
externalName: string

View File

@ -1,6 +1,5 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $i (func (result i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))
(global $HEAP_BASE i32 (i32.const 56))

View File

@ -1,11 +1,8 @@
(module
(type $FFF (func (param f64 f64) (result f64)))
(type $F (func (result f64)))
(type $i (func (result i32)))
(type $FiF (func (param f64 i32) (result f64)))
(type $fff (func (param f32 f32) (result f32)))
(type $fi (func (param f32) (result i32)))
(type $f (func (result f32)))
(type $fif (func (param f32 i32) (result f32)))
(type $Fi (func (param f64) (result i32)))
(type $v (func))

View File

@ -1,11 +1,8 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $F (func (result f64)))
(type $fi (func (param f32) (result i32)))
(type $Fi (func (param f64) (result i32)))
(type $i (func (result i32)))
(type $v (func))
(type $f (func (result f32)))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))
(global $builtins/b (mut i32) (i32.const 0))
(global $builtins/i (mut i32) (i32.const 0))

View File

@ -1,6 +1,5 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $i (func (result i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))
(global $comma/a (mut i32) (i32.const 0))

View File

@ -1,7 +1,7 @@
(module
(type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iv (func (param i32)))
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iiv (func (param i32 i32)))
(type $v (func))

View File

@ -1,7 +1,7 @@
(module
(type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iv (func (param i32)))
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iiv (func (param i32 i32)))
(type $v (func))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,5 +1,4 @@
(module
(type $F (func (result f64)))
(type $i (func (result i32)))
(type $iiv (func (param i32 i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))

View File

@ -1,6 +1,5 @@
(module
(type $ii (func (param i32) (result i32)))
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $v (func))
(global $HEAP_BASE i32 (i32.const 4))
(memory $0 1)

View File

@ -1,8 +1,6 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $i (func (result i32)))
(type $FF (func (param f64) (result f64)))
(type $F (func (result f64)))
(type $Fi (func (param f64) (result i32)))
(type $FFFF (func (param f64 f64 f64) (result f64)))
(global $../../examples/mandelbrot/assembly/index/NUM_COLORS i32 (i32.const 2048))

View File

@ -1,6 +1,5 @@
(module
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,6 +1,5 @@
(module
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,6 +1,5 @@
(module
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,6 +1,5 @@
(module
(type $ii (func (param i32) (result i32)))
(type $i (func (result i32)))
(global $HEAP_BASE i32 (i32.const 4))
(memory $0 1)
(export "fib" (func $recursive/fib))

View File

@ -1,7 +1,6 @@
(module
(type $iiv (func (param i32 i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $i (func (result i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))
(global $retain-i32/si (mut i32) (i32.const 0))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $iv (func (param i32)))
(type $v (func))
(global $scoped/aGlobal (mut i32) (i32.const 1))

View File

@ -1,11 +1,8 @@
(module
(type $FFF (func (param f64 f64) (result f64)))
(type $F (func (result f64)))
(type $i (func (result i32)))
(type $FiF (func (param f64 i32) (result f64)))
(type $fff (func (param f32 f32) (result f32)))
(type $fi (func (param f32) (result i32)))
(type $f (func (result f32)))
(type $fif (func (param f32 i32) (result f32)))
(type $Fi (func (param f64) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $iiiv (func (param i32 i32 i32)))

View File

@ -1,7 +1,6 @@
(module
(type $ii (func (param i32) (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $i (func (result i32)))
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $iii (func (param i32 i32) (result i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $ii (func (param i32) (result i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $ii (func (param i32) (result i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $v (func))
(global $~lib/internal/allocator/AL_BITS i32 (i32.const 3))

View File

@ -1,9 +1,7 @@
(module
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iv (func (param i32)))
(type $fi (func (param f32) (result i32)))
(type $F (func (result f64)))
(type $Fi (func (param f64) (result i32)))
(type $v (func))
(import "env" "logi" (func $std/hash/logi (param i32)))

View File

@ -1,9 +1,5 @@
(module
(type $F (func (result f64)))
(type $FF (func (param f64) (result f64)))
(type $f (func (result f32)))
(type $i (func (result i32)))
(type $I (func (result i64)))
(type $Fi (func (param f64) (result i32)))
(type $FFF (func (param f64 f64) (result f64)))
(type $FiF (func (param f64 i32) (result f64)))

View File

@ -1,7 +1,5 @@
(module
(type $F (func (result f64)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $f (func (result f32)))
(type $FFFii (func (param f64 f64 f64 i32) (result i32)))
(type $Fi (func (param f64) (result i32)))
(type $FFFF (func (param f64 f64 f64) (result f64)))
@ -19,8 +17,10 @@
(type $FFF (func (param f64 f64) (result f64)))
(type $ffffii (func (param f32 f32 f32 f32 i32) (result i32)))
(type $fff (func (param f32 f32) (result f32)))
(type $F (func (result f64)))
(type $Iv (func (param i64)))
(type $II (func (param i64) (result i64)))
(type $f (func (result f32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))
(import "JSMath" "E" (global $~lib/math/JSMath.E f64))

View File

@ -1,8 +1,5 @@
(module
(type $i (func (result i32)))
(type $F (func (result f64)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $f (func (result f32)))
(type $FFFii (func (param f64 f64 f64 i32) (result i32)))
(type $Fi (func (param f64) (result i32)))
(type $FFFF (func (param f64 f64 f64) (result f64)))
@ -16,13 +13,14 @@
(type $fiffii (func (param f32 i32 f32 f32 i32) (result i32)))
(type $FF (func (param f64) (result f64)))
(type $ff (func (param f32) (result f32)))
(type $I (func (result i64)))
(type $FFFFii (func (param f64 f64 f64 f64 i32) (result i32)))
(type $FFF (func (param f64 f64) (result f64)))
(type $ffffii (func (param f32 f32 f32 f32 i32) (result i32)))
(type $fff (func (param f32 f32) (result f32)))
(type $F (func (result f64)))
(type $Iv (func (param i64)))
(type $II (func (param i64) (result i64)))
(type $f (func (result f32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))
(import "JSMath" "E" (global $~lib/math/JSMath.E f64))

View File

@ -2,10 +2,8 @@
(type $FFFi (func (param f64 f64 f64) (result i32)))
(type $FFF (func (param f64 f64) (result f64)))
(type $Fi (func (param f64) (result i32)))
(type $i (func (result i32)))
(type $FFi (func (param f64 f64) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $F (func (result f64)))
(type $fffi (func (param f32 f32 f32) (result i32)))
(type $fff (func (param f32 f32) (result f32)))
(type $fi (func (param f32) (result i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $ifi (func (param i32 f32) (result i32)))
(type $ii (func (param i32) (result i32)))
(type $v (func))

View File

@ -1,11 +1,9 @@
(module
(type $i (func (result i32)))
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $FFF (func (param f64 f64) (result f64)))
(type $F (func (result f64)))
(type $FiF (func (param f64 i32) (result f64)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,7 +1,6 @@
(module
(type $ii (func (param i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $i (func (result i32)))
(type $II (func (param i64) (result i64)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $iii (func (param i32 i32) (result i32)))

View File

@ -1,8 +1,4 @@
(module
(type $i (func (result i32)))
(type $I (func (result i64)))
(type $f (func (result f32)))
(type $F (func (result f64)))
(type $ii (func (param i32) (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $iii (func (param i32 i32) (result i32)))

View File

@ -1,8 +1,8 @@
(module
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $i (func (result i32)))
(type $iiF (func (param i32 i32) (result f64)))
(type $iF (func (param i32) (result f64)))
(type $ii (func (param i32) (result i32)))

View File

@ -1,10 +1,9 @@
(module
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $iiii (func (param i32 i32 i32) (result i32)))
(type $i (func (result i32)))
(type $iiF (func (param i32 i32) (result f64)))
(type $F (func (result f64)))
(type $iF (func (param i32) (result f64)))
(type $ii (func (param i32) (result i32)))
(type $iiiv (func (param i32 i32 i32)))

View File

@ -1,6 +1,5 @@
(module
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $i (func (result i32)))
(type $iv (func (param i32)))
(type $iii (func (param i32 i32) (result i32)))
(type $ii (func (param i32) (result i32)))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $v (func))
(global $ternary/a (mut i32) (i32.const 0))
(global $HEAP_BASE i32 (i32.const 4))

View File

@ -1,5 +1,4 @@
(module
(type $i (func (result i32)))
(type $iiiiv (func (param i32 i32 i32 i32)))
(type $v (func))
(import "env" "abort" (func $abort (param i32 i32 i32 i32)))