diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2013-05-28 12:37:34 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2013-05-28 12:37:34 +0000 |
commit | cc8ed30ebfb4ff6f9d9c7e77760dd5c7841a1af8 (patch) | |
tree | 05a65e32dcf7f1968f5a587d0389ced4f9d0e509 /lib | |
parent | 8a4f89ab04ae6075d50eb1d95c8dd80f0bf198b1 (diff) |
[nolibc] Add a test case for Linux/x86_64.
Differential Revision: http://llvm-reviews.chandlerc.com/D873
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@182770 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sanitizer_common/tests/CMakeLists.txt | 21 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_nolibc_test.cc | 31 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc | 23 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_test_main.cc | 3 |
4 files changed, 78 insertions, 0 deletions
diff --git a/lib/sanitizer_common/tests/CMakeLists.txt b/lib/sanitizer_common/tests/CMakeLists.txt index 25e57507a..9e820e5dd 100644 --- a/lib/sanitizer_common/tests/CMakeLists.txt +++ b/lib/sanitizer_common/tests/CMakeLists.txt @@ -9,6 +9,7 @@ set(SANITIZER_UNITTESTS sanitizer_linux_test.cc sanitizer_list_test.cc sanitizer_mutex_test.cc + sanitizer_nolibc_test.cc sanitizer_printf_test.cc sanitizer_scanf_interceptor_test.cc sanitizer_stackdepot_test.cc @@ -86,6 +87,24 @@ macro(add_sanitizer_tests_for_arch arch) DEPS ${SANITIZER_TEST_OBJECTS} ${SANITIZER_COMMON_LIB} LINK_FLAGS ${SANITIZER_TEST_LINK_FLAGS_COMMON} -lpthread ${TARGET_FLAGS}) + + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND "${arch}" STREQUAL "x86_64") + # Test that the libc-independent part of sanitizer_common is indeed + # independent of libc, by linking this binary without libc (here) and + # executing it (unit test in sanitizer_nolibc_test.cc). + clang_compile(sanitizer_nolibc_test_main.${arch}.o + sanitizer_nolibc_test_main.cc + CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${TARGET_FLAGS} + DEPS ${SANITIZER_RUNTIME_LIBRARIES} ${SANITIZER_TEST_HEADERS}) + add_compiler_rt_test(SanitizerUnitTests "Sanitizer-${arch}-Test-Nolibc" + OBJECTS sanitizer_nolibc_test_main.${arch}.o + -Wl,-whole-archive + libRTSanitizerCommon.test.nolibc.${arch}.a + -Wl,-no-whole-archive + DEPS sanitizer_nolibc_test_main.${arch}.o + RTSanitizerCommon.test.nolibc.${arch} + LINK_FLAGS -nostdlib ${TARGET_FLAGS}) + endif() endmacro() if(COMPILER_RT_CAN_EXECUTE_TESTS) @@ -99,6 +118,8 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS) add_sanitizer_common_lib("RTSanitizerCommon.test.x86_64" $<TARGET_OBJECTS:RTSanitizerCommon.x86_64> $<TARGET_OBJECTS:RTSanitizerCommonLibc.x86_64>) + add_sanitizer_common_lib("RTSanitizerCommon.test.nolibc.x86_64" + $<TARGET_OBJECTS:RTSanitizerCommon.x86_64>) endif() if(CAN_TARGET_i386) add_sanitizer_common_lib("RTSanitizerCommon.test.i386" diff --git a/lib/sanitizer_common/tests/sanitizer_nolibc_test.cc b/lib/sanitizer_common/tests/sanitizer_nolibc_test.cc new file mode 100644 index 000000000..d0d5a5e13 --- /dev/null +++ b/lib/sanitizer_common/tests/sanitizer_nolibc_test.cc @@ -0,0 +1,31 @@ +//===-- sanitizer_nolibc_test.cc ------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a part of ThreadSanitizer/AddressSanitizer runtime. +// Tests for libc independence of sanitizer_common. +// +//===----------------------------------------------------------------------===// + +#include "sanitizer_common/sanitizer_platform.h" + +#include "gtest/gtest.h" + +#include <stdlib.h> + +extern const char *argv0; + +#if SANITIZER_LINUX && defined(__x86_64__) +TEST(SanitizerCommon, NolibcMain) { + std::string NolibcTestPath = argv0; + NolibcTestPath += "-Nolibc"; + int status = system(NolibcTestPath.c_str()); + EXPECT_EQ(true, WIFEXITED(status)); + EXPECT_EQ(0, WEXITSTATUS(status)); +} +#endif diff --git a/lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc b/lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc new file mode 100644 index 000000000..7a40ab83d --- /dev/null +++ b/lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc @@ -0,0 +1,23 @@ +//===-- sanitizer_nolibc_test_main.cc -------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a part of ThreadSanitizer/AddressSanitizer runtime. +// Tests for libc independence of sanitizer_common. +// +//===----------------------------------------------------------------------===// + +#include "sanitizer_common/sanitizer_libc.h" + +// TODO(pcc): Remove these once the allocator dependency is gone. +extern "C" void *__libc_malloc() { return 0; } +extern "C" void __libc_free(void *p) {} + +extern "C" void _start() { + internal__exit(0); +} diff --git a/lib/sanitizer_common/tests/sanitizer_test_main.cc b/lib/sanitizer_common/tests/sanitizer_test_main.cc index 12d1d15af..b7fd3dafa 100644 --- a/lib/sanitizer_common/tests/sanitizer_test_main.cc +++ b/lib/sanitizer_common/tests/sanitizer_test_main.cc @@ -12,7 +12,10 @@ //===----------------------------------------------------------------------===// #include "gtest/gtest.h" +const char *argv0; + int main(int argc, char **argv) { + argv0 = argv[0]; testing::GTEST_FLAG(death_test_style) = "threadsafe"; testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); |