Skip to content

Commit e75f1d3

Browse files
colincrosspirama-arumuga-nainar
authored andcommitted
[CompilerRT] Fix build of compiler-rt with musl
Use the correct types for OFF_T, __sanitizer_time_t and __sanitizer_dirent and forward time_t related functions to fix using compiler-rt with 32-bit musl libc. Also redirect the time_t functions that are affected by https://musl.libc.org/time64.html to use their 64-bit ABI names. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D119358
1 parent f7a63bc commit e75f1d3

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,76 @@ extern const short *_toupper_tab_;
132132
extern const short *_tolower_tab_;
133133
#endif
134134

135+
#if SANITIZER_MUSL && \
136+
(defined(__i386__) || defined(__arm__) || SANITIZER_MIPS32 || SANITIZER_PPC32)
137+
// musl 1.2.0 on existing 32-bit architectures uses new symbol names for the
138+
// time-related functions that take 64-bit time_t values. See
139+
// https://musl.libc.org/time64.html
140+
#define adjtime __adjtime64
141+
#define adjtimex __adjtimex_time64
142+
#define aio_suspend __aio_suspend_time64
143+
#define clock_adjtime __clock_adjtime64
144+
#define clock_getres __clock_getres_time64
145+
#define clock_gettime __clock_gettime64
146+
#define clock_nanosleep __clock_nanosleep_time64
147+
#define clock_settime __clock_settime64
148+
#define cnd_timedwait __cnd_timedwait_time64
149+
#define ctime __ctime64
150+
#define ctime_r __ctime64_r
151+
#define difftime __difftime64
152+
#define dlsym __dlsym_time64
153+
#define fstatat __fstatat_time64
154+
#define fstat __fstat_time64
155+
#define ftime __ftime64
156+
#define futimens __futimens_time64
157+
#define futimesat __futimesat_time64
158+
#define futimes __futimes_time64
159+
#define getitimer __getitimer_time64
160+
#define getrusage __getrusage_time64
161+
#define gettimeofday __gettimeofday_time64
162+
#define gmtime __gmtime64
163+
#define gmtime_r __gmtime64_r
164+
#define localtime __localtime64
165+
#define localtime_r __localtime64_r
166+
#define lstat __lstat_time64
167+
#define lutimes __lutimes_time64
168+
#define mktime __mktime64
169+
#define mq_timedreceive __mq_timedreceive_time64
170+
#define mq_timedsend __mq_timedsend_time64
171+
#define mtx_timedlock __mtx_timedlock_time64
172+
#define nanosleep __nanosleep_time64
173+
#define ppoll __ppoll_time64
174+
#define pselect __pselect_time64
175+
#define pthread_cond_timedwait __pthread_cond_timedwait_time64
176+
#define pthread_mutex_timedlock __pthread_mutex_timedlock_time64
177+
#define pthread_rwlock_timedrdlock __pthread_rwlock_timedrdlock_time64
178+
#define pthread_rwlock_timedwrlock __pthread_rwlock_timedwrlock_time64
179+
#define pthread_timedjoin_np __pthread_timedjoin_np_time64
180+
#define recvmmsg __recvmmsg_time64
181+
#define sched_rr_get_interval __sched_rr_get_interval_time64
182+
#define select __select_time64
183+
#define semtimedop __semtimedop_time64
184+
#define sem_timedwait __sem_timedwait_time64
185+
#define setitimer __setitimer_time64
186+
#define settimeofday __settimeofday_time64
187+
#define sigtimedwait __sigtimedwait_time64
188+
#define stat __stat_time64
189+
#define stime __stime64
190+
#define thrd_sleep __thrd_sleep_time64
191+
#define timegm __timegm_time64
192+
#define timerfd_gettime __timerfd_gettime64
193+
#define timerfd_settime __timerfd_settime64
194+
#define timer_gettime __timer_gettime64
195+
#define timer_settime __timer_settime64
196+
#define timespec_get __timespec_get_time64
197+
#define time __time64
198+
#define utimensat __utimensat_time64
199+
#define utimes __utimes_time64
200+
#define utime __utime64
201+
#define wait3 __wait3_time64
202+
#define wait4 __wait4_time64
203+
#endif
204+
135205
// Platform-specific options.
136206
#if SANITIZER_MAC
137207
#define PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE 0

compiler-rt/lib/sanitizer_common/sanitizer_internal_defs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ typedef int pid_t;
179179

180180
#if SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_MAC || \
181181
(SANITIZER_SOLARIS && (defined(_LP64) || _FILE_OFFSET_BITS == 64)) || \
182+
(SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID) || \
182183
(SANITIZER_LINUX && (defined(__x86_64__) || defined(__hexagon__)))
183184
typedef u64 OFF_T;
184185
#else

compiler-rt/lib/sanitizer_common/sanitizer_platform.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@
116116
# define SANITIZER_FUCHSIA 0
117117
#endif
118118

119+
// Assume linux that is not glibc or android is musl libc.
120+
#if SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID
121+
# define SANITIZER_MUSL 1
122+
#else
123+
# define SANITIZER_MUSL 0
124+
#endif
125+
119126
#define SANITIZER_POSIX \
120127
(SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_MAC || \
121128
SANITIZER_NETBSD || SANITIZER_SOLARIS)

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,8 @@ struct __sanitizer_group {
370370
char **gr_mem;
371371
};
372372

373-
# if (defined(__x86_64__) && !defined(_LP64)) || defined(__hexagon__)
373+
# if (SANITIZER_LINUX && !SANITIZER_GLIBC && !SANITIZER_ANDROID) || \
374+
(defined(__x86_64__) && !defined(_LP64)) || defined(__hexagon__)
374375
typedef long long __sanitizer_time_t;
375376
#else
376377
typedef long __sanitizer_time_t;
@@ -478,7 +479,8 @@ struct __sanitizer_dirent {
478479
unsigned short d_reclen;
479480
// more fields that we don't care about
480481
};
481-
# elif SANITIZER_ANDROID || defined(__x86_64__) || defined(__hexagon__)
482+
# elif (SANITIZER_LINUX && !SANITIZER_GLIBC) || defined(__x86_64__) || \
483+
defined(__hexagon__)
482484
struct __sanitizer_dirent {
483485
unsigned long long d_ino;
484486
unsigned long long d_off;

0 commit comments

Comments
 (0)