Skip to content
Snippets Groups Projects
Commit f246e7a5 authored by Serge Pavlov's avatar Serge Pavlov
Browse files

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


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300392 91177308-0d34-0410-b5e6-96231b3b80d8
parent f578022c
No related branches found
No related tags found
No related merge requests found
...@@ -10,5 +10,6 @@ ...@@ -10,5 +10,6 @@
// FIXME: Please investigate abnormal path in MemoryBuffer. // FIXME: Please investigate abnormal path in MemoryBuffer.
// REQUIRES: can-remove-opened-file // REQUIRES: can-remove-opened-file
// UNSUPPORTED: libstdcxx-safe-mode
#warning parsing original file #warning parsing original file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
// Parse the file, such that building the module will cause Clang to crash. // 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: 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 // 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 // Parse the file again, without crashing, to make sure that
// subsequent parses do the right thing. // subsequent parses do the right thing.
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
// REQUIRES: crash-recovery // REQUIRES: crash-recovery
// REQUIRES: shell // REQUIRES: shell
// UNSUPPORTED: libstdcxx-safe-mode
@import Crash; @import Crash;
......
...@@ -7,5 +7,6 @@ ...@@ -7,5 +7,6 @@
// CHECK-REPARSE-SOURCE-CRASH: Unable to reparse translation unit // CHECK-REPARSE-SOURCE-CRASH: Unable to reparse translation unit
// //
// REQUIRES: crash-recovery // REQUIRES: crash-recovery
// UNSUPPORTED: libstdcxx-safe-mode
#warning parsing original file #warning parsing original file
...@@ -4,5 +4,6 @@ ...@@ -4,5 +4,6 @@
// RUN: env LIBCLANG_DISABLE_CRASH_RECOVERY=1 not --crash c-index-test -test-load-source all %s // RUN: env LIBCLANG_DISABLE_CRASH_RECOVERY=1 not --crash c-index-test -test-load-source all %s
// //
// REQUIRES: crash-recovery // REQUIRES: crash-recovery
// UNSUPPORTED: libstdcxx-safe-mode
#pragma clang __debug crash #pragma clang __debug crash
...@@ -440,7 +440,8 @@ if not re.match(r'.*-(cygwin)$', config.target_triple): ...@@ -440,7 +440,8 @@ if not re.match(r'.*-(cygwin)$', config.target_triple):
if platform.system() not in ['Windows']: if platform.system() not in ['Windows']:
config.available_features.add('can-remove-opened-file') 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(): def get_llvm_config_props():
set_of_features = set() set_of_features = set()
...@@ -449,6 +450,7 @@ def get_llvm_config_props(): ...@@ -449,6 +450,7 @@ def get_llvm_config_props():
os.path.join(llvm_tools_dir, 'llvm-config'), os.path.join(llvm_tools_dir, 'llvm-config'),
'--assertion-mode', '--assertion-mode',
'--targets-built', '--targets-built',
'--cxxflags'
], ],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
env=config.environment env=config.environment
...@@ -463,6 +465,11 @@ def get_llvm_config_props(): ...@@ -463,6 +465,11 @@ def get_llvm_config_props():
for arch in cmd.stdout.readline().decode('ascii').split(): for arch in cmd.stdout.readline().decode('ascii').split():
set_of_features.add(arch.lower() + '-registered-target') 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 return set_of_features
config.available_features.update(get_llvm_config_props()) config.available_features.update(get_llvm_config_props())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment