Skip to content

Commit a506ecb

Browse files
committed
fix by declaring function table before indirect call analysis
1 parent 34c74a0 commit a506ecb

5 files changed

Lines changed: 41 additions & 22 deletions

File tree

src/builtins.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3812,6 +3812,7 @@ function builtin_call_indirect(ctx: BuiltinFunctionContext): ExpressionRef {
38123812
paramTypeRefs[i] = compiler.currentType.toRef();
38133813
}
38143814
compiler.currentType = returnType;
3815+
compiler.ensureFunctionTable();
38153816
return module.call_indirect(null /* TODO */, indexArg, operandExprs, createType(paramTypeRefs), returnType.toRef());
38163817
}
38173818
builtinFunctions.set(BuiltinNames.call_indirect, builtin_call_indirect);

src/compiler.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ export class Compiler extends DiagnosticEmitter {
458458
staticGcObjectOffsets: Map<i32, Set<i32>> = new Map();
459459
/** Function table being compiled. First elem is blank. */
460460
functionTable: Function[] = [];
461+
/** Whether the default function table has been declared in the module yet. */
462+
functionTableDeclared: bool = false;
461463
/** Arguments length helper global. */
462464
builtinArgumentsLength: GlobalRef = 0;
463465
/** Requires runtime features. */
@@ -877,11 +879,12 @@ export class Compiler extends DiagnosticEmitter {
877879
}
878880
}
879881

880-
private initDefaultTable(): void {
882+
/** Ensures the default function table is declared so indirect calls can be built and their effects analyzed. */
883+
ensureFunctionTable(): void {
884+
if (this.functionTableDeclared) return;
885+
this.functionTableDeclared = true;
881886
let options = this.options;
882887
let module = this.module;
883-
884-
// import and/or export table if requested (default table is named '0' by Binaryen)
885888
if (options.importTable) {
886889
module.addTableImport(
887890
CommonNames.DefaultTable,
@@ -895,6 +898,19 @@ export class Compiler extends DiagnosticEmitter {
895898
null
896899
);
897900
}
901+
} else {
902+
module.ensureFunctionTable(CommonNames.DefaultTable);
903+
}
904+
}
905+
906+
private initDefaultTable(): void {
907+
let options = this.options;
908+
let module = this.module;
909+
910+
// declare the default table now if imported (default table is named '0' by Binaryen).
911+
// non-imported tables are declared lazily on first indirect call, see ensureFunctionTable
912+
if (options.importTable) {
913+
this.ensureFunctionTable();
898914
}
899915
if (options.exportTable) {
900916
module.addTableExport(CommonNames.DefaultTable, ExportNames.Table);
@@ -2152,7 +2168,8 @@ export class Compiler extends DiagnosticEmitter {
21522168
let memorySegment = instance.memorySegment;
21532169
if (!memorySegment) {
21542170

2155-
// Add to the function table
2171+
// Add to the function table, declaring it on first use so effect analysis works
2172+
this.ensureFunctionTable();
21562173
let functionTable = this.functionTable;
21572174
let tableBase = this.options.tableBase;
21582175
if (!tableBase) tableBase = 1; // leave first elem blank

src/module.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2486,6 +2486,14 @@ export class Module {
24862486
binaryen._free(cArr);
24872487
}
24882488

2489+
/** Ensures that an empty function table of the given name exists, to be sized and filled later. */
2490+
ensureFunctionTable(name: string): void {
2491+
let cStr = this.allocStringCached(name);
2492+
if (!binaryen._BinaryenGetTable(this.ref, cStr)) {
2493+
binaryen._BinaryenAddTable(this.ref, cStr, 0, Module.UNLIMITED_TABLE, TypeRef.Funcref);
2494+
}
2495+
}
2496+
24892497
/* setFunctionTable(
24902498
initial: Index,
24912499
maximum: Index,

tests/compiler/assert-nonnull.release.wat

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
(module
22
(type $0 (func (param i32) (result i32)))
3-
(type $1 (func (result i32)))
4-
(type $2 (func (param i32 i32 i32 i32)))
3+
(type $1 (func (param i32 i32 i32 i32)))
54
(import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32)))
65
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 34236))
76
(memory $0 1)
@@ -15,7 +14,6 @@
1514
(data $3.1 (i32.const 1304) "\02\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s")
1615
(data $4 (i32.const 1340) "|")
1716
(data $4.1 (i32.const 1352) "\02\00\00\00^\00\00\00E\00l\00e\00m\00e\00n\00t\00 \00t\00y\00p\00e\00 \00m\00u\00s\00t\00 \00b\00e\00 \00n\00u\00l\00l\00a\00b\00l\00e\00 \00i\00f\00 \00a\00r\00r\00a\00y\00 \00i\00s\00 \00h\00o\00l\00e\00y")
18-
(table $0 1 1 funcref)
1917
(export "memory" (memory $0))
2018
(export "testVar" (func $export:assert-nonnull/testVar))
2119
(export "testObj" (func $export:assert-nonnull/testObj))
@@ -165,7 +163,6 @@
165163
br_if $folding-inner1
166164
local.get $0
167165
i32.load
168-
call_indirect (type $1)
169166
unreachable
170167
end
171168
i32.const 34256
@@ -283,7 +280,6 @@
283280
br_if $folding-inner1
284281
local.get $0
285282
i32.load
286-
call_indirect (type $1)
287283
unreachable
288284
end
289285
i32.const 34256
@@ -344,7 +340,6 @@
344340
end
345341
local.get $0
346342
i32.load
347-
call_indirect (type $1)
348343
unreachable
349344
end
350345
i32.const 34256
@@ -456,7 +451,6 @@
456451
i32.store offset=4
457452
local.get $0
458453
i32.load
459-
call_indirect (type $1)
460454
unreachable
461455
end
462456
i32.const 34256
@@ -505,7 +499,6 @@
505499
end
506500
local.get $0
507501
i32.load
508-
call_indirect (type $1)
509502
unreachable
510503
end
511504
i32.const 34256

tests/compiler/features/relaxed-simd.debug.wat

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,42 +83,42 @@
8383
global.get $features/relaxed-simd/v
8484
global.get $features/relaxed-simd/v
8585
global.get $features/relaxed-simd/v
86-
i8x16.laneselect
86+
i8x16.relaxed_laneselect
8787
global.set $features/relaxed-simd/r
8888
global.get $features/relaxed-simd/v
8989
global.get $features/relaxed-simd/v
9090
global.get $features/relaxed-simd/v
91-
i8x16.laneselect
91+
i8x16.relaxed_laneselect
9292
global.set $features/relaxed-simd/r
9393
global.get $features/relaxed-simd/v
9494
global.get $features/relaxed-simd/v
9595
global.get $features/relaxed-simd/v
96-
i16x8.laneselect
96+
i16x8.relaxed_laneselect
9797
global.set $features/relaxed-simd/r
9898
global.get $features/relaxed-simd/v
9999
global.get $features/relaxed-simd/v
100100
global.get $features/relaxed-simd/v
101-
i16x8.laneselect
101+
i16x8.relaxed_laneselect
102102
global.set $features/relaxed-simd/r
103103
global.get $features/relaxed-simd/v
104104
global.get $features/relaxed-simd/v
105105
global.get $features/relaxed-simd/v
106-
i32x4.laneselect
106+
i32x4.relaxed_laneselect
107107
global.set $features/relaxed-simd/r
108108
global.get $features/relaxed-simd/v
109109
global.get $features/relaxed-simd/v
110110
global.get $features/relaxed-simd/v
111-
i32x4.laneselect
111+
i32x4.relaxed_laneselect
112112
global.set $features/relaxed-simd/r
113113
global.get $features/relaxed-simd/v
114114
global.get $features/relaxed-simd/v
115115
global.get $features/relaxed-simd/v
116-
i64x2.laneselect
116+
i64x2.relaxed_laneselect
117117
global.set $features/relaxed-simd/r
118118
global.get $features/relaxed-simd/v
119119
global.get $features/relaxed-simd/v
120120
global.get $features/relaxed-simd/v
121-
i64x2.laneselect
121+
i64x2.relaxed_laneselect
122122
global.set $features/relaxed-simd/r
123123
global.get $features/relaxed-simd/v
124124
global.get $features/relaxed-simd/v
@@ -162,11 +162,11 @@
162162
global.set $features/relaxed-simd/r
163163
global.get $features/relaxed-simd/v
164164
global.get $features/relaxed-simd/v
165-
i16x8.dot_i8x16_i7x16_s
165+
i16x8.relaxed_dot_i8x16_i7x16_s
166166
global.set $features/relaxed-simd/r
167167
global.get $features/relaxed-simd/v
168168
global.get $features/relaxed-simd/v
169-
i16x8.dot_i8x16_i7x16_s
169+
i16x8.relaxed_dot_i8x16_i7x16_s
170170
global.set $features/relaxed-simd/r
171171
)
172172
(func $~start

0 commit comments

Comments
 (0)