r339597 - Enforce instantiation of template multiversion functions
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 14 02:21:35 PDT 2018
Merged to 7.0 in r339663.
On Mon, Aug 13, 2018 at 8:33 PM, Erich Keane via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: erichkeane
> Date: Mon Aug 13 11:33:20 2018
> New Revision: 339597
>
> URL: http://llvm.org/viewvc/llvm-project?rev=339597&view=rev
> Log:
> Enforce instantiation of template multiversion functions
>
> Multiversioned member functions inside of a template type were
> not properly being emitted. The solution to this is to simply
> ensure that their bodies are correctly evaluated/assigned during
> template instantiation.
>
> Modified:
> cfe/trunk/include/clang/AST/ASTContext.h
> cfe/trunk/lib/AST/ASTContext.cpp
> cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> cfe/trunk/test/CodeGenCXX/attr-target-mv-member-funcs.cpp
>
> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=339597&r1=339596&r2=339597&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> +++ cfe/trunk/include/clang/AST/ASTContext.h Mon Aug 13 11:33:20 2018
> @@ -2743,7 +2743,7 @@ public:
> /// predicate.
> void forEachMultiversionedFunctionVersion(
> const FunctionDecl *FD,
> - llvm::function_ref<void(const FunctionDecl *)> Pred) const;
> + llvm::function_ref<void(FunctionDecl *)> Pred) const;
>
> const CXXConstructorDecl *
> getCopyConstructorForExceptionObject(CXXRecordDecl *RD);
>
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=339597&r1=339596&r2=339597&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Mon Aug 13 11:33:20 2018
> @@ -9819,7 +9819,7 @@ bool ASTContext::DeclMustBeEmitted(const
>
> void ASTContext::forEachMultiversionedFunctionVersion(
> const FunctionDecl *FD,
> - llvm::function_ref<void(const FunctionDecl *)> Pred) const {
> + llvm::function_ref<void(FunctionDecl *)> Pred) const {
> assert(FD->isMultiVersion() && "Only valid for multiversioned functions");
> llvm::SmallDenseSet<const FunctionDecl*, 4> SeenDecls;
> FD = FD->getCanonicalDecl();
>
> Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=339597&r1=339596&r2=339597&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Mon Aug 13 11:33:20 2018
> @@ -5175,10 +5175,20 @@ void Sema::PerformPendingInstantiations(
> if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) {
> bool DefinitionRequired = Function->getTemplateSpecializationKind() ==
> TSK_ExplicitInstantiationDefinition;
> - InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function, true,
> - DefinitionRequired, true);
> - if (Function->isDefined())
> - Function->setInstantiationIsPending(false);
> + if (Function->isMultiVersion()) {
> + getASTContext().forEachMultiversionedFunctionVersion(
> + Function, [this, Inst, DefinitionRequired](FunctionDecl *CurFD) {
> + InstantiateFunctionDefinition(/*FIXME:*/ Inst.second, CurFD, true,
> + DefinitionRequired, true);
> + if (CurFD->isDefined())
> + CurFD->setInstantiationIsPending(false);
> + });
> + } else {
> + InstantiateFunctionDefinition(/*FIXME:*/ Inst.second, Function, true,
> + DefinitionRequired, true);
> + if (Function->isDefined())
> + Function->setInstantiationIsPending(false);
> + }
> continue;
> }
>
>
> Modified: cfe/trunk/test/CodeGenCXX/attr-target-mv-member-funcs.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/attr-target-mv-member-funcs.cpp?rev=339597&r1=339596&r2=339597&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/attr-target-mv-member-funcs.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/attr-target-mv-member-funcs.cpp Mon Aug 13 11:33:20 2018
> @@ -111,13 +111,12 @@ int templ_use() {
> // CHECK: call i32 @_ZN5templIiE3fooEi.ifunc
> // CHECK: call i32 @_ZN5templIdE3fooEi.ifunc
>
> -
> // CHECK: define i32 (%struct.templ*, i32)* @_ZN5templIiE3fooEi.resolver() comdat
> // CHECK: ret i32 (%struct.templ*, i32)* @_ZN5templIiE3fooEi.arch_sandybridge
> // CHECK: ret i32 (%struct.templ*, i32)* @_ZN5templIiE3fooEi.arch_ivybridge
> // CHECK: ret i32 (%struct.templ*, i32)* @_ZN5templIiE3fooEi.sse4.2
> // CHECK: ret i32 (%struct.templ*, i32)* @_ZN5templIiE3fooEi
> -//
> +
> // CHECK: define i32 (%struct.templ.0*, i32)* @_ZN5templIdE3fooEi.resolver() comdat
> // CHECK: ret i32 (%struct.templ.0*, i32)* @_ZN5templIdE3fooEi.arch_sandybridge
> // CHECK: ret i32 (%struct.templ.0*, i32)* @_ZN5templIdE3fooEi.arch_ivybridge
> @@ -135,3 +134,12 @@ int templ_use() {
> // 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
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list