Skip to content

Commit 4607fb4

Browse files
authored
Simplify ASan JS transform (#24314)
Leverages ASan's C API for arbitrary loads/stores instead of custom C code with separate variants for each possible type. Similar to #24295 and #24291.
1 parent 99c6e41 commit 4607fb4

File tree

8 files changed

+43
-343
lines changed

8 files changed

+43
-343
lines changed

src/runtime_asan.js

Lines changed: 11 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -8,111 +8,22 @@
88
#error "should only be inclded in USE_ASAN mode"
99
#endif
1010

11-
// C versions of asan_js_{load|store}_* will be used from compiled code, which have
11+
// C versions of asan_js_{load|store} will be used from compiled code, which have
1212
// ASan instrumentation on them. However, until the wasm module is ready, we
1313
// must access things directly.
1414

15-
/** @suppress{duplicate} */
16-
function _asan_js_load_1(ptr) {
17-
if (runtimeInitialized) return __asan_c_load_1(ptr);
18-
return HEAP8[ptr];
19-
}
20-
/** @suppress{duplicate} */
21-
function _asan_js_load_1u(ptr) {
22-
if (runtimeInitialized) return __asan_c_load_1u(ptr);
23-
return HEAPU8[ptr];
24-
}
25-
/** @suppress{duplicate} */
26-
function _asan_js_load_2(ptr) {
27-
if (runtimeInitialized) return __asan_c_load_2(ptr);
28-
return HEAP16[ptr];
29-
}
30-
/** @suppress{duplicate} */
31-
function _asan_js_load_2u(ptr) {
32-
if (runtimeInitialized) return __asan_c_load_2u(ptr);
33-
return HEAPU16[ptr];
34-
}
35-
/** @suppress{duplicate} */
36-
function _asan_js_load_4(ptr) {
37-
if (runtimeInitialized) return __asan_c_load_4(ptr);
38-
return HEAP32[ptr];
39-
}
40-
/** @suppress{duplicate} */
41-
function _asan_js_load_4u(ptr) {
42-
if (runtimeInitialized) return __asan_c_load_4u(ptr) >>> 0;
43-
return HEAPU32[ptr];
44-
}
45-
/** @suppress{duplicate} */
46-
function _asan_js_load_8(ptr) {
47-
if (runtimeInitialized) return __asan_c_load_8(ptr);
48-
return HEAP64[ptr];
49-
}
50-
/** @suppress{duplicate} */
51-
function _asan_js_load_8u(ptr) {
52-
if (runtimeInitialized) return BigInt.asUintN(64, __asan_c_load_8u(ptr));
53-
return HEAPU64[ptr];
54-
}
55-
/** @suppress{duplicate} */
56-
function _asan_js_load_f(ptr) {
57-
if (runtimeInitialized) return __asan_c_load_f(ptr);
58-
return HEAPF32[ptr];
59-
}
60-
/** @suppress{duplicate} */
61-
function _asan_js_load_d(ptr) {
62-
if (runtimeInitialized) return __asan_c_load_d(ptr);
63-
return HEAPF64[ptr];
15+
function _asan_js_load(arr, index) {
16+
if (runtimeInitialized) {
17+
const elemSize = arr.BYTES_PER_ELEMENT;
18+
___asan_loadN(index * elemSize, elemSize);
19+
}
20+
return arr[index];
6421
}
6522

66-
/** @suppress{duplicate} */
67-
function _asan_js_store_1(ptr, val) {
68-
if (runtimeInitialized) return __asan_c_store_1(ptr, val);
69-
return HEAP8[ptr] = val;
70-
}
71-
/** @suppress{duplicate} */
72-
function _asan_js_store_1u(ptr, val) {
73-
if (runtimeInitialized) return __asan_c_store_1u(ptr, val);
74-
return HEAPU8[ptr] = val;
75-
}
76-
/** @suppress{duplicate} */
77-
function _asan_js_store_2(ptr, val) {
78-
if (runtimeInitialized) return __asan_c_store_2(ptr, val);
79-
return HEAP16[ptr] = val;
80-
}
81-
/** @suppress{duplicate} */
82-
function _asan_js_store_2u(ptr, val) {
83-
if (runtimeInitialized) return __asan_c_store_2u(ptr, val);
84-
return HEAPU16[ptr] = val;
85-
}
86-
/** @suppress{duplicate} */
87-
function _asan_js_store_4(ptr, val) {
88-
if (runtimeInitialized) return __asan_c_store_4(ptr, val);
89-
return HEAP32[ptr] = val;
90-
}
91-
/** @suppress{duplicate} */
92-
function _asan_js_store_4u(ptr, val) {
93-
if (runtimeInitialized) return __asan_c_store_4u(ptr, val) >>> 0;
94-
return HEAPU32[ptr] = val;
95-
}
96-
/** @suppress{duplicate} */
97-
function _asan_js_store_8(ptr, val) {
98-
if (runtimeInitialized) return __asan_c_store_8(ptr, val);
99-
return HEAP64[ptr] = val;
100-
}
101-
/** @suppress{duplicate} */
102-
function _asan_js_store_8u(ptr, val) {
23+
function _asan_js_store(arr, index, value) {
10324
if (runtimeInitialized) {
104-
__asan_c_store_8u(ptr, val);
105-
return val;
25+
const elemSize = arr.BYTES_PER_ELEMENT;
26+
___asan_storeN(index * elemSize, elemSize);
10627
}
107-
return HEAPU64[ptr] = val;
108-
}
109-
/** @suppress{duplicate} */
110-
function _asan_js_store_f(ptr, val) {
111-
if (runtimeInitialized) return __asan_c_store_f(ptr, val);
112-
return HEAPF32[ptr] = val;
113-
}
114-
/** @suppress{duplicate} */
115-
function _asan_js_store_d(ptr, val) {
116-
if (runtimeInitialized) return __asan_c_store_d(ptr, val);
117-
return HEAPF64[ptr] = val;
28+
return arr[index] = value;
11829
}

system/lib/asan_js.c

Lines changed: 0 additions & 105 deletions
This file was deleted.

test/js_optimizer/asanify-output.js

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,57 @@
1-
_asan_js_store_1(x, 1);
1+
_asan_js_store(HEAP8, x, 1);
22

3-
_asan_js_store_2(x, 2);
3+
_asan_js_store(HEAP16, x, 2);
44

5-
_asan_js_store_4(x, 3);
5+
_asan_js_store(HEAP32, x, 3);
66

7-
_asan_js_store_1u(x, 4);
7+
_asan_js_store(HEAPU8, x, 4);
88

9-
_asan_js_store_2u(x, 5);
9+
_asan_js_store(HEAPU16, x, 5);
1010

11-
_asan_js_store_4u(x, 6);
11+
_asan_js_store(HEAPU32, x, 6);
1212

13-
_asan_js_store_f(x, 7);
13+
_asan_js_store(HEAPF32, x, 7);
1414

15-
_asan_js_store_d(x, 8);
15+
_asan_js_store(HEAPF64, x, 8);
1616

17-
_asan_js_store_8(x, 9n);
17+
_asan_js_store(HEAP64, x, 9n);
1818

19-
_asan_js_store_8u(x, 10n);
19+
_asan_js_store(HEAPU64, x, 10n);
2020

21-
a1 = _asan_js_load_1(x);
21+
a1 = _asan_js_load(HEAP8, x);
2222

23-
a2 = _asan_js_load_2(x);
23+
a2 = _asan_js_load(HEAP16, x);
2424

25-
a3 = _asan_js_load_4(x);
25+
a3 = _asan_js_load(HEAP32, x);
2626

27-
a4 = _asan_js_load_1u(x);
27+
a4 = _asan_js_load(HEAPU8, x);
2828

29-
a5 = _asan_js_load_2u(x);
29+
a5 = _asan_js_load(HEAPU16, x);
3030

31-
a6 = _asan_js_load_4u(x);
31+
a6 = _asan_js_load(HEAPU32, x);
3232

33-
a7 = _asan_js_load_f(x);
33+
a7 = _asan_js_load(HEAPF32, x);
3434

35-
a8 = _asan_js_load_d(x);
35+
a8 = _asan_js_load(HEAPF64, x);
3636

37-
a9 = _asan_js_load_8(x);
37+
a9 = _asan_js_load(HEAP64, x);
3838

39-
a10 = _asan_js_load_8u(x);
39+
a10 = _asan_js_load(HEAPU64, x);
4040

41-
foo = _asan_js_store_1u(1337, 42);
41+
foo = _asan_js_store(HEAPU8, 1337, 42);
4242

43-
_asan_js_load_2(bar(_asan_js_load_d(5)));
43+
_asan_js_load(HEAP16, bar(_asan_js_load(HEAPF64, 5)));
4444

45-
_asan_js_store_f(x, _asan_js_load_4(y));
45+
_asan_js_store(HEAPF32, x, _asan_js_load(HEAP32, y));
4646

47-
function _asan_js_load_1(ptr) {
47+
function _asan_js_load(ptr) {
4848
return HEAP8[ptr];
4949
}
5050

5151
function somethingElse() {
52-
return _asan_js_load_1(ptr);
52+
return _asan_js_load(HEAP8, ptr);
5353
}
5454

5555
HEAP8.length;
5656

57-
_asan_js_load_1(length);
57+
_asan_js_load(HEAP8, length);

test/js_optimizer/asanify.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ HEAPF32[x] = HEAP32[y];
3737
// access in these functions, as then we'd get infinite recursion - this is
3838
// where we do actually need to still do a HEAP8[..] etc. operation without
3939
// any ASan instrumentation.
40-
function _asan_js_load_1(ptr) {
40+
function _asan_js_load(ptr) {
4141
return HEAP8[ptr];
4242
}
4343

0 commit comments

Comments
 (0)