tsan: support allocator_may_return_null flag

Fixes https://code.google.com/p/thread-sanitizer/issues/detail?id=29

llvm-svn: 191482
This commit is contained in:
Dmitry Vyukov 2013-09-27 02:31:23 +00:00
parent 4467f33e3c
commit 439a904515
3 changed files with 6 additions and 2 deletions

View File

@ -1,5 +1,3 @@
// XFAIL: *
// FIXME: https://code.google.com/p/thread-sanitizer/issues/detail?id=29
// RUN: %clangxx_tsan -O1 %s -o %t // RUN: %clangxx_tsan -O1 %s -o %t
// RUN: TSAN_OPTIONS=allocator_may_return_null=1 %t 2>&1 | FileCheck %s // RUN: TSAN_OPTIONS=allocator_may_return_null=1 %t 2>&1 | FileCheck %s
#include <stdio.h> #include <stdio.h>

View File

@ -64,6 +64,7 @@ void InitializeFlags(Flags *f, const char *env) {
f->external_symbolizer_path = ""; f->external_symbolizer_path = "";
f->history_size = kGoMode ? 1 : 2; // There are a lot of goroutines in Go. f->history_size = kGoMode ? 1 : 2; // There are a lot of goroutines in Go.
f->io_sync = 1; f->io_sync = 1;
f->allocator_may_return_null = false;
// Let a frontend override. // Let a frontend override.
OverrideFlags(f); OverrideFlags(f);
@ -95,6 +96,7 @@ void InitializeFlags(Flags *f, const char *env) {
ParseFlag(env, &f->external_symbolizer_path, "external_symbolizer_path"); ParseFlag(env, &f->external_symbolizer_path, "external_symbolizer_path");
ParseFlag(env, &f->history_size, "history_size"); ParseFlag(env, &f->history_size, "history_size");
ParseFlag(env, &f->io_sync, "io_sync"); ParseFlag(env, &f->io_sync, "io_sync");
ParseFlag(env, &f->allocator_may_return_null, "allocator_may_return_null");
if (!f->report_bugs) { if (!f->report_bugs) {
f->report_thread_leaks = false; f->report_thread_leaks = false;
@ -113,6 +115,8 @@ void InitializeFlags(Flags *f, const char *env) {
" (must be [0..2])\n"); " (must be [0..2])\n");
Die(); Die();
} }
common_flags()->allocator_may_return_null = f->allocator_may_return_null;
} }
} // namespace __tsan } // namespace __tsan

View File

@ -92,6 +92,8 @@ struct Flags {
// 1 - reasonable level of synchronization (write->read) // 1 - reasonable level of synchronization (write->read)
// 2 - global synchronization of all IO operations // 2 - global synchronization of all IO operations
int io_sync; int io_sync;
// If false, the allocator will crash instead of returning 0 on out-of-memory.
bool allocator_may_return_null;
}; };
Flags *flags(); Flags *flags();