From bf2bfa5aa4f1c8051a5bc0bbb94ad03ff98fd028 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 14 Aug 2012 13:22:58 +0000 Subject: [PATCH] [ASan] support for running OS-specific tests using lit, port clone_test as an example llvm-svn: 161864 --- .../lib/asan/lit_tests/Linux/clone_test.cc | 33 +++++++++++++++++++ .../lib/asan/lit_tests/Linux/lit.local.cfg | 9 +++++ .../lib/asan/lit_tests/lit.site.cfg.in | 1 + 3 files changed, 43 insertions(+) create mode 100644 compiler-rt/lib/asan/lit_tests/Linux/clone_test.cc create mode 100644 compiler-rt/lib/asan/lit_tests/Linux/lit.local.cfg diff --git a/compiler-rt/lib/asan/lit_tests/Linux/clone_test.cc b/compiler-rt/lib/asan/lit_tests/Linux/clone_test.cc new file mode 100644 index 000000000000..ece27b186a77 --- /dev/null +++ b/compiler-rt/lib/asan/lit_tests/Linux/clone_test.cc @@ -0,0 +1,33 @@ +// Regression test for: +// http://code.google.com/p/address-sanitizer/issues/detail?id=37 + +// RUN: %clang_asan -O2 %s -o %t +// RUN: %t | FileCheck %s + +#include +#include +#include +#include +#include +#include + +int Child(void *arg) { + char x[32] = {0}; // Stack gets poisoned. + printf("Child: %p\n", x); + _exit(1); // NoReturn, stack will remain unpoisoned unless we do something. +} + +int main(int argc, char **argv) { + const int kStackSize = 1 << 20; + char child_stack[kStackSize + 1]; + char *sp = child_stack + kStackSize; // Stack grows down. + printf("Parent: %p\n", sp); + pid_t clone_pid = clone(Child, sp, CLONE_FILES | CLONE_VM, NULL, 0, 0, 0); + waitpid(clone_pid, NULL, 0); + for (int i = 0; i < kStackSize; i++) + child_stack[i] = i; + int ret = child_stack[argc - 1]; + printf("PASSED\n"); + // CHECK: PASSED + return ret; +} diff --git a/compiler-rt/lib/asan/lit_tests/Linux/lit.local.cfg b/compiler-rt/lib/asan/lit_tests/Linux/lit.local.cfg new file mode 100644 index 000000000000..57271b8078a4 --- /dev/null +++ b/compiler-rt/lib/asan/lit_tests/Linux/lit.local.cfg @@ -0,0 +1,9 @@ +def getRoot(config): + if not config.parent: + return config + return getRoot(config.parent) + +root = getRoot(config) + +if root.host_os not in ['Linux']: + config.unsupported = True diff --git a/compiler-rt/lib/asan/lit_tests/lit.site.cfg.in b/compiler-rt/lib/asan/lit_tests/lit.site.cfg.in index f4385709e7fa..89956e6e35a3 100644 --- a/compiler-rt/lib/asan/lit_tests/lit.site.cfg.in +++ b/compiler-rt/lib/asan/lit_tests/lit.site.cfg.in @@ -2,6 +2,7 @@ # Do not edit! config.target_triple = "@TARGET_TRIPLE@" +config.host_os = "@HOST_OS@" config.llvm_src_root = "@LLVM_SOURCE_DIR@" config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" config.clang = "@LLVM_BINARY_DIR@/bin/clang"