[llvm-branch-commits] [cfe-branch] r348686 - Merging r345839:

Tom Stellard via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Dec 7 21:06:53 PST 2018


Author: tstellar
Date: Fri Dec  7 21:06:53 2018
New Revision: 348686

URL: http://llvm.org/viewvc/llvm-project?rev=348686&view=rev
Log:
Merging r345839:

------------------------------------------------------------------------
r345839 | erichkeane | 2018-11-01 08:11:43 -0700 (Thu, 01 Nov 2018) | 6 lines

Multiversioning- Ensure all MV functions are emitted.

Multiverson function versions are always used (by the resolver), so ensure that
they are always emitted.

Change-Id: I5d2e0841fddf0d18918b3fb92ae76814add7ee96
------------------------------------------------------------------------

Modified:
    cfe/branches/release_70/lib/AST/ASTContext.cpp
    cfe/branches/release_70/test/CodeGenCXX/attr-cpuspecific.cpp
    cfe/branches/release_70/test/CodeGenCXX/attr-target-mv-member-funcs.cpp

Modified: cfe/branches/release_70/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_70/lib/AST/ASTContext.cpp?rev=348686&r1=348685&r2=348686&view=diff
==============================================================================
--- cfe/branches/release_70/lib/AST/ASTContext.cpp (original)
+++ cfe/branches/release_70/lib/AST/ASTContext.cpp Fri Dec  7 21:06:53 2018
@@ -9734,6 +9734,10 @@ bool ASTContext::DeclMustBeEmitted(const
     return true;
 
   if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
+    // Multiversioned functions always have to be emitted, because they are used
+    // by the resolver.
+    if (FD->isMultiVersion())
+      return true;
     // Forward declarations aren't required.
     if (!FD->doesThisDeclarationHaveABody())
       return FD->doesDeclarationForceExternallyVisibleDefinition();

Modified: cfe/branches/release_70/test/CodeGenCXX/attr-cpuspecific.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_70/test/CodeGenCXX/attr-cpuspecific.cpp?rev=348686&r1=348685&r2=348686&view=diff
==============================================================================
--- cfe/branches/release_70/test/CodeGenCXX/attr-cpuspecific.cpp (original)
+++ cfe/branches/release_70/test/CodeGenCXX/attr-cpuspecific.cpp Fri Dec  7 21:06:53 2018
@@ -12,6 +12,7 @@ void foo() {
   s.Func();
 }
 
+// LINUX: define linkonce_odr void @_ZN1S4FuncEv.O
 // LINUX: define void (%struct.S*)* @_ZN1S4FuncEv.resolver
 // LINUX: ret void (%struct.S*)* @_ZN1S4FuncEv.S
 // LINUX: ret void (%struct.S*)* @_ZN1S4FuncEv.O

Modified: cfe/branches/release_70/test/CodeGenCXX/attr-target-mv-member-funcs.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/release_70/test/CodeGenCXX/attr-target-mv-member-funcs.cpp?rev=348686&r1=348685&r2=348686&view=diff
==============================================================================
--- cfe/branches/release_70/test/CodeGenCXX/attr-target-mv-member-funcs.cpp (original)
+++ cfe/branches/release_70/test/CodeGenCXX/attr-target-mv-member-funcs.cpp Fri Dec  7 21:06:53 2018
@@ -72,6 +72,15 @@ int templ_use() {
 // CHECK: @_ZN5templIiE3fooEi.ifunc = ifunc i32 (%struct.templ*, i32), i32 (%struct.templ*, i32)* ()* @_ZN5templIiE3fooEi.resolver
 // CHECK: @_ZN5templIdE3fooEi.ifunc = ifunc i32 (%struct.templ.0*, i32), i32 (%struct.templ.0*, i32)* ()* @_ZN5templIdE3fooEi.resolver
 
+// CHECK: define linkonce_odr i32 @_ZN1S3fooEi.sse4.2(%struct.S* %this, i32)
+// CHECK: ret i32 0
+
+// CHECK: define linkonce_odr i32 @_ZN1S3fooEi.arch_ivybridge(%struct.S* %this, i32)
+// CHECK: ret i32 1
+
+// CHECK: define linkonce_odr i32 @_ZN1S3fooEi(%struct.S* %this, i32)
+// CHECK: ret i32 2
+
 // CHECK: define i32 @_Z3barv()
 // CHECK: %s = alloca %struct.S, align 1
 // CHECK: %s2 = alloca %struct.S, align 1
@@ -123,23 +132,14 @@ int templ_use() {
 // CHECK: ret i32 (%struct.templ.0*, i32)* @_ZN5templIdE3fooEi.sse4.2
 // CHECK: ret i32 (%struct.templ.0*, i32)* @_ZN5templIdE3fooEi
 
-// CHECK: define linkonce_odr i32 @_ZN1S3fooEi.sse4.2(%struct.S* %this, i32)
-// CHECK: ret i32 0
-
-// CHECK: declare i32 @_ZN1S3fooEi.arch_sandybridge(%struct.S*, i32)
-
-// CHECK: define linkonce_odr i32 @_ZN1S3fooEi.arch_ivybridge(%struct.S* %this, i32)
-// CHECK: ret i32 1
-
-// CHECK: define linkonce_odr i32 @_ZN1S3fooEi(%struct.S* %this, i32)
-// CHECK: ret i32 2
-
 // CHECK: define linkonce_odr i32 @_ZN5templIiE3fooEi.sse4.2
-// CHECK: declare i32 @_ZN5templIiE3fooEi.arch_sandybridge
 // CHECK: define linkonce_odr i32 @_ZN5templIiE3fooEi.arch_ivybridge
 // CHECK: define linkonce_odr i32 @_ZN5templIiE3fooEi
 
 // CHECK: define linkonce_odr i32 @_ZN5templIdE3fooEi.sse4.2
-// CHECK: declare i32 @_ZN5templIdE3fooEi.arch_sandybridge
 // CHECK: define linkonce_odr i32 @_ZN5templIdE3fooEi.arch_ivybridge
 // CHECK: define linkonce_odr i32 @_ZN5templIdE3fooEi
+//
+// CHECK: declare i32 @_ZN1S3fooEi.arch_sandybridge(%struct.S*, i32)
+// CHECK: declare i32 @_ZN5templIiE3fooEi.arch_sandybridge
+// CHECK: declare i32 @_ZN5templIdE3fooEi.arch_sandybridge




More information about the llvm-branch-commits mailing list