r359809 - Use primary template parameter names for variable template debug info

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu May 2 15:13:41 PDT 2019


On Thu, 2 May 2019 at 10:43, Reid Kleckner via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: rnk
> Date: Thu May  2 10:45:54 2019
> New Revision: 359809
>
> URL: http://llvm.org/viewvc/llvm-project?rev=359809&view=rev
> Log:
> Use primary template parameter names for variable template debug info
>
> Summary:
> Fixes PR41677
>
> Consider:
>   template <typename LHS, typename RHS> constexpr bool is_same_v = false;
>   template <typename T> constexpr bool is_same_v<T, T> = true;
>   template constexpr bool is_same_v<int, int>;
>
> Before this change, when emitting debug info for the
> `is_same_v<int, int>` global variable, clang would crash because it
> would try to use the template parameter list from the partial
> specialization to give parameter names to template arguments. This
> doesn't work in general, since a partial specialization can have fewer
> arguments than the primary template. Therefore, always use the primary
> template. Hypothetically we could try to use the parameter names from
> the partial specialization when possible, but it's not clear this really
> helps debugging in practice.

Hmm, consider:

template<typename T> constexpr bool is_pointer = false;
template<typename T> constexpr bool is_pointer<T*> = true;

If I somehow inspect is_pointer<int*> in a debugger, I think it'd be
surprising to find I had T=int* instead of T=int. (This is likely not
a big deal for a case like this, but there could be a lambda on the
right-hand side of the =, and stepping into that should put the right
set of things in scope.)

> Reviewers: JDevlieghere, aprantl, ormris, dblaikie
>
> Subscribers: cfe-commits
>
> Tags: #clang
>
> Differential Revision: https://reviews.llvm.org/D61408
>
> Added:
>     cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=359809&r1=359808&r2=359809&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu May  2 10:45:54 2019
> @@ -1827,32 +1827,24 @@ CGDebugInfo::CollectFunctionTemplatePara
>  }
>
>  llvm::DINodeArray CGDebugInfo::CollectVarTemplateParams(const VarDecl *VL,
> -    llvm::DIFile *Unit) {
> -  if (auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VL)) {
> -    auto T = TS->getSpecializedTemplateOrPartial();
> -    auto TA = TS->getTemplateArgs().asArray();
> -    // Collect parameters for a partial specialization
> -    if (T.is<VarTemplatePartialSpecializationDecl *>()) {
> -      const TemplateParameterList *TList =
> -        T.get<VarTemplatePartialSpecializationDecl *>()
> -        ->getTemplateParameters();
> -      return CollectTemplateParams(TList, TA, Unit);
> -    }
> -
> -    // Collect parameters for an explicit specialization
> -    if (T.is<VarTemplateDecl *>()) {
> -      const TemplateParameterList *TList = T.get<VarTemplateDecl *>()
> -        ->getTemplateParameters();
> -      return CollectTemplateParams(TList, TA, Unit);
> -    }
> -  }
> -  return llvm::DINodeArray();
> +                                                        llvm::DIFile *Unit) {
> +  // Always get the full list of parameters, not just the ones from the
> +  // specialization. A partial specialization may have fewer parameters than
> +  // there are arguments.
> +  auto *TS = dyn_cast<VarTemplateSpecializationDecl>(VL);
> +  if (!TS)
> +    return llvm::DINodeArray();
> +  VarTemplateDecl *T = TS->getSpecializedTemplate();
> +  const TemplateParameterList *TList = T->getTemplateParameters();
> +  auto TA = TS->getTemplateArgs().asArray();
> +  return CollectTemplateParams(TList, TA, Unit);
>  }
>
>  llvm::DINodeArray CGDebugInfo::CollectCXXTemplateParams(
>      const ClassTemplateSpecializationDecl *TSpecial, llvm::DIFile *Unit) {
> -  // Always get the full list of parameters, not just the ones from
> -  // the specialization.
> +  // Always get the full list of parameters, not just the ones from the
> +  // specialization. A partial specialization may have fewer parameters than
> +  // there are arguments.
>    TemplateParameterList *TPList =
>        TSpecial->getSpecializedTemplate()->getTemplateParameters();
>    const TemplateArgumentList &TAList = TSpecial->getTemplateArgs();
>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp?rev=359809&r1=359808&r2=359809&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-template-member.cpp Thu May  2 10:45:54 2019
> @@ -30,7 +30,7 @@ inline int add3(int x) {
>  // CHECK: {{![0-9]+}} = distinct !DIGlobalVariable(
>  // CHECK-SAME: name: "var"
>  // CHECK-SAME: templateParams: {{![0-9]+}}
> -// CHECK: !DITemplateTypeParameter(name: "P", type: {{![0-9]+}})
> +// CHECK: !DITemplateTypeParameter(name: "T", type: {{![0-9]+}})
>  // CHECK: {{![0-9]+}} = distinct !DIGlobalVariable(
>  // CHECK-SAME: name: "varray"
>  // CHECK-SAME: templateParams: {{![0-9]+}}
>
> Added: cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp?rev=359809&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-var-template-partial.cpp Thu May  2 10:45:54 2019
> @@ -0,0 +1,17 @@
> +// RUN: %clang_cc1 -emit-llvm -triple x86_64-linux-gnu %s -o - -debug-info-kind=limited | FileCheck %s
> +
> +template <typename LHS, typename RHS> constexpr bool is_same_v = false;
> +template <typename T> constexpr bool is_same_v<T, T> = true;
> +
> +template constexpr bool is_same_v<int, int>;
> +static_assert(is_same_v<int, int>, "should get partial spec");
> +
> +// Note that the template arguments for the instantiated variable use the
> +// parameter names from the primary template. The partial specialization might
> +// not have enough parameters.
> +
> +// CHECK: distinct !DIGlobalVariable(name: "is_same_v", linkageName: "_Z9is_same_vIiiE", {{.*}} templateParams: ![[PARAMS:[0-9]+]])
> +// CHECK: ![[PARAMS]] = !{![[LHS:[0-9]+]], ![[RHS:[0-9]+]]}
> +// CHECK: ![[LHS]] = !DITemplateTypeParameter(name: "LHS", type: ![[INT:[0-9]+]])
> +// CHECK: ![[INT]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
> +// CHECK: ![[RHS]] = !DITemplateTypeParameter(name: "RHS", type: ![[INT]])
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list