[llvm] r197718 - Make sys::ThreadLocal<> zero-initialized on non-thread builds (PR18205)
Hans Wennborg
hans at hanshq.net
Thu Dec 19 12:32:44 PST 2013
Author: hans
Date: Thu Dec 19 14:32:44 2013
New Revision: 197718
URL: http://llvm.org/viewvc/llvm-project?rev=197718&view=rev
Log:
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.)
Added:
llvm/trunk/unittests/Support/ThreadLocalTest.cpp
Modified:
llvm/trunk/lib/Support/ThreadLocal.cpp
llvm/trunk/lib/Support/Unix/ThreadLocal.inc
llvm/trunk/unittests/Support/CMakeLists.txt
Modified: llvm/trunk/lib/Support/ThreadLocal.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ThreadLocal.cpp?rev=197718&r1=197717&r2=197718&view=diff
==============================================================================
--- llvm/trunk/lib/Support/ThreadLocal.cpp (original)
+++ llvm/trunk/lib/Support/ThreadLocal.cpp Thu Dec 19 14:32:44 2013
@@ -23,7 +23,7 @@
// Define all methods as no-ops if threading is explicitly disabled
namespace llvm {
using namespace sys;
-ThreadLocalImpl::ThreadLocalImpl() { }
+ThreadLocalImpl::ThreadLocalImpl() : data() { }
ThreadLocalImpl::~ThreadLocalImpl() { }
void ThreadLocalImpl::setInstance(const void* d) {
typedef int SIZE_TOO_BIG[sizeof(d) <= sizeof(data) ? 1 : -1];
Modified: llvm/trunk/lib/Support/Unix/ThreadLocal.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Unix/ThreadLocal.inc?rev=197718&r1=197717&r2=197718&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Unix/ThreadLocal.inc (original)
+++ llvm/trunk/lib/Support/Unix/ThreadLocal.inc Thu Dec 19 14:32:44 2013
@@ -18,7 +18,7 @@
namespace llvm {
using namespace sys;
-ThreadLocalImpl::ThreadLocalImpl() { }
+ThreadLocalImpl::ThreadLocalImpl() : data() { }
ThreadLocalImpl::~ThreadLocalImpl() { }
void ThreadLocalImpl::setInstance(const void* d) { data = const_cast<void*>(d);}
const void* ThreadLocalImpl::getInstance() { return data; }
Modified: llvm/trunk/unittests/Support/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/CMakeLists.txt?rev=197718&r1=197717&r2=197718&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Support/CMakeLists.txt Thu Dec 19 14:32:44 2013
@@ -30,6 +30,7 @@ add_llvm_unittest(SupportTests
RegexTest.cpp
SourceMgrTest.cpp
SwapByteOrderTest.cpp
+ ThreadLocalTest.cpp
TimeValueTest.cpp
UnicodeTest.cpp
ValueHandleTest.cpp
Added: llvm/trunk/unittests/Support/ThreadLocalTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ThreadLocalTest.cpp?rev=197718&view=auto
==============================================================================
--- llvm/trunk/unittests/Support/ThreadLocalTest.cpp (added)
+++ llvm/trunk/unittests/Support/ThreadLocalTest.cpp Thu Dec 19 14:32:44 2013
@@ -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());
+}
+
+}
More information about the llvm-commits
mailing list