]> granicus.if.org Git - clang/commitdiff
[CodeGen] Remove wrapper-free always_inline functions from COMDATs
authorDavid Majnemer <david.majnemer@gmail.com>
Sat, 12 Sep 2015 06:37:42 +0000 (06:37 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sat, 12 Sep 2015 06:37:42 +0000 (06:37 +0000)
always_inline functions without a wrapper don't need to be in a COMDAT.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247500 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
test/CodeGenCXX/alwaysinline.cpp

index 4fe25ff3f3173853bb0626f44a57f056bb8c60aa..660f18a694e05674441b28f9aa37e2852c59cb5e 100644 (file)
@@ -494,8 +494,12 @@ void CodeGenModule::RewriteAlwaysInlineFunction(llvm::Function *Fn) {
   FindNonDirectCallUses(Fn, &NonDirectCallUses);
   // Do not create the wrapper if there are no non-direct call uses, and we are
   // not required to emit an external definition.
-  if (NonDirectCallUses.empty() && Fn->isDiscardableIfUnused())
+  if (NonDirectCallUses.empty() && Fn->isDiscardableIfUnused()) {
+    // An always inline function with no wrapper cannot legitimately use the
+    // function's COMDAT symbol.
+    Fn->setComdat(nullptr);
     return;
+  }
 
   llvm::FunctionType *FT = Fn->getFunctionType();
   llvm::LLVMContext &Ctx = getModule().getContext();
index c694ae41d2215e91234cc1064fe0d43ae58dcab5..9b4fb4f38a63da0bf63757d955807b9045aa1f1a 100644 (file)
@@ -33,20 +33,20 @@ void g3() {
   A3 a3;
 }
 
-// CHECK-DAG: define internal void @_ZN2A1C1Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI:[01-9]+]]
-// CHECK-DAG: define internal void @_ZN2A1C2Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]]
-// CHECK-DAG: define internal void @_ZN2A1D1Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]]
-// CHECK-DAG: define internal void @_ZN2A1D2Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]]
+// CHECK-DAG: define internal void @_ZN2A1C1Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI:[01-9]+]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A1C2Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A1D1Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A1D2Ev.alwaysinline(%struct.A1* %this) unnamed_addr #[[AI]] align 2 {
 
-// CHECK-DAG: define internal void @_ZN2A2C1Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH:[01-9]+]]
-// CHECK-DAG: define internal void @_ZN2A2C2Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]]
-// CHECK-DAG: define internal void @_ZN2A2D1Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]]
-// CHECK-DAG: define internal void @_ZN2A2D2Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]]
+// CHECK-DAG: define internal void @_ZN2A2C1Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH:[01-9]+]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A2C2Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A2D1Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A2D2Ev.alwaysinline(%struct.A2* %this) unnamed_addr #[[AIIH]] align 2 {
 
-// CHECK-DAG: define internal void @_ZN2A3C1Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]]
-// CHECK-DAG: define internal void @_ZN2A3C2Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]]
-// CHECK-DAG: define internal void @_ZN2A3D1Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]]
-// CHECK-DAG: define internal void @_ZN2A3D2Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]]
+// CHECK-DAG: define internal void @_ZN2A3C1Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A3C2Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A3D1Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
+// CHECK-DAG: define internal void @_ZN2A3D2Ev.alwaysinline(%struct.A3* %this) unnamed_addr #[[AIIH]] align 2 {
 
 // CHECK-DAG: attributes #[[AI]] = {{.*alwaysinline.*}}
 // CHECK-DAG: attributes #[[AIIH]] = {{.*alwaysinline.*inlinehint.*}}