Index: cmake/config-ix.cmake =================================================================== --- cmake/config-ix.cmake +++ cmake/config-ix.cmake @@ -179,7 +179,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 mips64 mips64el) +filter_available_targets(MSAN_SUPPORTED_ARCH i386 x86_64 mips64 mips64el) filter_available_targets(PROFILE_SUPPORTED_ARCH x86_64 i386 i686 arm mips mips64 mipsel mips64el aarch64 powerpc64 powerpc64le) filter_available_targets(TSAN_SUPPORTED_ARCH x86_64) Index: lib/msan/msan.h =================================================================== --- lib/msan/msan.h +++ lib/msan/msan.h @@ -25,7 +25,14 @@ # define MSAN_REPLACE_OPERATORS_NEW_AND_DELETE 1 #endif -#if defined(__mips64) +#if defined(__i386__) +#define MEM_TO_SHADOW(mem) (((uptr)mem) & ~0x80000000UL) +#define SHADOW_TO_ORIGIN(shadow) (((uptr)shadow) + 0x40000000UL) +#define MEM_TO_ORIGIN(mem) (SHADOW_TO_ORIGIN(MEM_TO_SHADOW(mem))) +#define MEM_IS_APP(mem) ((uptr)mem >= 0xc0000000UL) +#define MEM_IS_SHADOW(mem) \ + ((uptr)mem >= 0x40000000UL && (uptr)mem <= 0x80000000UL) +#elif defined(__mips64) #define MEM_TO_SHADOW(mem) (((uptr)mem) & ~0x4000000000ULL) #define SHADOW_TO_ORIGIN(shadow) (((uptr)shadow) + 0x2000000000ULL) #define MEM_TO_ORIGIN(mem) (SHADOW_TO_ORIGIN(MEM_TO_SHADOW(mem))) Index: lib/msan/msan_allocator.cc =================================================================== --- lib/msan/msan_allocator.cc +++ lib/msan/msan_allocator.cc @@ -40,7 +40,16 @@ } }; -#if defined(__mips64) +#if defined (__i386__) + 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; +#elif defined(__mips64) static const uptr kMaxAllowedMallocSize = 2UL << 30; static const uptr kRegionSizeLog = 20; static const uptr kNumRegions = SANITIZER_MMAP_RANGE_SIZE >> kRegionSizeLog; Index: lib/msan/msan_linux.cc =================================================================== --- lib/msan/msan_linux.cc +++ lib/msan/msan_linux.cc @@ -35,7 +35,10 @@ namespace __msan { -#if defined(__mips64) +#if defined(__i386__) +static const uptr kMemBeg = 0xc0000000; +static const uptr kMemEnd = 0xffffffff; +#elif defined(__mips64) static const uptr kMemBeg = 0xe000000000; static const uptr kMemEnd = 0xffffffffff; #elif defined(__x86_64__) Index: lib/sanitizer_common/sanitizer_platform_interceptors.h =================================================================== --- lib/sanitizer_common/sanitizer_platform_interceptors.h +++ lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -168,7 +168,8 @@ #define SANITIZER_INTERCEPT_ETHER_HOST SI_MAC || SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_ETHER_R SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_SHMCTL \ - ((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && SANITIZER_WORDSIZE == 64) + ((SI_FREEBSD || SI_LINUX_NOT_ANDROID) && \ + (SANITIZER_WORDSIZE == 64 || defined(__i386__))) #define SANITIZER_INTERCEPT_RANDOM_R SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GET SI_NOT_WINDOWS #define SANITIZER_INTERCEPT_PTHREAD_ATTR_GETINHERITSCHED \