diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-09-12 06:37:42 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-09-12 06:37:42 +0000 |
commit | 67cb9740f64e88395150ed59a3294fe42d95a11f (patch) | |
tree | 84367592bc128c2f6a0ad2de96e67efc85143054 | |
parent | dcba38a78bf36aaa7911f912b81239d5d7e1d476 (diff) | |
download | bcm5719-llvm-67cb9740f64e88395150ed59a3294fe42d95a11f.tar.gz bcm5719-llvm-67cb9740f64e88395150ed59a3294fe42d95a11f.zip |
[CodeGen] Remove wrapper-free always_inline functions from COMDATs
always_inline functions without a wrapper don't need to be in a COMDAT.
llvm-svn: 247500
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/alwaysinline.cpp | 24 |
2 files changed, 17 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 4fe25ff3f31..660f18a694e 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -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(); diff --git a/clang/test/CodeGenCXX/alwaysinline.cpp b/clang/test/CodeGenCXX/alwaysinline.cpp index c694ae41d22..9b4fb4f38a6 100644 --- a/clang/test/CodeGenCXX/alwaysinline.cpp +++ b/clang/test/CodeGenCXX/alwaysinline.cpp @@ -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.*}} |