Skip to content

Commit 002c1af

Browse files
committed
Fix lsan test suite
1 parent c059ad9 commit 002c1af

File tree

10 files changed

+83
-40
lines changed

10 files changed

+83
-40
lines changed

emcc.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,12 +2134,18 @@ def check_memory_setting(setting):
21342134
else:
21352135
settings.UBSAN_RUNTIME = 2
21362136

2137-
if 'leak' in sanitize:
2138-
settings.USE_LSAN = 1
2139-
default_setting('EXIT_RUNTIME', 1)
2140-
2141-
if settings.LINKABLE:
2142-
exit_with_error('LSan does not support dynamic linking')
2137+
sanitizer_mem = 0
2138+
if sanitize:
2139+
# sanitizers do at least 9 page allocs of a single page during startup.
2140+
sanitizer_mem += webassembly.WASM_PAGE_SIZE * 9
2141+
sanitizer_mem += 2097152 * 10
2142+
# we also allocate at least 11 "regions". Each region is kRegionSize (2 << 20) but
2143+
# MmapAlignedOrDieOnFatalError adds another 2 << 20 for alignment.
2144+
sanitizer_mem += (1 << 21) * 11
2145+
# When running in the threaded mode asan needs to allocate an array of kMaxNumberOfThreads
2146+
# (1 << 22) pointers. See compiler-rt/lib/asan/asan_thread.cpp.
2147+
if settings.USE_PTHREADS:
2148+
sanitizer_mem += (1 << 22) * 4
21432149

21442150
if 'address' in sanitize:
21452151
settings.USE_ASAN = 1
@@ -2213,6 +2219,18 @@ def check_memory_setting(setting):
22132219

22142220
if settings.LINKABLE:
22152221
exit_with_error('ASan does not support dynamic linking')
2222+
elif 'leak' in sanitize:
2223+
settings.USE_LSAN = 1
2224+
default_setting('EXIT_RUNTIME', 1)
2225+
2226+
if settings.LINKABLE:
2227+
exit_with_error('LSan does not support dynamic linking')
2228+
2229+
if sanitizer_mem:
2230+
# Increase the size of the initial memory according to how much memory
2231+
# we think the sanitizers will use.
2232+
logger.debug(f'adding {sanitizer_mem} bytes of memory for sanitizer support')
2233+
settings.INITIAL_MEMORY += sanitizer_mem
22162234

22172235
if sanitize and settings.GENERATE_SOURCE_MAP:
22182236
settings.LOAD_SOURCE_MAP = 1
@@ -2235,7 +2253,6 @@ def check_memory_setting(setting):
22352253
if settings.RELOCATABLE or \
22362254
settings.BUILD_AS_WORKER or \
22372255
settings.USE_WEBGPU or \
2238-
settings.USE_PTHREADS or \
22392256
settings.OFFSCREENCANVAS_SUPPORT or \
22402257
settings.LEGACY_GL_EMULATION or \
22412258
not settings.DISABLE_EXCEPTION_CATCHING or \
@@ -2251,6 +2268,11 @@ def check_memory_setting(setting):
22512268
sanitize:
22522269
settings.EXPORTED_FUNCTIONS += ['_malloc', '_free']
22532270

2271+
# TODO(sbc): Remove this when we land:
2272+
# https://github.com/emscripten-core/emscripten/pull/14912
2273+
if settings.USE_PTHREADS:
2274+
settings.EXPORTED_FUNCTIONS += ['_malloc', '_free', '_emscripten_builtin_memalign', '_emscripten_builtin_malloc', '_emscripten_builtin_free']
2275+
22542276
if not settings.DISABLE_EXCEPTION_CATCHING:
22552277
settings.EXPORTED_FUNCTIONS += [
22562278
# For normal builds the entries in deps_info.py are enough to include

src/library.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3774,6 +3774,8 @@ LibraryManager.library = {
37743774
// tell the memory segments where to place themselves
37753775
__memory_base: '{{{ GLOBAL_BASE }}}',
37763776
__memory_base__import: true,
3777+
__global_base: '{{{ GLOBAL_BASE }}}',
3778+
__global_base__import: true,
37773779
// the wasm backend reserves slot 0 for the NULL function pointer
37783780
__table_base: 1,
37793781
__table_base__import: true,

system/lib/compiler-rt/lib/lsan/lsan_interceptors.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ INTERCEPTOR(int, pthread_atfork, void (*prepare)(), void (*parent)(),
394394
#endif
395395

396396
#if SANITIZER_EMSCRIPTEN
397+
#define __ATTRP_C11_THREAD ((void*)(uptr)-1)
397398
extern "C" {
398399
int emscripten_builtin_pthread_create(void *thread, void *attr,
399400
void *(*callback)(void *), void *arg);
@@ -452,7 +453,7 @@ INTERCEPTOR(int, pthread_create, void *th, void *attr,
452453
ENSURE_LSAN_INITED;
453454
EnsureMainThreadIDIsCorrect();
454455
__sanitizer_pthread_attr_t myattr;
455-
if (!attr) {
456+
if (!attr || attr == __ATTRP_C11_THREAD) {
456457
pthread_attr_init(&myattr);
457458
attr = &myattr;
458459
}

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,7 @@ void ListOfModules::init() {
6060

6161
void ListOfModules::fallbackInit() { clear(); }
6262

63-
SANITIZER_WEAK_ATTRIBUTE int
64-
real_sigaction(int signum, const void *act, void *oldact);
65-
6663
int internal_sigaction(int signum, const void *act, void *oldact) {
67-
#if !SANITIZER_GO
68-
if (&real_sigaction)
69-
return real_sigaction(signum, act, oldact);
70-
#endif
7164
return sigaction(signum, (const struct sigaction *)act,
7265
(struct sigaction *)oldact);
7366
}

tests/core/test_dynamic_cast.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ struct Derived : Support {};
1616
int main() {
1717
Support* p = new Derived;
1818
dynamic_cast<Derived*>(p)->f();
19+
delete p;
20+
return 0;
1921
}

tests/core/test_em_asm_2.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ int main()
102102
i = EM_ASM_INT("{console.log('5. got int ' + $0); return 7.5;}", 42); printf("5. returned int %d\n", i);
103103

104104
printf("\nEM_ASM_INT: Return an integer in a single brief statement.\n");
105-
i = EM_ASM_INT(return HEAP8.length); printf("1. returned statement %d\n", i);
106-
i = EM_ASM_INT("return HEAP8.length+1"); printf("2. returned statement %d\n", i);
107-
i = EM_ASM_INT({"return HEAP8.length+2"}); printf("3. returned statement %d\n", i);
108-
i = EM_ASM_INT({return HEAP8.length+3}); printf("4. returned statement %d\n", i);
109-
i = EM_ASM_INT("return HEAP8.length+4"); printf("5. returned statement %d\n", i);
105+
i = EM_ASM_INT(return 42); printf("1. returned statement %d\n", i);
106+
i = EM_ASM_INT("return 42+1"); printf("2. returned statement %d\n", i);
107+
i = EM_ASM_INT({"return 42+2"}); printf("3. returned statement %d\n", i);
108+
i = EM_ASM_INT({return 42+3}); printf("4. returned statement %d\n", i);
109+
i = EM_ASM_INT("return 42+4"); printf("5. returned statement %d\n", i);
110110

111111
// Note that expressions do not evaluate to return values, but the "return" keyword is needed. That is, the following line would return undefined and store i <- 0.
112112
// i = EM_ASM_INT(HEAP8.length); printf("returned statement %d\n", i);

tests/core/test_em_asm_2.out

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,11 @@ EM_ASM_INT: Return an integer back.
113113
5. returned int 7
114114

115115
EM_ASM_INT: Return an integer in a single brief statement.
116-
1. returned statement 16777216
117-
2. returned statement 16777217
118-
3. returned statement 16777218
119-
4. returned statement 16777219
120-
5. returned statement 16777220
116+
1. returned statement 42
117+
2. returned statement 43
118+
3. returned statement 44
119+
4. returned statement 45
120+
5. returned statement 46
121121

122122
EM_ASM_DOUBLE: Pass no parameters, return a double.
123123
1. returning double

tests/core/test_emptyclass.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ struct Randomized {
1212
};
1313

1414
int main(int argc, const char *argv[]) {
15-
new Randomized(55);
16-
15+
Randomized(55);
1716
return 0;
1817
}

0 commit comments

Comments
 (0)