<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Sep 19, 2014 at 12:43 PM, Rafael Espindola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Fri Sep 19 14:43:18 2014<br>
New Revision: 218141<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=218141&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=218141&view=rev</a><br>
Log:<br>
In the Itanium ABI, move stuff to the comdat of variables with static init.<br>
<br>
Clang can already handle<br>
<br>
-------------------------------------------<br>
struct S {<br>
  static const int x;<br>
};<br>
template<typename T> struct U {<br>
  static const int k;<br>
};<br>
template<typename T> const int U<T>::k = T::x;<br>
<br>
const int S::x = 42;<br>
extern const int *f();<br>
const int *g() { return &U<S>::k; }<br>
int main() {<br>
  return *f() + U<S>::k;<br>
}<br>
<br>
const int *f() { return &U<S>::k; }<br>
-------------------------------------------<br>
<br>
since r217264 which puts the .inint_array section in the same COMDAT<br>
as the variable.<br>
<br>
This patch allows the linker to more easily delete some dead code and data by<br>
putting the guard variable and init function in the same COMDAT.<br>
<br>
This is a fixed version of r218089.<br>
<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp<br>
    cfe/trunk/test/CodeGenCXX/static-data-member.cpp<br>
    cfe/trunk/test/CodeGenCXX/static-init.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=218141&r1=218140&r2=218141&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=218141&r1=218140&r2=218141&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Fri Sep 19 14:43:18 2014<br>
@@ -1666,6 +1666,15 @@ void ItaniumCXXABI::EmitGuardedInit(Code<br>
     // If the variable is thread-local, so is its guard variable.<br>
     guard->setThreadLocalMode(var->getThreadLocalMode());<br>
<br>
+    // The ABI says: It is suggested that it be emitted in the same COMDAT group<br>
+    // as the associated data object<br>
+    if (!D.isLocalVarDecl() && var->isWeakForLinker() && CGM.supportsCOMDAT()) {<br></blockquote><div><br></div><div>Hmm, why do you not do this for static local variables? They have the same issue, as far as I can see.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      llvm::Comdat *C = CGM.getModule().getOrInsertComdat(var->getName());<br>
+      guard->setComdat(C);<br>
+      var->setComdat(C);<br>
+      CGF.CurFn->setComdat(C);<br>
+    }<br>
+<br>
     CGM.setStaticLocalDeclGuardAddress(&D, guard);<br>
   }<br>
<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/static-data-member.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-data-member.cpp?rev=218141&r1=218140&r2=218141&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-data-member.cpp?rev=218141&r1=218140&r2=218141&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/static-data-member.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/static-data-member.cpp Fri Sep 19 14:43:18 2014<br>
@@ -1,9 +1,13 @@<br>
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s<br>
+// RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm -o - %s | FileCheck %s<br>
+// RUN: %clang_cc1 -triple x86_64-apple-darwin -emit-llvm -o - %s | \<br>
+// RUN: FileCheck --check-prefix=MACHO %s<br>
<br>
 // CHECK: @_ZN5test11A1aE = constant i32 10, align 4<br>
 // CHECK: @_ZN5test212_GLOBAL__N_11AIiE1xE = internal global i32 0, align 4<br>
-// CHECK: @_ZN5test31AIiE1xE = weak_odr global i32 0, align 4<br>
-// CHECK: @_ZGVN5test31AIiE1xE = weak_odr global i64 0<br>
+// CHECK: @_ZN5test31AIiE1xE = weak_odr global i32 0, comdat $_ZN5test31AIiE1xE, align 4<br>
+// CHECK: @_ZGVN5test31AIiE1xE = weak_odr global i64 0, comdat $_ZN5test31AIiE1xE<br>
+// MACHO: @_ZGVN5test31AIiE1xE = weak_odr global i64 0<br>
+// MACHO-NOT: comdat<br>
<br>
 // CHECK: _ZN5test51U2k0E = global i32 0<br>
 // CHECK: _ZN5test51U2k1E = global i32 0<br>
@@ -60,7 +64,9 @@ namespace test3 {<br>
   template <class T> int A<T>::x = foo();<br>
   template struct A<int>;<br>
<br>
-  // CHECK-LABEL: define internal void @__cxx_global_var_init1()<br>
+  // CHECK-LABEL: define internal void @__cxx_global_var_init1() {{.*}} comdat $_ZN5test31AIiE1xE<br>
+  // MACHO-LABEL: define internal void @__cxx_global_var_init1()<br>
+  // MACHO-NOT: comdat<br>
   // CHECK:      [[GUARDBYTE:%.*]] = load i8* bitcast (i64* @_ZGVN5test31AIiE1xE to i8*)<br>
   // CHECK-NEXT: [[UNINITIALIZED:%.*]] = icmp eq i8 [[GUARDBYTE]], 0<br>
   // CHECK-NEXT: br i1 [[UNINITIALIZED]]<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/static-init.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-init.cpp?rev=218141&r1=218140&r2=218141&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-init.cpp?rev=218141&r1=218140&r2=218141&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/static-init.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/static-init.cpp Fri Sep 19 14:43:18 2014<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s<br>
+// RUN: %clang_cc1 %s -triple=x86_64-pc-linuxs -emit-llvm -o - | FileCheck %s<br>
<br>
 // CHECK: @_ZZ1hvE1i = internal global i32 0, align 4<br>
 // CHECK: @base_req = global [4 x i8] c"foo\00", align 1<br>
@@ -6,8 +6,11 @@<br>
<br>
 // CHECK: @_ZZN5test31BC1EvE1u = internal global { i8, [3 x i8] } { i8 97, [3 x i8] undef }, align 4<br>
 // CHECK: @_ZZN5test1L6getvarEiE3var = internal constant [4 x i32] [i32 1, i32 0, i32 2, i32 4], align 16<br>
+<br>
 // CHECK: @_ZZ2h2vE1i = linkonce_odr global i32 0<br>
+// CHECK-NOT: comdat<br>
 // CHECK: @_ZGVZ2h2vE1i = linkonce_odr global i64 0<br>
+// CHECK-NOT: comdat<br>
<br>
 struct A {<br>
   A();<br>
@@ -34,6 +37,8 @@ void h() {<br>
   static const int i = a();<br>
 }<br>
<br>
+// CHECK: define linkonce_odr void @_Z2h2v()<br>
+// CHECK-NOT: comdat<br>
 inline void h2() {<br>
   static int i = a();<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>