summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r278788-clang-r201130-pch-miscompilation.diff
blob: 33d8db38108a83753519aa2f6e09049a21a81d1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Pull in r201130 from upstream clang trunk (by Ted Kremenek):

  Fix PCH deserialization bug with local static symbols being treated
  as local extern.

  This triggered a miscompilation of code using Boost's
  function_template.hpp when it was included inside a PCH file.  A
  local static within that header would be treated as local extern,
  resulting in the wrong mangling.  This only occurred during PCH
  deserialization.

  Fixes <rdar://problem/15975816> and <rdar://problem/15926311>.

This fixes a crash in audio/murmur, which is using both PCH and Boost.

Introduced here: http://svnweb.freebsd.org/changeset/base/278788

Index: tools/clang/lib/Serialization/ASTReaderDecl.cpp
===================================================================
--- tools/clang/lib/Serialization/ASTReaderDecl.cpp
+++ tools/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -971,7 +971,7 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::V
   VD->setCachedLinkage(VarLinkage);
 
   // Reconstruct the one piece of the IdentifierNamespace that we need.
-  if (VarLinkage != NoLinkage &&
+  if (VD->getStorageClass() == SC_Extern && VarLinkage != NoLinkage &&
       VD->getLexicalDeclContext()->isFunctionOrMethod())
     VD->setLocalExternDecl();
 
Index: tools/clang/test/PCH/local_static.cpp
===================================================================
--- tools/clang/test/PCH/local_static.cpp
+++ tools/clang/test/PCH/local_static.cpp
@@ -0,0 +1,20 @@
+// Test this without PCH.
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -include %S/local_static.h -fsyntax-only %s -emit-llvm -o %t.no_pch.ll %s
+// RUN: FileCheck --input-file %t.no_pch.ll %s
+
+// Test with PCH.
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -x c++-header -emit-pch -o %t.pch %S/local_static.h
+// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -include-pch %t.pch -emit-llvm -o %t.pch.ll %s
+// RUN: FileCheck --input-file %t.pch.ll %s
+
+void test(Bar &b) {
+  b.f<int>();
+  static int s;
+}
+
+// Check if the mangling of static and local extern variables
+// are correct and preserved by PCH.
+
+// CHECK: @_ZZ4testR3BarE1s = internal global i32 0, align 4
+// CHECK: @_ZZN3Bar1fIiEEvvE1y = linkonce_odr constant i32 0, align 4
+
Index: tools/clang/test/PCH/local_static.h
===================================================================
--- tools/clang/test/PCH/local_static.h
+++ tools/clang/test/PCH/local_static.h
@@ -0,0 +1,7 @@
+class Bar {
+public:
+  template<typename T>
+  void f() {
+    static const T y = 0;
+  }
+};
OpenPOWER on IntegriCloud