Index: cmake/config-ix.cmake =================================================================== --- cmake/config-ix.cmake +++ cmake/config-ix.cmake @@ -174,7 +174,7 @@ # by other sanitizers (even if they build into dummy object files). filter_available_targets(LSAN_COMMON_SUPPORTED_ARCH ${SANITIZER_COMMON_SUPPORTED_ARCH}) -filter_available_targets(MSAN_SUPPORTED_ARCH x86_64) +filter_available_targets(MSAN_SUPPORTED_ARCH x86_64 mips) filter_available_targets(PROFILE_SUPPORTED_ARCH x86_64 i386 i686 arm mips mips64 mipsel mips64el aarch64) filter_available_targets(TSAN_SUPPORTED_ARCH x86_64) filter_available_targets(UBSAN_SUPPORTED_ARCH x86_64 i386 i686 arm aarch64 mips) Index: lib/msan/CMakeLists.txt =================================================================== --- lib/msan/CMakeLists.txt +++ lib/msan/CMakeLists.txt @@ -22,21 +22,22 @@ # Static runtime library. add_custom_target(msan) -set(arch "x86_64") -if(CAN_TARGET_${arch}) - add_compiler_rt_runtime(clang_rt.msan-${arch} ${arch} STATIC - SOURCES ${MSAN_RTL_SOURCES} - $ - $ - $ - CFLAGS ${MSAN_RTL_CFLAGS}) - add_dependencies(msan clang_rt.msan-${arch}) - list(APPEND MSAN_RUNTIME_LIBRARIES clang_rt.msan-${arch}) - if(UNIX) - add_sanitizer_rt_symbols(clang_rt.msan-${arch} msan.syms.extra) - add_dependencies(msan clang_rt.msan-${arch}-symbols) +foreach(arch ${MSAN_SUPPORTED_ARCH}) + if(CAN_TARGET_${arch}) + add_compiler_rt_runtime(clang_rt.msan-${arch} ${arch} STATIC + SOURCES ${MSAN_RTL_SOURCES} + $ + $ + $ + CFLAGS ${MSAN_RTL_CFLAGS}) + add_dependencies(msan clang_rt.msan-${arch}) + list(APPEND MSAN_RUNTIME_LIBRARIES clang_rt.msan-${arch}) + if(UNIX) + add_sanitizer_rt_symbols(clang_rt.msan-${arch} msan.syms.extra) + add_dependencies(msan clang_rt.msan-${arch}-symbols) + endif() endif() -endif() +endforeach() add_compiler_rt_resource_file(msan_blacklist msan_blacklist.txt) add_dependencies(msan msan_blacklist) Index: lib/msan/msan.h =================================================================== --- lib/msan/msan.h +++ lib/msan/msan.h @@ -25,12 +25,21 @@ # define MSAN_REPLACE_OPERATORS_NEW_AND_DELETE 1 #endif +#if defined(__mips__) && (SANITIZER_WORDSIZE == 32) +#define MEM_TO_SHADOW(mem) (((uptr)mem) & ~0x40000000UL) +#define SHADOW_TO_ORIGIN(shadow) (((uptr)shadow) + 0x20000000UL) +#define MEM_TO_ORIGIN(mem) (SHADOW_TO_ORIGIN(MEM_TO_SHADOW(mem))) +#define MEM_IS_APP(mem) ((uptr)mem >= 0x60000000UL) +#define MEM_IS_SHADOW(mem) \ + ((uptr)mem >= 0x20000000UL && (uptr)mem <= 0x40000000UL) +#else #define MEM_TO_SHADOW(mem) (((uptr)mem) & ~0x400000000000ULL) #define SHADOW_TO_ORIGIN(shadow) (((uptr)shadow) + 0x200000000000ULL) #define MEM_TO_ORIGIN(mem) (SHADOW_TO_ORIGIN(MEM_TO_SHADOW(mem))) #define MEM_IS_APP(mem) ((uptr)mem >= 0x600000000000ULL) #define MEM_IS_SHADOW(mem) \ ((uptr)mem >= 0x200000000000ULL && (uptr)mem <= 0x400000000000ULL) +#endif const int kMsanParamTlsSizeInWords = 100; const int kMsanRetvalTlsSizeInWords = 100; Index: lib/msan/msan.cc =================================================================== --- lib/msan/msan.cc +++ lib/msan/msan.cc @@ -25,6 +25,10 @@ #include "sanitizer_common/sanitizer_symbolizer.h" #include "sanitizer_common/sanitizer_stackdepot.h" +#if defined(__mips__) +#define TLS_TCB_OFFSET 0x7000 +#define TLS_PRE_TCB_SIZE 0x08 +#endif // ACHTUNG! No system header includes in this file. @@ -509,8 +513,25 @@ static void* get_tls_base() { u64 p; + #if defined(__mips__) + char *ptr; + + // For MIPS TLS variant II is used + // The thread pointer (in hardware register $29) points to + // the end of the TCB + 0x7000 + + asm volatile(".set push;\ + .set mips32r2;\ + rdhwr %0,$29;\ + .set pop" : "=r" (ptr)); + ptr -= TLS_TCB_OFFSET; + ptr -= TLS_PRE_TCB_SIZE; + p = (u64)ptr; + #else + u64 p; asm("mov %%fs:0, %0" : "=r"(p) ::); + #endif return (void*)p; } Index: lib/msan/msan_allocator.cc =================================================================== --- lib/msan/msan_allocator.cc +++ lib/msan/msan_allocator.cc @@ -40,6 +40,16 @@ } }; +#if defined (__mips__) && (SANITIZER_WORDSIZE == 32) +static const uptr kMaxAllowedMallocSize = 3UL << 30; +static const uptr kRegionSizeLog = 20; +static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog; +typedef FlatByteMap ByteMap; +typedef CompactSizeClassMap SizeClassMap; +typedef SizeClassAllocator32<0, SANITIZER_MMAP_RANGE_SIZE, sizeof(Metadata), + SizeClassMap, kRegionSizeLog, ByteMap, + MsanMapUnmapCallback> PrimaryAllocator; +#else static const uptr kAllocatorSpace = 0x600000000000ULL; static const uptr kAllocatorSize = 0x80000000000; // 8T. static const uptr kMetadataSize = sizeof(Metadata); @@ -48,6 +58,7 @@ typedef SizeClassAllocator64 PrimaryAllocator; +#endif typedef SizeClassAllocatorLocalCache AllocatorCache; typedef LargeMmapAllocator SecondaryAllocator; typedef CombinedAllocator