Author: dcoughlin
Date: Wed Jun  1 16:32:45 2016
New Revision: 271433

URL: http://llvm.org/viewvc/llvm-project?rev=271433&view=rev
Log:
[tsan] Prefer mangled name looking up variable declaration for racy address

For Thread Sanitizer reports, LLDB tries to find a global variable declaration
corresponding to the racy address in order to provide a filename and line
number. This commit changes the lookup of the variable to use the mangled
name for lookup and fall back to the demangled version if unavailable. This
is needed to report locations of races on Swift global variables.

I've also added a test to make sure we look up C++ globals correctly.

rdar://problem/26459401

Differential Revision: http://reviews.llvm.org/D20760

Added:
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/Makefile
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/TestTsanCPPGlobalLocation.py
    
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/main.cpp
Modified:
    
lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp

Added: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/Makefile
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/Makefile?rev=271433&view=auto
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/Makefile
 (added)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/Makefile
 Wed Jun  1 16:32:45 2016
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+CFLAGS_EXTRAS := -fsanitize=thread -g
+
+include $(LEVEL)/Makefile.rules

Added: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/TestTsanCPPGlobalLocation.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/TestTsanCPPGlobalLocation.py?rev=271433&view=auto
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/TestTsanCPPGlobalLocation.py
 (added)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/TestTsanCPPGlobalLocation.py
 Wed Jun  1 16:32:45 2016
@@ -0,0 +1,54 @@
+"""
+Tests that TSan correctly reports the filename and line number of a racy 
global C++ variable.
+"""
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+import lldbsuite.test.lldbutil as lldbutil
+import json
+
+class TsanCPPGlobalLocationTestCase(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @expectedFailureAll(oslist=["linux"], bugnumber="non-core functionality, 
need to reenable and fix later (DES 2014.11.07)")
+    @skipIfFreeBSD # llvm.org/pr21136 runtimes not yet available by default
+    @skipIfRemote
+    @skipUnlessCompilerRt
+    @skipUnlessThreadSanitizer
+    def test (self):
+        self.build ()
+        self.tsan_tests ()
+
+    def setUp(self):
+        # Call super's setUp().
+        TestBase.setUp(self)
+
+    def tsan_tests (self):
+        exe = os.path.join (os.getcwd(), "a.out")
+        self.expect("file " + exe, patterns = [ "Current executable set to 
.*a.out" ])
+
+        self.runCmd("run")
+
+        stop_reason = 
self.dbg.GetSelectedTarget().process.GetSelectedThread().GetStopReason()
+        if stop_reason == lldb.eStopReasonExec:
+            # On OS X 10.10 and older, we need to re-exec to enable 
interceptors.
+            self.runCmd("continue")
+
+        # the stop reason of the thread should be breakpoint.
+        self.expect("thread list", "A data race should be detected",
+            substrs = ['stopped', 'stop reason = Data race detected'])
+
+        self.expect("thread info -s", "The extended stop info should contain 
the TSan provided fields",
+            substrs = ["instrumentation_class", "description", "mops"])
+
+        output_lines = self.res.GetOutput().split('\n')
+        json_line = '\n'.join(output_lines[2:])
+        data = json.loads(json_line)
+        self.assertEqual(data["instrumentation_class"], "ThreadSanitizer")
+        self.assertEqual(data["issue_type"], "data-race")
+
+        self.assertTrue(data["location_filename"].endswith("/main.cpp"))
+        self.assertEqual(data["location_line"], line_number('main.cpp', '// 
global variable'))

Added: 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/main.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/main.cpp?rev=271433&view=auto
==============================================================================
--- 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/main.cpp
 (added)
+++ 
lldb/trunk/packages/Python/lldbsuite/test/functionalities/tsan/cpp_global_location/main.cpp
 Wed Jun  1 16:32:45 2016
@@ -0,0 +1,38 @@
+//===-- main.cpp ------------------------------------------------*- C++ 
-*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+long my_global_variable;  // global variable
+
+void *f1(void *p) {
+    my_global_variable = 42;
+    return NULL;
+}
+
+void *f2(void *p) {
+    my_global_variable = 43;
+    return NULL;
+}
+
+int main (int argc, char const *argv[])
+{
+    pthread_t t1;
+    pthread_create(&t1, NULL, f1, NULL);
+
+    pthread_t t2;
+    pthread_create(&t2, NULL, f2, NULL);
+
+    pthread_join(t1, NULL);
+    pthread_join(t2, NULL);
+
+    return 0;
+}

Modified: 
lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp?rev=271433&r1=271432&r2=271433&view=diff
==============================================================================
--- 
lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp
 (original)
+++ 
lldb/trunk/source/Plugins/InstrumentationRuntime/ThreadSanitizer/ThreadSanitizerRuntime.cpp
 Wed Jun  1 16:32:45 2016
@@ -523,7 +523,7 @@ GetSymbolDeclarationFromAddress(ProcessS
     if (! symbol)
         return;
     
-    ConstString sym_name = symbol->GetName();
+    ConstString sym_name = 
symbol->GetMangled().GetName(lldb::eLanguageTypeUnknown, 
Mangled::ePreferMangled);
     
     ModuleSP module = symbol->CalculateSymbolContextModule();
     if (! module)


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to