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