]> granicus.if.org Git - clang/commitdiff
Do not run tests for crash recovery if libstdc++ safe mode is enabled
authorSerge Pavlov <sepavloff@gmail.com>
Sat, 15 Apr 2017 05:53:49 +0000 (05:53 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Sat, 15 Apr 2017 05:53:49 +0000 (05:53 +0000)
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

test/Index/crash-recovery-code-complete.c
test/Index/crash-recovery-modules.m
test/Index/crash-recovery-reparse.c
test/Index/crash-recovery.c
test/lit.cfg

index b2a1a9b3f96b2bbc0d33e9925f26cbae82f1093c..dfb47316dc9d71935896998b6345a7ae560442ab 100644 (file)
@@ -10,5 +10,6 @@
 
 // FIXME: Please investigate abnormal path in MemoryBuffer.
 // REQUIRES: can-remove-opened-file
+// UNSUPPORTED: libstdcxx-safe-mode
 
 #warning parsing original file
index 3e7e8059aaaada77b9da19f479f0ea545e743e41..296416df97f28db2a9cf0af96dc9e7ed12c67807 100644 (file)
@@ -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;
 
index baa6604b53520bfd0b010a9741c29d26bb102197..2e4b51a8ca4b249fab319878dc7a15ac051452fd 100644 (file)
@@ -7,5 +7,6 @@
 // CHECK-REPARSE-SOURCE-CRASH: Unable to reparse translation unit
 //
 // REQUIRES: crash-recovery
+// UNSUPPORTED: libstdcxx-safe-mode
 
 #warning parsing original file
index e8e84bc504dc1bc1ed7c7d21193a10a291d6c31e..bf13c69eb1279049e6eeeeeb9f19bab25046ef8f 100644 (file)
@@ -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
index 2e03c367947046db79d555a86806892ecaefe739..e4a13054ba8127232706d048827f74ad95369561 100644 (file)
@@ -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())