From a693b907c7ffda969b9072d35b9704e55ca542fa Mon Sep 17 00:00:00 2001 From: Serge Pavlov Date: Sat, 15 Apr 2017 05:53:49 +0000 Subject: [PATCH] Do not run tests for crash recovery if libstdc++ safe mode is enabled If expensive checks are enabled, safe mode of libstdc++ is enabled too. In this mode the library uses more complex data that allow additional checks, for instance, a container may keep list of iterators that points to it. If a code crashes it can leave these complex library objects in inconsistent state. It occurs in a few tests that check error recovery if compiler crashes. These test hang in expensive check mode, as the library tries to synchronize access to the iterators pointing to some container, but corresponding mutex remains locked after the crash. This fix marks these tests as unsupported if clang is built with libstdc++ safe mode enabled. Differential Revision: https://reviews.llvm.org/D31126 llvm-svn: 300392 --- clang/test/Index/crash-recovery-code-complete.c | 1 + clang/test/Index/crash-recovery-modules.m | 3 ++- clang/test/Index/crash-recovery-reparse.c | 1 + clang/test/Index/crash-recovery.c | 1 + clang/test/lit.cfg | 9 ++++++++- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/clang/test/Index/crash-recovery-code-complete.c b/clang/test/Index/crash-recovery-code-complete.c index b2a1a9b3..dfb4731 100644 --- a/clang/test/Index/crash-recovery-code-complete.c +++ b/clang/test/Index/crash-recovery-code-complete.c @@ -10,5 +10,6 @@ // FIXME: Please investigate abnormal path in MemoryBuffer. // REQUIRES: can-remove-opened-file +// UNSUPPORTED: libstdcxx-safe-mode #warning parsing original file diff --git a/clang/test/Index/crash-recovery-modules.m b/clang/test/Index/crash-recovery-modules.m index 3e7e805..296416d 100644 --- a/clang/test/Index/crash-recovery-modules.m +++ b/clang/test/Index/crash-recovery-modules.m @@ -4,7 +4,7 @@ // Parse the file, such that building the module will cause Clang to crash. // RUN: not env CINDEXTEST_FAILONERROR=1 c-index-test -test-load-source all -fmodules -fmodules-cache-path=%t -Xclang -fdisable-module-hash -I %S/Inputs/Headers -DCRASH %s > /dev/null 2> %t.err // RUN: FileCheck < %t.err -check-prefix=CHECK-CRASH %s -// CHECK-CRASH: crash-recovery-modules.m:16:9:{16:2-16:14}: fatal error: could not build module 'Crash' +// CHECK-CRASH: crash-recovery-modules.m:17:9:{17:2-17:14}: fatal error: could not build module 'Crash' // Parse the file again, without crashing, to make sure that // subsequent parses do the right thing. @@ -12,6 +12,7 @@ // REQUIRES: crash-recovery // REQUIRES: shell +// UNSUPPORTED: libstdcxx-safe-mode @import Crash; diff --git a/clang/test/Index/crash-recovery-reparse.c b/clang/test/Index/crash-recovery-reparse.c index baa6604..2e4b51a 100644 --- a/clang/test/Index/crash-recovery-reparse.c +++ b/clang/test/Index/crash-recovery-reparse.c @@ -7,5 +7,6 @@ // CHECK-REPARSE-SOURCE-CRASH: Unable to reparse translation unit // // REQUIRES: crash-recovery +// UNSUPPORTED: libstdcxx-safe-mode #warning parsing original file diff --git a/clang/test/Index/crash-recovery.c b/clang/test/Index/crash-recovery.c index e8e84bc..bf13c69 100644 --- a/clang/test/Index/crash-recovery.c +++ b/clang/test/Index/crash-recovery.c @@ -4,5 +4,6 @@ // RUN: env LIBCLANG_DISABLE_CRASH_RECOVERY=1 not --crash c-index-test -test-load-source all %s // // REQUIRES: crash-recovery +// UNSUPPORTED: libstdcxx-safe-mode #pragma clang __debug crash diff --git a/clang/test/lit.cfg b/clang/test/lit.cfg index 2e03c36..e4a1305 100644 --- a/clang/test/lit.cfg +++ b/clang/test/lit.cfg @@ -440,7 +440,8 @@ if not re.match(r'.*-(cygwin)$', config.target_triple): if platform.system() not in ['Windows']: config.available_features.add('can-remove-opened-file') -# Returns set of available features, registered-target(s) and asserts. +# Returns set of available features, registered-target(s), asserts and +# compile definitions. def get_llvm_config_props(): set_of_features = set() @@ -449,6 +450,7 @@ def get_llvm_config_props(): os.path.join(llvm_tools_dir, 'llvm-config'), '--assertion-mode', '--targets-built', + '--cxxflags' ], stdout=subprocess.PIPE, env=config.environment @@ -463,6 +465,11 @@ def get_llvm_config_props(): for arch in cmd.stdout.readline().decode('ascii').split(): set_of_features.add(arch.lower() + '-registered-target') + # 3rd line contains compile definitions, search it to define if + # libstdc++ safe mode is set. + if re.search(r'-D_GLIBCXX_DEBUG\b', cmd.stdout.readline().decode('ascii')): + set_of_features.add('libstdcxx-safe-mode') + return set_of_features config.available_features.update(get_llvm_config_props()) -- 2.7.4