Skip to content

Commit 765d988

Browse files
committed
[wasm64] Fix a lot of the remaining browser tests
This also inverts the testing logic such that we run all browser tests in wasm64 mode. Tests that don't currently pass are annotated with @no_wasm64.
1 parent 8f9bd0c commit 765d988

File tree

13 files changed

+238
-105
lines changed

13 files changed

+238
-105
lines changed

.circleci/config.yml

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -776,26 +776,7 @@ jobs:
776776
steps:
777777
- run-tests-chrome:
778778
title: "browser64"
779-
test_targets: "
780-
browser64.test_canvas_focus
781-
browser64.test_anisotropic
782-
browser64.test_webgpu_get_device
783-
browser64.test_fetch_*
784-
browser64.test_pthread_*
785-
browser64.test_wget_*
786-
browser64.test_emscripten_async_wget_*
787-
browser64.test_wasm_worker_*
788-
browser64.test_sdl_*
789-
browser64.test_sdl1_*
790-
browser64.test_egl*
791-
browser64.test_gl_*
792-
browser64.test_glgears*
793-
browser64.test_glfw*
794-
browser64.test_glew
795-
browser64.test_idbstore*
796-
browser64.test_fs_idbfs*
797-
browser64.test_webgl*
798-
"
779+
test_targets: "browser64 skip:browser64.test_zzz_zzz_4gb_fail"
799780
test-browser-firefox:
800781
executor: bionic
801782
steps:

src/library_pthread.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ var LibraryPThread = {
143143

144144
#if PTHREADS_PROFILING
145145
getThreadName(pthreadPtr) {
146-
var profilerBlock = {{{ makeGetValue('pthreadPtr', C_STRUCTS.pthread.profilerBlock, POINTER_TYPE) }}};
146+
var profilerBlock = {{{ makeGetValue('pthreadPtr', C_STRUCTS.pthread.profilerBlock, '*') }}};
147147
if (!profilerBlock) return "";
148148
return UTF8ToString(profilerBlock + {{{ C_STRUCTS.thread_profiler_block.name }}});
149149
},
@@ -162,7 +162,7 @@ var LibraryPThread = {
162162
},
163163

164164
threadStatusAsString(pthreadPtr) {
165-
var profilerBlock = {{{ makeGetValue('pthreadPtr', C_STRUCTS.pthread.profilerBlock, POINTER_TYPE) }}};
165+
var profilerBlock = {{{ makeGetValue('pthreadPtr', C_STRUCTS.pthread.profilerBlock, '*') }}};
166166
var status = (profilerBlock == 0) ? 0 : Atomics.load(HEAPU32, {{{ getHeapOffset('profilerBlock + ' + C_STRUCTS.thread_profiler_block.threadStatus, 'i32') }}});
167167
return PThread.threadStatusToString(status);
168168
},
@@ -761,7 +761,7 @@ var LibraryPThread = {
761761
// Deduce which WebGL canvases (HTMLCanvasElements or OffscreenCanvases) should be passed over to the
762762
// Worker that hosts the spawned pthread.
763763
// Comma-delimited list of CSS selectors that must identify canvases by IDs: "#canvas1, #canvas2, ..."
764-
var transferredCanvasNames = attr ? {{{ makeGetValue('attr', C_STRUCTS.pthread_attr_t._a_transferredcanvases, POINTER_TYPE) }}} : 0;
764+
var transferredCanvasNames = attr ? {{{ makeGetValue('attr', C_STRUCTS.pthread_attr_t._a_transferredcanvases, '*') }}} : 0;
765765
#if OFFSCREENCANVASES_TO_PTHREAD
766766
// Proxied canvases string pointer -1 is used as a special token to fetch
767767
// whatever canvases were passed to build in -s

system/lib/compiler-rt/lib/sanitizer_common/sanitizer_emscripten.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ u64 MonotonicNanoTime() {
127127
return (u64)ts.tv_sec * (1000ULL * 1000 * 1000) + ts.tv_nsec;
128128
}
129129

130+
// FIXME implement on this platform.
131+
void GetMemoryProfile(fill_profile_f cb, uptr *stats) {}
132+
130133
} // namespace __sanitizer
131134

132135
#endif

system/lib/emmalloc.c

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,15 @@ static void link_to_free_list(Region *freeRegion)
364364
freeRegionBucketsUsed |= ((BUCKET_BITMASK_T)1) << bucketIndex;
365365
}
366366

367+
368+
EM_JS(double, toPtr, (double data), {
369+
#ifdef __wasm64__
370+
return data;
371+
#else
372+
return data>>>0;
373+
#endif
374+
});
375+
367376
static void dump_memory_regions()
368377
{
369378
ASSERT_MALLOC_IS_ACQUIRED();
@@ -374,17 +383,17 @@ static void dump_memory_regions()
374383
Region *r = (Region*)root;
375384
assert(debug_region_is_consistent(r));
376385
uint8_t *lastRegionEnd = root->endPtr;
377-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Region block 0x'+($0>>>0).toString(16)+' - 0x'+($1>>>0).toString(16)+ ' ('+($2>>>0)+' bytes):'),
386+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Region block '+ptrToString($0)+' - '+ptrToString($1)+ ' ('+toPtr($2)+' bytes):'),
378387
r, lastRegionEnd, lastRegionEnd-(uint8_t*)r);
379388
while((uint8_t*)r < lastRegionEnd)
380389
{
381-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Region 0x'+($0>>>0).toString(16)+', size: '+($1>>>0)+' ('+($2?"used":"--FREE--")+')'),
390+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Region '+ptrToString($0)+', size: '+toPtr($1)+' ('+($2?"used":"--FREE--")+')'),
382391
r, r->size, region_ceiling_size(r) == r->size);
383392

384393
assert(debug_region_is_consistent(r));
385394
size_t sizeFromCeiling = size_of_region_from_ceiling(r);
386395
if (sizeFromCeiling != r->size)
387-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Corrupt region! Size marker at the end of the region does not match: '+($0>>>0)), sizeFromCeiling);
396+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Corrupt region! Size marker at the end of the region does not match: '+toPtr($0)), sizeFromCeiling);
388397
if (r->size == 0)
389398
break;
390399
r = next_region(r);
@@ -399,7 +408,7 @@ static void dump_memory_regions()
399408
Region *fr = freeRegionBuckets[i].next;
400409
while(fr != &freeRegionBuckets[i])
401410
{
402-
MAIN_THREAD_ASYNC_EM_ASM(console.log('In bucket '+$0+', free region 0x'+($1>>>0).toString(16)+', size: ' + ($2>>>0) + ' (size at ceiling: '+($3>>>0)+'), prev: 0x' + ($4>>>0).toString(16) + ', next: 0x' + ($5>>>0).toString(16)),
411+
MAIN_THREAD_ASYNC_EM_ASM(console.log('In bucket '+$0+', free region '+ptrToString($1)+', size: ' + toPtr($2) + ' (size at ceiling: '+toPtr($3)+'), prev: ' + ptrToString($4) + ', next: ' + ptrToString($5)),
403412
i, fr, fr->size, size_of_region_from_ceiling(fr), fr->prev, fr->next);
404413
assert(debug_region_is_consistent(fr));
405414
assert(region_is_free(fr));
@@ -410,7 +419,7 @@ static void dump_memory_regions()
410419
fr = fr->next;
411420
}
412421
}
413-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Free bucket index map: ' + ($0>>>0).toString(2) + ' ' + ($1>>>0).toString(2)), (uint32_t)(freeRegionBucketsUsed >> 32), (uint32_t)freeRegionBucketsUsed);
422+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Free bucket index map: ' + toPtr($0).toString(2) + ' ' + toPtr($1).toString(2)), (uint32_t)(freeRegionBucketsUsed >> 32), (uint32_t)freeRegionBucketsUsed);
414423
MAIN_THREAD_ASYNC_EM_ASM(console.log(""));
415424
}
416425

@@ -430,7 +439,7 @@ static int validate_memory_regions()
430439
Region *r = (Region*)root;
431440
if (!debug_region_is_consistent(r))
432441
{
433-
MAIN_THREAD_ASYNC_EM_ASM(console.error('Used region 0x'+($0>>>0).toString(16)+', size: '+($1>>>0)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'),
442+
MAIN_THREAD_ASYNC_EM_ASM(console.error('Used region '+ptrToString($0)+', size: '+toPtr($1)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'),
434443
r, r->size, region_ceiling_size(r) == r->size);
435444
return 1;
436445
}
@@ -439,7 +448,7 @@ static int validate_memory_regions()
439448
{
440449
if (!debug_region_is_consistent(r))
441450
{
442-
MAIN_THREAD_ASYNC_EM_ASM(console.error('Used region 0x'+($0>>>0).toString(16)+', size: '+($1>>>0)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'),
451+
MAIN_THREAD_ASYNC_EM_ASM(console.error('Used region '+ptrToString($0)+', size: '+toPtr($1)+' ('+($2?"used":"--FREE--")+') is corrupt (size markers in the beginning and at the end of the region do not match!)'),
443452
r, r->size, region_ceiling_size(r) == r->size);
444453
return 1;
445454
}
@@ -457,7 +466,7 @@ static int validate_memory_regions()
457466
{
458467
if (!debug_region_is_consistent(fr) || !region_is_free(fr) || fr->prev != prev || fr->next == fr || fr->prev == fr)
459468
{
460-
MAIN_THREAD_ASYNC_EM_ASM(console.log('In bucket '+$0+', free region 0x'+($1>>>0).toString(16)+', size: ' + ($2>>>0) + ' (size at ceiling: '+($3>>>0)+'), prev: 0x' + ($4>>>0).toString(16) + ', next: 0x' + ($5>>>0).toString(16) + ' is corrupt!'),
469+
MAIN_THREAD_ASYNC_EM_ASM(console.log('In bucket '+$0+', free region '+ptrToString($1)+', size: ' + toPtr($2) + ' (size at ceiling: '+toPtr($3)+'), prev: ' + ptrToString($4) + ', next: 0x' + ptrToString($5) + ' is corrupt!'),
461470
i, fr, fr->size, size_of_region_from_ceiling(fr), fr->prev, fr->next);
462471
return 1;
463472
}
@@ -479,7 +488,7 @@ int emmalloc_validate_memory_regions()
479488
static bool claim_more_memory(size_t numBytes)
480489
{
481490
#ifdef EMMALLOC_VERBOSE
482-
MAIN_THREAD_ASYNC_EM_ASM(console.log('claim_more_memory(numBytes='+($0>>>0)+ ')'), numBytes);
491+
MAIN_THREAD_ASYNC_EM_ASM(console.log('claim_more_memory(numBytes='+Number($0)+ ')'), numBytes);
483492
#endif
484493

485494
#ifdef EMMALLOC_MEMVALIDATE
@@ -496,7 +505,7 @@ static bool claim_more_memory(size_t numBytes)
496505
return false;
497506
}
498507
#ifdef EMMALLOC_VERBOSE
499-
MAIN_THREAD_ASYNC_EM_ASM(console.log('claim_more_memory: claimed ' + ptrToString($0) + ' - ' + ptrToString($1) + ' (' + ($2>>>0) + ' bytes) via sbrk()'), startPtr, startPtr + numBytes, numBytes);
508+
MAIN_THREAD_ASYNC_EM_ASM(console.log('claim_more_memory: claimed ' + ptrToString($0) + ' - ' + ptrToString($1) + ' (' + Number($2) + ' bytes) via sbrk()'), startPtr, startPtr + numBytes, numBytes);
500509
#endif
501510
assert(HAS_ALIGNMENT(startPtr, alignof(size_t)));
502511
uint8_t *endPtr = startPtr + numBytes;
@@ -646,7 +655,7 @@ static void *attempt_allocate(Region *freeRegion, size_t alignment, size_t size)
646655
#endif
647656

648657
#ifdef EMMALLOC_VERBOSE
649-
MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_allocate - succeeded allocating memory, region ptr=' + ptrToString($0) + ', align=' + $1 + ', payload size=' + ($2>>>0) + ' bytes)'), freeRegion, alignment, size);
658+
MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_allocate - succeeded allocating memory, region ptr=' + ptrToString($0) + ', align=' + $1 + ', payload size=' + toPtr($2) + ' bytes)'), freeRegion, alignment, size);
650659
#endif
651660

652661
return (uint8_t*)freeRegion + sizeof(size_t);
@@ -682,7 +691,7 @@ static void *allocate_memory(size_t alignment, size_t size)
682691
ASSERT_MALLOC_IS_ACQUIRED();
683692

684693
#ifdef EMMALLOC_VERBOSE
685-
MAIN_THREAD_ASYNC_EM_ASM(console.log('allocate_memory(align=' + $0 + ', size=' + ($1>>>0) + ' bytes)'), alignment, size);
694+
MAIN_THREAD_ASYNC_EM_ASM(console.log('allocate_memory(align=' + $0 + ', size=' + toPtr($1) + ' bytes)'), alignment, size);
686695
#endif
687696

688697
#ifdef EMMALLOC_MEMVALIDATE
@@ -700,7 +709,7 @@ static void *allocate_memory(size_t alignment, size_t size)
700709
if (size > MAX_ALLOC_SIZE)
701710
{
702711
#ifdef EMMALLOC_VERBOSE
703-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
712+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + toPtr($0) + 'bytes! (negative integer wraparound?)'), size);
704713
#endif
705714
return 0;
706715
}
@@ -875,7 +884,7 @@ void emmalloc_free(void *ptr)
875884
return;
876885

877886
#ifdef EMMALLOC_VERBOSE
878-
MAIN_THREAD_ASYNC_EM_ASM(console.log('free(ptr=0x'+($0>>>0).toString(16)+')'), ptr);
887+
MAIN_THREAD_ASYNC_EM_ASM(console.log('free(ptr='+ptrToString($0)+')'), ptr);
879888
#endif
880889

881890
uint8_t *regionStartPtr = (uint8_t*)ptr - sizeof(size_t);
@@ -891,9 +900,9 @@ void emmalloc_free(void *ptr)
891900
if (debug_region_is_consistent(region))
892901
// LLVM wasm backend bug: cannot use MAIN_THREAD_ASYNC_EM_ASM() here, that generates internal compiler error
893902
// Reproducible by running e.g. other.test_alloc_3GB
894-
EM_ASM(console.error('Double free at region ptr 0x' + ($0>>>0).toString(16) + ', region->size: 0x' + ($1>>>0).toString(16) + ', region->sizeAtCeiling: 0x' + ($2>>>0).toString(16) + ')'), region, size, region_ceiling_size(region));
903+
EM_ASM(console.error('Double free at region ptr ' + ptrToString($0) + ', region->size: ' + ptrToString($1) + ', region->sizeAtCeiling: ' + ptrToString($2) + ')'), region, size, region_ceiling_size(region));
895904
else
896-
MAIN_THREAD_ASYNC_EM_ASM(console.error('Corrupt region at region ptr 0x' + ($0>>>0).toString(16) + ' region->size: 0x' + ($1>>>0).toString(16) + ', region->sizeAtCeiling: 0x' + ($2>>>0).toString(16) + ')'), region, size, region_ceiling_size(region));
905+
MAIN_THREAD_ASYNC_EM_ASM(console.error('Corrupt region at region ptr ' + ptrToString($0) + ' region->size: ' + ptrToString($1) + ', region->sizeAtCeiling: ' + ptrToString($2) + ')'), region, size, region_ceiling_size(region));
897906
}
898907
#endif
899908
assert(size >= sizeof(Region));
@@ -947,7 +956,7 @@ static int attempt_region_resize(Region *region, size_t size)
947956
assert(HAS_ALIGNMENT(size, sizeof(size_t)));
948957

949958
#ifdef EMMALLOC_VERBOSE
950-
MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_region_resize(region=0x' + ($0>>>0).toString(16) + ', size=' + ($1>>>0) + ' bytes)'), region, size);
959+
MAIN_THREAD_ASYNC_EM_ASM(console.log('attempt_region_resize(region=' + ptrToString($0) + ', size=' + toPtr($1) + ' bytes)'), region, size);
951960
#endif
952961

953962
// First attempt to resize this region, if the next region that follows this one
@@ -1015,7 +1024,7 @@ static int acquire_and_attempt_region_resize(Region *region, size_t size)
10151024
void *emmalloc_aligned_realloc(void *ptr, size_t alignment, size_t size)
10161025
{
10171026
#ifdef EMMALLOC_VERBOSE
1018-
MAIN_THREAD_ASYNC_EM_ASM(console.log('aligned_realloc(ptr=0x' + ($0>>>0).toString(16) + ', alignment=' + $1 + ', size=' + ($2>>>0)), ptr, alignment, size);
1027+
MAIN_THREAD_ASYNC_EM_ASM(console.log('aligned_realloc(ptr=' + ptrToString($0) + ', alignment=' + $1 + ', size=' + toPtr($2)), ptr, alignment, size);
10191028
#endif
10201029

10211030
if (!ptr)
@@ -1030,7 +1039,7 @@ void *emmalloc_aligned_realloc(void *ptr, size_t alignment, size_t size)
10301039
if (size > MAX_ALLOC_SIZE)
10311040
{
10321041
#ifdef EMMALLOC_VERBOSE
1033-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
1042+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + toPtr($0) + 'bytes! (negative integer wraparound?)'), size);
10341043
#endif
10351044
return 0;
10361045
}
@@ -1084,7 +1093,7 @@ void *emmalloc_realloc_try(void *ptr, size_t size)
10841093
if (size > MAX_ALLOC_SIZE)
10851094
{
10861095
#ifdef EMMALLOC_VERBOSE
1087-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
1096+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + toPtr($0) + 'bytes! (negative integer wraparound?)'), size);
10881097
#endif
10891098
return 0;
10901099
}
@@ -1119,7 +1128,7 @@ void *emmalloc_aligned_realloc_uninitialized(void *ptr, size_t alignment, size_t
11191128
if (size > MAX_ALLOC_SIZE)
11201129
{
11211130
#ifdef EMMALLOC_VERBOSE
1122-
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + ($0 >>> 0) + 'bytes! (negative integer wraparound?)'), size);
1131+
MAIN_THREAD_ASYNC_EM_ASM(console.log('Allocation failed: attempted allocation size is too large: ' + toPtr($0) + 'bytes! (negative integer wraparound?)'), size);
11231132
#endif
11241133
return 0;
11251134
}
File renamed without changes.

test/browser/async_2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ __attribute__((noinline)) int calc(int x) {
3434
}
3535
// Keep the recursion by passing the function pointer between C++ and JS, so
3636
// that we have a deeply nested stack.
37-
int (*fp)(int) = (int(*)(int))EM_ASM_INT({
37+
int (*fp)(int) = (int(*)(int))EM_ASM_PTR({
3838
return $0;
3939
}, &calc);
4040
return fp(x - 1);

test/fs_after_main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#define NAME "file.cpp"
1313

1414
EMSCRIPTEN_KEEPALIVE
15-
extern "C" void finish(void*) {
15+
extern "C" void finish() {
1616
EM_ASM({
1717
var printed = Module['extraSecretBuffer'].split('Iteration').length - 1;
1818
console.log(printed);

test/runtime_misuse.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extern "C" {
1111
int noted = 0;
1212

1313
char* EMSCRIPTEN_KEEPALIVE note(int n) {
14-
EM_ASM({ Module.noted = $0 }, (long)&noted);
14+
EM_ASM({ Module.noted = Number($0); out("set noted " + Module.noted) }, (long)&noted);
1515
EM_ASM({ out([$0, $1]) }, n, noted);
1616
noted += n;
1717
EM_ASM({ out(['noted is now', $0]) }, noted);

test/runtime_misuse_2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extern "C" {
1111
int noted = 0;
1212

1313
char* EMSCRIPTEN_KEEPALIVE note(int n) {
14-
EM_ASM({ Module.noted = $0 }, (long)&noted);
14+
EM_ASM({ Module.noted = Number($0) }, (long)&noted);
1515
EM_ASM({ out([$0, $1]) }, n, noted);
1616
noted += n;
1717
EM_ASM({ out(['noted is now', $0]) }, noted);

0 commit comments

Comments
 (0)