[PATCH] [nolibc] Add a test case for Linux/x86_64.

Peter Collingbourne peter at pcc.me.uk
Tue May 28 05:03:26 PDT 2013


    - Ensure we execute the test and check its return value

Hi kcc,

http://llvm-reviews.chandlerc.com/D873

CHANGE SINCE LAST DIFF
  http://llvm-reviews.chandlerc.com/D873?vs=2145&id=2151#toc

Files:
  lib/sanitizer_common/tests/CMakeLists.txt
  lib/sanitizer_common/tests/sanitizer_nolibc_test.cc
  lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc
  lib/sanitizer_common/tests/sanitizer_test_main.cc

Index: lib/sanitizer_common/tests/CMakeLists.txt
===================================================================
--- lib/sanitizer_common/tests/CMakeLists.txt
+++ lib/sanitizer_common/tests/CMakeLists.txt
@@ -9,6 +9,7 @@
   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,25 @@
                        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)
+   endif()
 endmacro()
 
 if(COMPILER_RT_CAN_EXECUTE_TESTS)
@@ -99,6 +119,8 @@
       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"
Index: lib/sanitizer_common/tests/sanitizer_nolibc_test.cc
===================================================================
--- /dev/null
+++ 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
Index: lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc
===================================================================
--- lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc
+++ lib/sanitizer_common/tests/sanitizer_nolibc_test_main.cc
@@ -1,4 +1,4 @@
-//===-- sanitizer_test_main.cc --------------------------------------------===//
+//===-- sanitizer_nolibc_test_main.cc -------------------------------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -8,12 +8,16 @@
 //===----------------------------------------------------------------------===//
 //
 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
+// Tests for libc independence of sanitizer_common.
 //
 //===----------------------------------------------------------------------===//
-#include "gtest/gtest.h"
 
-int main(int argc, char **argv) {
-  testing::GTEST_FLAG(death_test_style) = "threadsafe";
-  testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
+#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);
 }
Index: lib/sanitizer_common/tests/sanitizer_test_main.cc
===================================================================
--- lib/sanitizer_common/tests/sanitizer_test_main.cc
+++ 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();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D873.2.patch
Type: text/x-patch
Size: 5339 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130528/61d8a108/attachment.bin>


More information about the llvm-commits mailing list