mirror of
https://github.com/intel/llvm.git
synced 2026-01-14 03:50:17 +08:00
[scudo] Android build support
Summary: Mark Android as supported in the cmake configuration for Scudo. Scudo is not added yet in the Android build bots, but code builds and tests pass locally. It is for a later CL. I also checked that Scudo builds as part of the Android toolchain. A few modifications had to be made: - Android defaults to `abort_on_error=1`, which doesn't work well with the current tests. So change the default way to pass `SCUDO_OPTIONS` to the tests to account for this, setting it to 0 by default; - Disable the `valloc.cpp` & `random_shuffle.cpp` tests on Android; - There is a bit of gymnatic to be done with the `SCUDO_TEST_TARGET_ARCH` string, due to android using the `-android` suffix, and `i686` instead of `i386`; - Android doesn't need `-lrt`. Reviewers: alekseyshl, eugenis Reviewed By: alekseyshl Subscribers: srhines, mgorny, llvm-commits Differential Revision: https://reviews.llvm.org/D37907 llvm-svn: 313538
This commit is contained in:
@@ -574,7 +574,7 @@ else()
|
||||
endif()
|
||||
|
||||
if (COMPILER_RT_HAS_SANITIZER_COMMON AND SCUDO_SUPPORTED_ARCH AND
|
||||
OS_NAME MATCHES "Linux")
|
||||
OS_NAME MATCHES "Linux|Android")
|
||||
set(COMPILER_RT_HAS_SCUDO TRUE)
|
||||
else()
|
||||
set(COMPILER_RT_HAS_SCUDO FALSE)
|
||||
|
||||
@@ -15,7 +15,15 @@ configure_lit_site_cfg(
|
||||
|
||||
set(SCUDO_TEST_ARCH ${SCUDO_SUPPORTED_ARCH})
|
||||
foreach(arch ${SCUDO_TEST_ARCH})
|
||||
set(SCUDO_TEST_TARGET_ARCH ${arch})
|
||||
if(ANDROID)
|
||||
if (${arch} STREQUAL "i386")
|
||||
set(SCUDO_TEST_TARGET_ARCH i686-android)
|
||||
else()
|
||||
set(SCUDO_TEST_TARGET_ARCH ${arch}-android)
|
||||
endif()
|
||||
else()
|
||||
set(SCUDO_TEST_TARGET_ARCH ${arch})
|
||||
endif()
|
||||
string(TOLOWER "-${arch}" SCUDO_TEST_CONFIG_SUFFIX)
|
||||
get_test_cc_for_arch(${arch} SCUDO_TEST_TARGET_CC SCUDO_TEST_TARGET_CFLAGS)
|
||||
string(TOUPPER ${arch} ARCH_UPPER_CASE)
|
||||
|
||||
@@ -25,15 +25,30 @@ c_flags = ([config.target_cflags] +
|
||||
"-O0",
|
||||
"-UNDEBUG",
|
||||
"-ldl",
|
||||
"-lrt",
|
||||
"-Wl,--gc-sections"])
|
||||
|
||||
# Android doesn't want -lrt.
|
||||
if not config.android:
|
||||
c_flags += ["-lrt"]
|
||||
|
||||
def build_invocation(compile_flags):
|
||||
return " " + " ".join([config.clang] + compile_flags) + " "
|
||||
|
||||
# Add clang substitutions.
|
||||
config.substitutions.append( ("%clang_scudo ",
|
||||
build_invocation(c_flags) + whole_archive) )
|
||||
config.substitutions.append(("%clang_scudo ",
|
||||
build_invocation(c_flags) + whole_archive))
|
||||
|
||||
# Platform-specific default SCUDO_OPTIONS for lit tests.
|
||||
default_scudo_opts = ''
|
||||
if config.android:
|
||||
# Android defaults to abort_on_error=1, which doesn't work for us.
|
||||
default_scudo_opts = 'abort_on_error=0'
|
||||
|
||||
if default_scudo_opts:
|
||||
config.environment['SCUDO_OPTIONS'] = default_scudo_opts
|
||||
default_scudo_opts += ':'
|
||||
config.substitutions.append(('%env_scudo_opts=',
|
||||
'env SCUDO_OPTIONS=' + default_scudo_opts))
|
||||
|
||||
# Hardened Allocator tests are currently supported on Linux only.
|
||||
if config.host_os not in ['Linux']:
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
config.name_suffix = "@SCUDO_TEST_CONFIG_SUFFIX@"
|
||||
config.target_arch = "@SCUDO_TEST_TARGET_ARCH@"
|
||||
config.target_cflags = "@SCUDO_TEST_TARGET_CFLAGS@"
|
||||
config.android = "@ANDROID@"
|
||||
|
||||
# Load common config for all compiler-rt lit tests.
|
||||
lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@/test/lit.common.configured")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: %run %t valid 2>&1
|
||||
// RUN: not %run %t invalid 2>&1
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t invalid 2>&1
|
||||
// RUN: %run %t valid 2>&1
|
||||
// RUN: not %run %t invalid 2>&1
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=1 %run %t invalid 2>&1
|
||||
|
||||
// Tests that the various aligned allocation functions work as intended. Also
|
||||
// tests for the condition where the alignment is not a power of 2.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=1 not %run %t mallocdel 2>&1 | FileCheck --check-prefix=CHECK-dealloc %s
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=0 %run %t mallocdel 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=1 not %run %t newfree 2>&1 | FileCheck --check-prefix=CHECK-dealloc %s
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=0 %run %t newfree 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=1 not %run %t memaligndel 2>&1 | FileCheck --check-prefix=CHECK-dealloc %s
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=0 %run %t memaligndel 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=1 not %run %t memalignrealloc 2>&1 | FileCheck --check-prefix=CHECK-realloc %s
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=0 %run %t memalignrealloc 2>&1
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=1 not %run %t mallocdel 2>&1 | FileCheck --check-prefix=CHECK-dealloc %s
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=0 %run %t mallocdel 2>&1
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=1 not %run %t newfree 2>&1 | FileCheck --check-prefix=CHECK-dealloc %s
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=0 %run %t newfree 2>&1
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=1 not %run %t memaligndel 2>&1 | FileCheck --check-prefix=CHECK-dealloc %s
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=0 %run %t memaligndel 2>&1
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=1 not %run %t memalignrealloc 2>&1 | FileCheck --check-prefix=CHECK-realloc %s
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=0 %run %t memalignrealloc 2>&1
|
||||
|
||||
// Tests that type mismatches between allocation and deallocation functions are
|
||||
// caught when the related option is set.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: %run %t 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=0 %run %t 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeallocationTypeMismatch=1 not %run %t 2>&1 | FileCheck %s
|
||||
// RUN: %run %t 2>&1
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=0 %run %t 2>&1
|
||||
// RUN: %env_scudo_opts=DeallocationTypeMismatch=1 not %run %t 2>&1 | FileCheck %s
|
||||
|
||||
// Tests that the options can be passed using getScudoDefaultOptions, and that
|
||||
// the environment ones take precedence over them.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: not %run %t malloc 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=QuarantineSizeKb=64 not %run %t quarantine 2>&1 | FileCheck %s
|
||||
// RUN: not %run %t malloc 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=QuarantineSizeKb=64 not %run %t quarantine 2>&1 | FileCheck %s
|
||||
|
||||
// Tests that header corruption of an allocated or quarantined chunk is caught.
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: SCUDO_OPTIONS="QuarantineSizeMb=1:QuarantineSizeKb=64" not %run %t unused 2>&1
|
||||
// RUN: SCUDO_OPTIONS="QuarantineSizeMb=1:QuarantineChunksUpToSize=256" not %run %t unused 2>&1
|
||||
// RUN: SCUDO_OPTIONS="QuarantineSizeKb=0:ThreadLocalQuarantineSizeKb=0" %run %t zeroquarantine 2>&1
|
||||
// RUN: SCUDO_OPTIONS=QuarantineSizeKb=64 %run %t smallquarantine 2>&1
|
||||
// RUN: SCUDO_OPTIONS=QuarantineChunksUpToSize=256 %run %t threshold 2>&1
|
||||
// RUN: SCUDO_OPTIONS="QuarantineSizeMb=1" %run %t oldquarantine 2>&1
|
||||
// RUN: %env_scudo_opts="QuarantineSizeMb=1:QuarantineSizeKb=64" not %run %t unused 2>&1
|
||||
// RUN: %env_scudo_opts="QuarantineSizeMb=1:QuarantineChunksUpToSize=256" not %run %t unused 2>&1
|
||||
// RUN: %env_scudo_opts="QuarantineSizeKb=0:ThreadLocalQuarantineSizeKb=0" %run %t zeroquarantine 2>&1
|
||||
// RUN: %env_scudo_opts=QuarantineSizeKb=64 %run %t smallquarantine 2>&1
|
||||
// RUN: %env_scudo_opts=QuarantineChunksUpToSize=256 %run %t threshold 2>&1
|
||||
// RUN: %env_scudo_opts="QuarantineSizeMb=1" %run %t oldquarantine 2>&1
|
||||
|
||||
// Tests that the quarantine prevents a chunk from being reused right away.
|
||||
// Also tests that a chunk will eventually become available again for
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
// RUN: not diff %T/random_shuffle_tmp_dir/out?
|
||||
// RUN: rm -rf %T/random_shuffle_tmp_dir
|
||||
// UNSUPPORTED: i386-linux,arm-linux,armhf-linux,aarch64-linux,mips-linux,mipsel-linux,mips64-linux,mips64el-linux
|
||||
// UNSUPPORTED: android
|
||||
|
||||
// Tests that the allocator shuffles the chunks before returning to the user.
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
// RUN: %clang_scudo -fsized-deallocation %s -o %t
|
||||
// RUN: SCUDO_OPTIONS=DeleteSizeMismatch=1 %run %t gooddel 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeleteSizeMismatch=1 not %run %t baddel 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=DeleteSizeMismatch=0 %run %t baddel 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeleteSizeMismatch=1 %run %t gooddelarr 2>&1
|
||||
// RUN: SCUDO_OPTIONS=DeleteSizeMismatch=1 not %run %t baddelarr 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=DeleteSizeMismatch=0 %run %t baddelarr 2>&1
|
||||
// RUN: %env_scudo_opts=DeleteSizeMismatch=1 %run %t gooddel 2>&1
|
||||
// RUN: %env_scudo_opts=DeleteSizeMismatch=1 not %run %t baddel 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=DeleteSizeMismatch=0 %run %t baddel 2>&1
|
||||
// RUN: %env_scudo_opts=DeleteSizeMismatch=1 %run %t gooddelarr 2>&1
|
||||
// RUN: %env_scudo_opts=DeleteSizeMismatch=1 not %run %t baddelarr 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=DeleteSizeMismatch=0 %run %t baddelarr 2>&1
|
||||
|
||||
// Ensures that the sized delete operator errors out when the appropriate
|
||||
// option is passed and the sizes do not match between allocation and
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
// RUN: %clang_scudo %s -lstdc++ -o %t
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=0 not %run %t malloc 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t malloc 2>&1
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=0 not %run %t calloc 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t calloc 2>&1
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=0 not %run %t new 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 not %run %t new 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=0 not %run %t new-nothrow 2>&1 | FileCheck %s
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t new-nothrow 2>&1
|
||||
// RUN: %run %t usable 2>&1
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=0 not %run %t malloc 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=1 %run %t malloc 2>&1
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=0 not %run %t calloc 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=1 %run %t calloc 2>&1
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=0 not %run %t new 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=1 not %run %t new 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=0 not %run %t new-nothrow 2>&1 | FileCheck %s
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=1 %run %t new-nothrow 2>&1
|
||||
// RUN: %run %t usable 2>&1
|
||||
|
||||
// Tests for various edge cases related to sizes, notably the maximum size the
|
||||
// allocator can allocate. Tests that an integer overflow in the parameters of
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: SCUDO_OPTIONS="QuarantineSizeMb=0:ThreadLocalQuarantineSizeKb=0" %run %t 5 1000000 2>&1
|
||||
// RUN: SCUDO_OPTIONS="QuarantineSizeMb=1:ThreadLocalQuarantineSizeKb=64" %run %t 5 1000000 2>&1
|
||||
// RUN: %env_scudo_opts="QuarantineSizeKb=0:ThreadLocalQuarantineSizeKb=0" %run %t 5 1000000 2>&1
|
||||
// RUN: %env_scudo_opts="QuarantineSizeKb=1024:ThreadLocalQuarantineSizeKb=64" %run %t 5 1000000 2>&1
|
||||
|
||||
// Tests parallel allocations and deallocations of memory chunks from a number
|
||||
// of concurrent threads, with and without quarantine.
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
// RUN: %clang_scudo %s -o %t
|
||||
// RUN: %run %t valid 2>&1
|
||||
// RUN: not %run %t invalid 2>&1
|
||||
// RUN: SCUDO_OPTIONS=allocator_may_return_null=1 %run %t invalid 2>&1
|
||||
// RUN: %run %t valid 2>&1
|
||||
// RUN: not %run %t invalid 2>&1
|
||||
// RUN: %env_scudo_opts=allocator_may_return_null=1 %run %t invalid 2>&1
|
||||
// UNSUPPORTED: android
|
||||
|
||||
// Tests that valloc and pvalloc work as intended.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user