Skip to content

Commit a995a8b

Browse files
authored
Add downstream changes from emscripten (#17)
1 parent de1dd5f commit a995a8b

File tree

6 files changed

+53
-115
lines changed

6 files changed

+53
-115
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp

Lines changed: 28 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,8 @@ extern struct ps_strings *__ps_strings;
115115
# endif
116116

117117
# if SANITIZER_EMSCRIPTEN
118-
# define weak __attribute__(__weak__)
119-
# define hidden __attribute__((__visibility__("hidden")))
120-
# include <syscall.h>
121-
# undef weak
122-
# undef hidden
123-
# include <emscripten/threading.h>
124-
# include <math.h>
125-
# include <wasi/api.h>
126-
# include <wasi/wasi-helpers.h>
118+
# include <math.h> // For INFINITY
119+
# include <emscripten/threading.h> // For emscripten_futex_wait
127120
# endif
128121

129122
extern char **environ;
@@ -254,8 +247,8 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
254247
# endif
255248

256249
// --------------- sanitizer_libc.h
257-
# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
258-
# if !SANITIZER_S390 && !SANITIZER_EMSCRIPTEN
250+
# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
251+
# if !SANITIZER_S390
259252
uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
260253
u64 offset) {
261254
# if SANITIZER_FREEBSD
@@ -270,25 +263,23 @@ uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
270263
(OFF_T)(offset / 4096));
271264
# endif
272265
}
273-
# endif // !SANITIZER_S390 && !SANITIZER_EMSCRIPTEN
266+
# endif // !SANITIZER_S390
274267

275-
# if !SANITIZER_EMSCRIPTEN
276268
uptr internal_munmap(void *addr, uptr length) {
277269
return internal_syscall(SYSCALL(munmap), (uptr)addr, length);
278270
}
279271

280-
# if SANITIZER_LINUX
272+
# if SANITIZER_LINUX
281273
uptr internal_mremap(void *old_address, uptr old_size, uptr new_size, int flags,
282274
void *new_address) {
283275
return internal_syscall(SYSCALL(mremap), (uptr)old_address, old_size,
284276
new_size, flags, (uptr)new_address);
285277
}
286-
# endif
278+
# endif
287279

288280
int internal_mprotect(void *addr, uptr length, int prot) {
289281
return internal_syscall(SYSCALL(mprotect), (uptr)addr, length, prot);
290282
}
291-
# endif
292283

293284
int internal_madvise(uptr addr, uptr length, int advice) {
294285
return internal_syscall(SYSCALL(madvise), addr, length, advice);
@@ -299,25 +290,18 @@ uptr internal_close_range(fd_t lowfd, fd_t highfd, int flags) {
299290
return internal_syscall(SYSCALL(close_range), lowfd, highfd, flags);
300291
}
301292
# endif
302-
303-
uptr internal_close(fd_t fd) {
304-
# if SANITIZER_EMSCRIPTEN
305-
return __wasi_fd_close(fd);
306-
# else
307-
return internal_syscall(SYSCALL(close), fd);
308-
# endif
309-
}
293+
uptr internal_close(fd_t fd) { return internal_syscall(SYSCALL(close), fd); }
310294

311295
uptr internal_open(const char *filename, int flags) {
312-
# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
296+
# if SANITIZER_LINUX
313297
return internal_syscall(SYSCALL(openat), AT_FDCWD, (uptr)filename, flags);
314298
# else
315299
return internal_syscall(SYSCALL(open), (uptr)filename, flags);
316300
# endif
317301
}
318302

319303
uptr internal_open(const char *filename, int flags, u32 mode) {
320-
# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
304+
# if SANITIZER_LINUX
321305
return internal_syscall(SYSCALL(openat), AT_FDCWD, (uptr)filename, flags,
322306
mode);
323307
# else
@@ -326,35 +310,17 @@ uptr internal_open(const char *filename, int flags, u32 mode) {
326310
}
327311

328312
uptr internal_read(fd_t fd, void *buf, uptr count) {
329-
# if SANITIZER_EMSCRIPTEN
330-
__wasi_iovec_t iov = {(uint8_t *)buf, count};
331-
size_t num;
332-
if (__wasi_syscall_ret(__wasi_fd_read(fd, &iov, 1, &num))) {
333-
return -1;
334-
}
335-
return num;
336-
# else
337313
sptr res;
338314
HANDLE_EINTR(res,
339315
(sptr)internal_syscall(SYSCALL(read), fd, (uptr)buf, count));
340316
return res;
341-
# endif
342317
}
343318

344319
uptr internal_write(fd_t fd, const void *buf, uptr count) {
345-
# if SANITIZER_EMSCRIPTEN
346-
__wasi_ciovec_t iov = {(const uint8_t *)buf, count};
347-
size_t num;
348-
if (__wasi_syscall_ret(__wasi_fd_write(fd, &iov, 1, &num))) {
349-
return -1;
350-
}
351-
return num;
352-
# else
353320
sptr res;
354321
HANDLE_EINTR(res,
355322
(sptr)internal_syscall(SYSCALL(write), fd, (uptr)buf, count));
356323
return res;
357-
# endif
358324
}
359325

360326
uptr internal_ftruncate(fd_t fd, uptr size) {
@@ -577,15 +543,15 @@ uptr internal_filesize(fd_t fd) {
577543
uptr internal_dup(int oldfd) { return internal_syscall(SYSCALL(dup), oldfd); }
578544

579545
uptr internal_dup2(int oldfd, int newfd) {
580-
# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
546+
# if SANITIZER_LINUX
581547
return internal_syscall(SYSCALL(dup3), oldfd, newfd, 0);
582548
# else
583549
return internal_syscall(SYSCALL(dup2), oldfd, newfd);
584550
# endif
585551
}
586552

587553
uptr internal_readlink(const char *path, char *buf, uptr bufsize) {
588-
# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
554+
# if SANITIZER_LINUX
589555
return internal_syscall(SYSCALL(readlinkat), AT_FDCWD, (uptr)path, (uptr)buf,
590556
bufsize);
591557
# else
@@ -594,7 +560,7 @@ uptr internal_readlink(const char *path, char *buf, uptr bufsize) {
594560
}
595561

596562
uptr internal_unlink(const char *path) {
597-
# if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
563+
# if SANITIZER_LINUX
598564
return internal_syscall(SYSCALL(unlinkat), AT_FDCWD, (uptr)path, 0);
599565
# else
600566
return internal_syscall(SYSCALL(unlink), (uptr)path);
@@ -605,54 +571,40 @@ uptr internal_rename(const char *oldpath, const char *newpath) {
605571
# if (defined(__riscv) || defined(__loongarch__)) && defined(__linux__)
606572
return internal_syscall(SYSCALL(renameat2), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
607573
(uptr)newpath, 0);
608-
# elif SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
574+
# elif SANITIZER_LINUX
609575
return internal_syscall(SYSCALL(renameat), AT_FDCWD, (uptr)oldpath, AT_FDCWD,
610576
(uptr)newpath);
611577
# else
612578
return internal_syscall(SYSCALL(rename), (uptr)oldpath, (uptr)newpath);
613579
# endif
614580
}
615581

616-
uptr internal_sched_yield() {
617-
# if SANITIZER_EMSCRIPTEN
618-
return 0;
619-
# else
620-
return internal_syscall(SYSCALL(sched_yield));
621-
# endif
622-
}
582+
uptr internal_sched_yield() { return internal_syscall(SYSCALL(sched_yield)); }
623583

624584
void internal_usleep(u64 useconds) {
625-
# if SANITIZER_EMSCRIPTEN
626-
usleep(useconds);
627-
# else
628585
struct timespec ts;
629586
ts.tv_sec = useconds / 1000000;
630587
ts.tv_nsec = (useconds % 1000000) * 1000;
631588
internal_syscall(SYSCALL(nanosleep), &ts, &ts);
632-
# endif
633589
}
634590

635-
# if !SANITIZER_EMSCRIPTEN
636591
uptr internal_execve(const char *filename, char *const argv[],
637592
char *const envp[]) {
638593
return internal_syscall(SYSCALL(execve), (uptr)filename, (uptr)argv,
639594
(uptr)envp);
640595
}
641-
# endif // !SANITIZER_EMSCRIPTEN
642-
# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD
596+
# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
643597

644-
# if !SANITIZER_NETBSD
598+
# if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
645599
void internal__exit(int exitcode) {
646-
# if SANITIZER_EMSCRIPTEN
647-
__wasi_proc_exit(exitcode);
648-
# elif SANITIZER_FREEBSD || SANITIZER_SOLARIS
600+
# if SANITIZER_FREEBSD || SANITIZER_SOLARIS
649601
internal_syscall(SYSCALL(exit), exitcode);
650602
# else
651603
internal_syscall(SYSCALL(exit_group), exitcode);
652604
# endif
653605
Die(); // Unreachable.
654606
}
655-
# endif // !SANITIZER_NETBSD
607+
# endif // !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
656608

657609
// ----------------- sanitizer_common.h
658610
bool FileExists(const char *filename) {
@@ -672,16 +624,14 @@ bool DirExists(const char *path) {
672624
return S_ISDIR(st.st_mode);
673625
}
674626

675-
# if !SANITIZER_NETBSD
627+
# if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
676628
tid_t GetTid() {
677629
# if SANITIZER_FREEBSD
678630
long Tid;
679631
thr_self(&Tid);
680632
return Tid;
681633
# elif SANITIZER_SOLARIS
682634
return thr_self();
683-
# elif SANITIZER_EMSCRIPTEN
684-
return (tid_t)pthread_self();
685635
# else
686636
return internal_syscall(SYSCALL(gettid));
687637
# endif
@@ -722,16 +672,6 @@ u64 NanoTime() {
722672
}
723673
# endif
724674

725-
# if SANITIZER_EMSCRIPTEN
726-
extern "C" {
727-
int __clock_gettime(__sanitizer_clockid_t clk_id, void *tp);
728-
}
729-
730-
uptr internal_clock_gettime(__sanitizer_clockid_t clk_id, void *tp) {
731-
return __clock_gettime(clk_id, tp);
732-
}
733-
# endif
734-
735675
// Like getenv, but reads env directly from /proc (on Linux) or parses the
736676
// 'environ' array (on some others) and does not use libc. This function
737677
// should be called first inside __asan_init.
@@ -916,14 +856,12 @@ struct linux_dirent {
916856
};
917857
# endif
918858

919-
# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD
920-
# if !SANITIZER_EMSCRIPTEN
859+
# if !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
921860
// Syscall wrappers.
922861
uptr internal_ptrace(int request, int pid, void *addr, void *data) {
923862
return internal_syscall(SYSCALL(ptrace), request, pid, (uptr)addr,
924863
(uptr)data);
925864
}
926-
# endif
927865

928866
uptr internal_waitpid(int pid, int *status, int options) {
929867
return internal_syscall(SYSCALL(wait4), pid, (uptr)status, options,
@@ -953,14 +891,7 @@ uptr internal_getdents(fd_t fd, struct linux_dirent *dirp, unsigned int count) {
953891
}
954892

955893
uptr internal_lseek(fd_t fd, OFF_T offset, int whence) {
956-
# if SANITIZER_EMSCRIPTEN
957-
__wasi_filesize_t result;
958-
return __wasi_syscall_ret(__wasi_fd_seek(fd, offset, whence, &result))
959-
? -1
960-
: result;
961-
# else
962894
return internal_syscall(SYSCALL(lseek), fd, offset, whence);
963-
# endif
964895
}
965896

966897
# if SANITIZER_LINUX
@@ -976,32 +907,25 @@ uptr internal_arch_prctl(int option, uptr arg2) {
976907
# endif
977908
# endif
978909

979-
# if !SANITIZER_EMSCRIPTEN
980910
uptr internal_sigaltstack(const void *ss, void *oss) {
981911
return internal_syscall(SYSCALL(sigaltstack), (uptr)ss, (uptr)oss);
982912
}
983-
# endif
984913

985914
extern "C" pid_t __fork(void);
986915

987916
int internal_fork() {
988-
# if SANITIZER_EMSCRIPTEN
989-
Report("fork not supported on emscripten\n");
990-
return -1;
991-
# else
992-
# if SANITIZER_LINUX
993-
# if SANITIZER_S390
917+
# if SANITIZER_LINUX
918+
# if SANITIZER_S390
994919
return internal_syscall(SYSCALL(clone), 0, SIGCHLD);
995-
# elif SANITIZER_SPARC
920+
# elif SANITIZER_SPARC
996921
// The clone syscall interface on SPARC differs massively from the rest,
997922
// so fall back to __fork.
998923
return __fork();
999-
# else
1000-
return internal_syscall(SYSCALL(clone), SIGCHLD, 0);
1001-
# endif
1002924
# else
1003-
return internal_syscall(SYSCALL(fork));
925+
return internal_syscall(SYSCALL(clone), SIGCHLD, 0);
1004926
# endif
927+
# else
928+
return internal_syscall(SYSCALL(fork));
1005929
# endif
1006930
}
1007931

@@ -1093,8 +1017,6 @@ uptr internal_sigprocmask(int how, __sanitizer_sigset_t *set,
10931017
__sanitizer_sigset_t *oldset) {
10941018
# if SANITIZER_FREEBSD
10951019
return internal_syscall(SYSCALL(sigprocmask), how, set, oldset);
1096-
# elif SANITIZER_EMSCRIPTEN
1097-
return 0;
10981020
# else
10991021
__sanitizer_kernel_sigset_t *k_set = (__sanitizer_kernel_sigset_t *)set;
11001022
__sanitizer_kernel_sigset_t *k_oldset = (__sanitizer_kernel_sigset_t *)oldset;
@@ -1146,7 +1068,7 @@ bool internal_sigismember(__sanitizer_sigset_t *set, int signum) {
11461068
return sigismember(rset, signum);
11471069
}
11481070
# endif
1149-
# endif // !SANITIZER_SOLARIS
1071+
# endif // !SANITIZER_SOLARIS && !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
11501072

11511073
# if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
11521074
// ThreadLister implementation.

compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ SANITIZER_WEAK_IMPORT void *aligned_alloc(__sanitizer::usize __alignment,
308308
#define SANITIZER_INTERCEPT_SENDMMSG SI_LINUX
309309
#define SANITIZER_INTERCEPT_SYSMSG SI_LINUX_NOT_ANDROID
310310
#define SANITIZER_INTERCEPT_GETPEERNAME SI_POSIX
311-
#define SANITIZER_INTERCEPT_IOCTL SI_POSIX && !SI_EMSCRIPTEN
311+
#define SANITIZER_INTERCEPT_IOCTL SI_POSIX_NOT_EMSCRIPTEN
312312
#define SANITIZER_INTERCEPT_INET_ATON SI_POSIX
313313
#define SANITIZER_INTERCEPT_SYSINFO SI_LINUX
314314
#define SANITIZER_INTERCEPT_READDIR SI_POSIX

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@
3838
#define SANITIZER_HAS_STATFS64 1
3939
#endif
4040

41+
#if SANITIZER_EMSCRIPTEN
42+
#include <signal.h> // For sigset_t
43+
#include <time.h> // For clock_t and clockid_t
44+
#endif
45+
4146
#if defined(__sparc__)
4247
// FIXME: This can't be included from tsan which does not support sparc yet.
4348
#include "sanitizer_glibc_version.h"
@@ -534,16 +539,19 @@ extern unsigned struct_sock_fprog_sz;
534539
#endif
535540

536541
#if SANITIZER_EMSCRIPTEN
537-
typedef int __sanitizer_clock_t;
542+
typedef clock_t __sanitizer_clock_t;
538543
#elif defined(__x86_64__) && !defined(_LP64)
539544
typedef long long __sanitizer_clock_t;
540545
#else
541546
typedef long __sanitizer_clock_t;
542547
#endif
543548

544-
#if SANITIZER_LINUX || SANITIZER_EMSCRIPTEN
549+
#if SANITIZER_LINUX
545550
typedef int __sanitizer_clockid_t;
546551
typedef unsigned long long __sanitizer_eventfd_t;
552+
#elif SANITIZER_EMSCRIPTEN
553+
typedef clockid_t __sanitizer_clockid_t;
554+
// eventfd is Unix-specific.
547555
#endif
548556

549557
#if SANITIZER_LINUX
@@ -596,7 +604,7 @@ struct __sanitizer_sigset_t {
596604
uptr val[128 / sizeof(uptr)];
597605
};
598606
#elif SANITIZER_EMSCRIPTEN
599-
typedef unsigned long __sanitizer_sigset_t;
607+
typedef sigset_t __sanitizer_sigset_t;
600608
#endif
601609

602610
struct __sanitizer_siginfo_pad {

compiler-rt/lib/sanitizer_common/sanitizer_syscall_generic.inc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
// NetBSD uses libc calls directly
14-
#if !SANITIZER_NETBSD
13+
// NetBSD and Emscripten uses libc calls directly
14+
#if !SANITIZER_NETBSD && !SANITIZER_EMSCRIPTEN
1515

16-
#if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_SOLARIS || SANITIZER_EMSCRIPTEN
16+
#if SANITIZER_FREEBSD || SANITIZER_APPLE || SANITIZER_SOLARIS
1717
# define SYSCALL(name) SYS_ ## name
1818
#else
1919
# define SYSCALL(name) __NR_ ## name

0 commit comments

Comments
 (0)