[clang] e4b9f5e - DebugInfo: Add support for template parameters with reference qualifiers
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 15 10:11:36 PDT 2021
Nice to see this work coming to fruition.
Comment on a comment inline.
--paulr
> -----Original Message-----
> From: cfe-commits <cfe-commits-bounces at lists.llvm.org> On Behalf Of David
> Blaikie via cfe-commits
> Sent: Tuesday, September 14, 2021 3:41 AM
> To: cfe-commits at lists.llvm.org
> Subject: [clang] e4b9f5e - DebugInfo: Add support for template parameters
> with reference qualifiers
>
>
> Author: David Blaikie
> Date: 2021-09-14T00:39:47-07:00
> New Revision: e4b9f5e851d1fe0ba93cbb11b2ed4558602c379e
>
> URL: https://urldefense.com/v3/__https://github.com/llvm/llvm-
> project/commit/e4b9f5e851d1fe0ba93cbb11b2ed4558602c379e__;!!JmoZiZGBv3RvKR
> Sx!pPDWW11rGokficZF20VnsBpjjCjLLhat-SnLoi9Iun-i_taCUiQMW_3RbXPXB8CHMg$
> DIFF: https://urldefense.com/v3/__https://github.com/llvm/llvm-
> project/commit/e4b9f5e851d1fe0ba93cbb11b2ed4558602c379e.diff__;!!JmoZiZGBv
> 3RvKRSx!pPDWW11rGokficZF20VnsBpjjCjLLhat-SnLoi9Iun-
> i_taCUiQMW_3RbXOfYKwRDQ$
>
> LOG: DebugInfo: Add support for template parameters with reference
> qualifiers
>
> Followon from the previous commit supporting cvr qualifiers.
>
> Added:
>
>
> Modified:
> clang/lib/CodeGen/CGDebugInfo.cpp
> clang/test/CodeGenCXX/debug-info-template.cpp
>
> Removed:
>
>
>
> ##########################################################################
> ######
> diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp
> b/clang/lib/CodeGen/CGDebugInfo.cpp
> index b7a6cd4fdf84..e4dc3121a10f 100644
> --- a/clang/lib/CodeGen/CGDebugInfo.cpp
> +++ b/clang/lib/CodeGen/CGDebugInfo.cpp
> @@ -1338,6 +1338,15 @@ static unsigned getDwarfCC(CallingConv CC) {
> return 0;
> }
>
> +static llvm::DINode::DIFlags getRefFlags(const FunctionProtoType *Func) {
> + llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
> + if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)
> + Flags |= llvm::DINode::FlagLValueReference;
> + if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
> + Flags |= llvm::DINode::FlagRValueReference;
> + return Flags;
> +}
> +
> llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty,
> llvm::DIFile *Unit) {
> const auto *FPT = dyn_cast<FunctionProtoType>(Ty);
> @@ -1353,11 +1362,13 @@ llvm::DIType *CGDebugInfo::CreateType(const
> FunctionType *Ty,
> // Add the result type at least.
> EltTys.push_back(getOrCreateType(Ty->getReturnType(), Unit));
>
> + llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
> // Set up remainder of arguments if there is a prototype.
> // otherwise emit it as a variadic function.
> if (!FPT)
> EltTys.push_back(DBuilder.createUnspecifiedParameter());
> else {
> + Flags = getRefFlags(FPT);
> for (const QualType &ParamType : FPT->param_types())
> EltTys.push_back(getOrCreateType(ParamType, Unit));
> if (FPT->isVariadic())
> @@ -1365,7 +1376,7 @@ llvm::DIType *CGDebugInfo::CreateType(const
> FunctionType *Ty,
> }
>
> llvm::DITypeRefArray EltTypeArray =
> DBuilder.getOrCreateTypeArray(EltTys);
> - llvm::DIType *F = DBuilder.createSubroutineType(EltTypeArray,
> llvm::DINode::FlagZero,
> + llvm::DIType *F = DBuilder.createSubroutineType(EltTypeArray, Flags,
> getDwarfCC(Ty->getCallConv()));
> return F;
> }
> @@ -1640,15 +1651,17 @@
> CGDebugInfo::getOrCreateInstanceMethodType(QualType ThisPtr,
> Qc.removeUnaligned();
> // Keep the removed qualifiers in sync with
> // CreateQualifiedType(const FunctionPrototype*, DIFile *Unit)
> + // on a 'real' member function type, these qualifiers are carried on
> the type
> + // of the first parameter, not as separate DW_TAG_const_type (etc)
> decorator
> + // tags around them. (but in the raw function types with qualifiers,
> they have
> + // to use wrapper types)
Please use proper capitalization and punctuation in comments.
s/on/On/, s/(but/(But/, s/types)/types.)/
>
> // Add "this" pointer.
> - llvm::DITypeRefArray Args(
> - cast<llvm::DISubroutineType>(
> - getOrCreateType(
> - CGM.getContext().getFunctionType(Func->getReturnType(),
> - Func->getParamTypes(),
> EPI),
> - Unit))
> - ->getTypeArray());
> + const auto *OriginalFunc = cast<llvm::DISubroutineType>(
> + getOrCreateType(CGM.getContext().getFunctionType(
> + Func->getReturnType(), Func->getParamTypes(),
> EPI),
> + Unit));
> + llvm::DITypeRefArray Args = OriginalFunc->getTypeArray();
> assert(Args.size() && "Invalid number of arguments!");
>
> SmallVector<llvm::Metadata *, 16> Elts;
> @@ -1690,13 +1703,7 @@ CGDebugInfo::getOrCreateInstanceMethodType(QualType
> ThisPtr,
>
> llvm::DITypeRefArray EltTypeArray =
> DBuilder.getOrCreateTypeArray(Elts);
>
> - llvm::DINode::DIFlags Flags = llvm::DINode::FlagZero;
> - if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)
> - Flags |= llvm::DINode::FlagLValueReference;
> - if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
> - Flags |= llvm::DINode::FlagRValueReference;
> -
> - return DBuilder.createSubroutineType(EltTypeArray, Flags,
> + return DBuilder.createSubroutineType(EltTypeArray, OriginalFunc-
> >getFlags(),
> getDwarfCC(Func->getCallConv()));
> }
>
>
> diff --git a/clang/test/CodeGenCXX/debug-info-template.cpp
> b/clang/test/CodeGenCXX/debug-info-template.cpp
> index 0abb669b6535..510c82a5074f 100644
> --- a/clang/test/CodeGenCXX/debug-info-template.cpp
> +++ b/clang/test/CodeGenCXX/debug-info-template.cpp
> @@ -218,13 +218,13 @@ template void f1<>();
>
> namespace RawFuncQual {
> struct t1; // use this to ensure the type parameter doesn't shift due to
> other test cases in this file
> -template<typename T1, typename T2>
> +template<typename T1, typename T2, typename T3, typename T4>
> void f1() { }
> -template void f1<t1 () volatile, t1 () const volatile>();
> -// CHECK: !DISubprogram(name: "f1<RawFuncQual::t1 () volatile,
> RawFuncQual::t1 () const volatile>",
> +template void f1<t1 () volatile, t1 () const volatile, t1 () &, t1 ()
> &&>();
> +// CHECK: !DISubprogram(name: "f1<RawFuncQual::t1 () volatile,
> RawFuncQual::t1 () const volatile, RawFuncQual::t1 () &, RawFuncQual::t1
> () &&>",
> // CHECK-SAME: templateParams: ![[RAW_FUNC_QUAL_ARGS:[0-9]*]],
>
> -// CHECK: ![[RAW_FUNC_QUAL_ARGS]] = !{![[RAW_FUNC_QUAL_T1:[0-9]*]],
> ![[RAW_FUNC_QUAL_T2:[0-9]*]]}
> +// CHECK: ![[RAW_FUNC_QUAL_ARGS]] = !{![[RAW_FUNC_QUAL_T1:[0-9]*]],
> ![[RAW_FUNC_QUAL_T2:[0-9]*]], ![[RAW_FUNC_QUAL_T3:[0-9]*]],
> ![[RAW_FUNC_QUAL_T4:[0-9]*]]}
> // CHECK: ![[RAW_FUNC_QUAL_T1]] = !DITemplateTypeParameter(name: "T1",
> type: ![[RAW_FUNC_QUAL_VOL:[0-9]*]])
> // CHECK: ![[RAW_FUNC_QUAL_VOL]] = !DIDerivedType(tag:
> DW_TAG_volatile_type, baseType: ![[RAW_FUNC_QUAL_TYPE:[0-9]*]])
> // CHECK: ![[RAW_FUNC_QUAL_TYPE]] = !DISubroutineType(types:
> ![[RAW_FUNC_QUAL_LIST:[0-9]*]]
> @@ -232,5 +232,9 @@ template void f1<t1 () volatile, t1 () const
> volatile>();
> // CHECK: ![[RAW_FUNC_QUAL_STRUCT]] = !DICompositeType(tag:
> DW_TAG_structure_type, name: "t1"
> // CHECK: ![[RAW_FUNC_QUAL_T2]] = !DITemplateTypeParameter(name: "T2",
> type: ![[RAW_FUNC_QUAL_CNST:[0-9]*]])
> // CHECK: ![[RAW_FUNC_QUAL_CNST]] = !DIDerivedType(tag:
> DW_TAG_const_type, baseType: ![[RAW_FUNC_QUAL_TYPE:[0-9]*]])
> +// CHECK: ![[RAW_FUNC_QUAL_T3]] = !DITemplateTypeParameter(name: "T3",
> type: ![[RAW_FUNC_QUAL_REF:[0-9]*]])
> +// CHECK: ![[RAW_FUNC_QUAL_REF]] = !DISubroutineType(flags:
> DIFlagLValueReference, types: ![[RAW_FUNC_QUAL_LIST]])
> +// CHECK: ![[RAW_FUNC_QUAL_T4]] = !DITemplateTypeParameter(name: "T4",
> type: ![[RAW_FUNC_QUAL_REF_REF:[0-9]*]])
> +// CHECK: ![[RAW_FUNC_QUAL_REF_REF]] = !DISubroutineType(flags:
> DIFlagRValueReference, types: ![[RAW_FUNC_QUAL_LIST]])
>
> } // namespace RawFuncQual
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://urldefense.com/v3/__https://lists.llvm.org/cgi-
> bin/mailman/listinfo/cfe-
> commits__;!!JmoZiZGBv3RvKRSx!pPDWW11rGokficZF20VnsBpjjCjLLhat-SnLoi9Iun-
> i_taCUiQMW_3RbXOKUGruLQ$
More information about the llvm-commits
mailing list