summaryrefslogtreecommitdiff
path: root/unittests
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2013-12-19 20:32:44 +0000
committerHans Wennborg <hans@hanshq.net>2013-12-19 20:32:44 +0000
commit837d6ed3ea52e063ff35f96f16558146941c0874 (patch)
tree63a766722acd5754504edbf2b84123533ae3ed29 /unittests
parent75c84130c1a799b63b393b1de41281c3a92e5c86 (diff)
downloadllvm-837d6ed3ea52e063ff35f96f16558146941c0874.tar.gz
llvm-837d6ed3ea52e063ff35f96f16558146941c0874.tar.bz2
llvm-837d6ed3ea52e063ff35f96f16558146941c0874.tar.xz
Make sys::ThreadLocal<> zero-initialized on non-thread builds (PR18205)
According to the docs, ThreadLocal<>::get() should return NULL if no object has been set. This patch makes that the case also for non-thread builds and adds a very basic unit test to check it. (This was causing PR18205 because PrettyStackTraceHead didn't get zero- initialized and we'd crash trying to read past the end of that list. We didn't notice this so much on Linux since we'd crash after printing all the entries, but on Mac we print into a SmallString, and would crash before printing that.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197718 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r--unittests/Support/CMakeLists.txt1
-rw-r--r--unittests/Support/ThreadLocalTest.cpp38
2 files changed, 39 insertions, 0 deletions
diff --git a/unittests/Support/CMakeLists.txt b/unittests/Support/CMakeLists.txt
index c2753629cb..0abc2ffe1d 100644
--- a/unittests/Support/CMakeLists.txt
+++ b/unittests/Support/CMakeLists.txt
@@ -30,6 +30,7 @@ add_llvm_unittest(SupportTests
RegexTest.cpp
SourceMgrTest.cpp
SwapByteOrderTest.cpp
+ ThreadLocalTest.cpp
TimeValueTest.cpp
UnicodeTest.cpp
ValueHandleTest.cpp
diff --git a/unittests/Support/ThreadLocalTest.cpp b/unittests/Support/ThreadLocalTest.cpp
new file mode 100644
index 0000000000..dd4d706f5c
--- /dev/null
+++ b/unittests/Support/ThreadLocalTest.cpp
@@ -0,0 +1,38 @@
+//===- llvm/unittest/Support/ThreadLocalTest.cpp - Therad Local tests ---===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/ThreadLocal.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+using namespace sys;
+
+namespace {
+
+class ThreadLocalTest : public ::testing::Test {
+};
+
+struct S {
+ int i;
+};
+
+TEST_F(ThreadLocalTest, Basics) {
+ ThreadLocal<const S> x;
+
+ EXPECT_EQ(0, x.get());
+
+ S s;
+ x.set(&s);
+ EXPECT_EQ(&s, x.get());
+
+ x.erase();
+ EXPECT_EQ(0, x.get());
+}
+
+}