Skip to content

Commit

Permalink
compiler-rt: allow golang race detector to run on musl-c
Browse files Browse the repository at this point in the history
tsan while used by golang's race detector was not working on alpine
linux, since it is using musl-c instead of glibc. Since alpine is very
popular distribution for container deployments, having working race
detector would be nice. This commits adds some ifdefs to get it working.

It fixes golang/go#14481 on golang's issue tracker.

Reviewed-in: https://reviews.llvm.org/D75849
Author: graywolf-at-work (Tomas Volf)
  • Loading branch information
dvyukov authored and memfrob committed Oct 4, 2022
1 parent c7105b5 commit 8153193
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 6 deletions.
2 changes: 1 addition & 1 deletion compiler-rt/lib/sanitizer_common/sanitizer_allocator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const char *PrimaryAllocatorName = "SizeClassAllocator";
const char *SecondaryAllocatorName = "LargeMmapAllocator";

// ThreadSanitizer for Go uses libc malloc/free.
#if SANITIZER_GO || defined(SANITIZER_USE_MALLOC)
#if defined(SANITIZER_USE_MALLOC)
# if SANITIZER_LINUX && !SANITIZER_ANDROID
extern "C" void *__libc_malloc(uptr size);
# if !SANITIZER_GO
Expand Down
2 changes: 2 additions & 0 deletions compiler-rt/lib/sanitizer_common/sanitizer_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@ uptr ReadBinaryNameCached(/*out*/char *buf, uptr buf_len) {
return name_len;
}

#if !SANITIZER_GO
void PrintCmdline() {
char **argv = GetArgv();
if (!argv) return;
Expand All @@ -282,6 +283,7 @@ void PrintCmdline() {
Printf("%s ", argv[i]);
Printf("\n\n");
}
#endif

// Malloc hooks.
static const int kMaxMallocFreeHooks = 5;
Expand Down
10 changes: 6 additions & 4 deletions compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#include "sanitizer_placement_new.h"
#include "sanitizer_procmaps.h"

#if SANITIZER_LINUX
#if SANITIZER_LINUX && !SANITIZER_GO
#include <asm/param.h>
#endif

Expand Down Expand Up @@ -552,7 +552,8 @@ const char *GetEnv(const char *name) {
#endif
}

#if !SANITIZER_FREEBSD && !SANITIZER_NETBSD && !SANITIZER_OPENBSD
#if !SANITIZER_FREEBSD && !SANITIZER_NETBSD && !SANITIZER_OPENBSD && \
!SANITIZER_GO
extern "C" {
SANITIZER_WEAK_ATTRIBUTE extern void *__libc_stack_end;
}
Expand Down Expand Up @@ -584,7 +585,7 @@ static void ReadNullSepFileToArray(const char *path, char ***arr,
}
#endif

#if !SANITIZER_OPENBSD
#if !SANITIZER_OPENBSD && !SANITIZER_GO
static void GetArgsAndEnv(char ***argv, char ***envp) {
#if SANITIZER_FREEBSD
// On FreeBSD, retrieving the argument and environment arrays is done via the
Expand Down Expand Up @@ -1071,7 +1072,8 @@ uptr GetMaxUserVirtualAddress() {

#if !SANITIZER_ANDROID
uptr GetPageSize() {
#if SANITIZER_LINUX && (defined(__x86_64__) || defined(__i386__))
#if SANITIZER_LINUX && (defined(__x86_64__) || defined(__i386__)) && \
defined(EXEC_PAGESIZE)
return EXEC_PAGESIZE;
#elif SANITIZER_FREEBSD || SANITIZER_NETBSD
// Use sysctl as sysconf can trigger interceptors internally.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -807,7 +807,7 @@ u64 MonotonicNanoTime() {
}
#endif // SANITIZER_LINUX && !SANITIZER_GO

#if !SANITIZER_OPENBSD
#if !SANITIZER_OPENBSD && !SANITIZER_GO
void ReExec() {
const char *pathname = "/proc/self/exe";

Expand Down
6 changes: 6 additions & 0 deletions compiler-rt/lib/tsan/go/buildgo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,12 @@ $CC $DIR/gotsan.cpp -c -o $DIR/race_$SUFFIX.syso $FLAGS $CFLAGS

$CC $OSCFLAGS $ARCHCFLAGS test.c $DIR/race_$SUFFIX.syso -g -o $DIR/test $OSLDFLAGS $LDFLAGS

# Verify that no glibc specific code is present
if nm race_$SUFFIX.syso | grep -q __libc_; then
printf -- '%s seems to link to libc\n' "race_$SUFFIX.syso"
exit 1
fi

export GORACE="exitcode=0 atexit_sleep_ms=0"
if [ "$SILENT" != "1" ]; then
$DIR/test
Expand Down

0 comments on commit 8153193

Please sign in to comment.