mirror of https://github.com/microsoft/clang.git
[DWARF] Allow forward declarations of a class template instantiation
to have child entries describing the template parameters. This will be on by default for SCE tuning. Differential Revision: https://reviews.llvm.org/D14358 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@314444 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ecb2a6660
commit
f0ae815a5f
|
@ -200,6 +200,9 @@ def arange_sections : Flag<["-"], "arange_sections">,
|
|||
def dwarf_ext_refs : Flag<["-"], "dwarf-ext-refs">,
|
||||
HelpText<"Generate debug info with external references to clang modules"
|
||||
" or precompiled headers">;
|
||||
def debug_forward_template_params : Flag<["-"], "debug-forward-template-params">,
|
||||
HelpText<"Emit complete descriptions of template parameters in forward"
|
||||
" declarations">;
|
||||
def fforbid_guard_variables : Flag<["-"], "fforbid-guard-variables">,
|
||||
HelpText<"Emit an error if a C++ static local initializer would need a guard variable">;
|
||||
def no_implicit_float : Flag<["-"], "no-implicit-float">,
|
||||
|
|
|
@ -219,6 +219,10 @@ CODEGENOPT(EnableSplitDwarf, 1, 0) ///< Whether to enable split DWARF
|
|||
CODEGENOPT(SplitDwarfInlining, 1, 1) ///< Whether to include inlining info in the
|
||||
///< skeleton CU to allow for symbolication
|
||||
///< of inline stack frames without .dwo files.
|
||||
CODEGENOPT(DebugFwdTemplateParams, 1, 0) ///< Whether to emit complete
|
||||
///< template parameter descriptions in
|
||||
///< forward declarations (versus just
|
||||
///< including them in the name).
|
||||
|
||||
CODEGENOPT(EmitLLVMUseLists, 1, 0) ///< Control whether to serialize use-lists.
|
||||
|
||||
|
|
|
@ -833,6 +833,10 @@ CGDebugInfo::getOrCreateRecordFwdDecl(const RecordType *Ty,
|
|||
llvm::DICompositeType *RetTy = DBuilder.createReplaceableCompositeType(
|
||||
getTagForRecord(RD), RDName, Ctx, DefUnit, Line, 0, Size, Align,
|
||||
llvm::DINode::FlagFwdDecl, FullName);
|
||||
if (CGM.getCodeGenOpts().DebugFwdTemplateParams)
|
||||
if (auto *TSpecial = dyn_cast<ClassTemplateSpecializationDecl>(RD))
|
||||
DBuilder.replaceArrays(RetTy, llvm::DINodeArray(),
|
||||
CollectCXXTemplateParams(TSpecial, DefUnit));
|
||||
ReplaceMap.emplace_back(
|
||||
std::piecewise_construct, std::make_tuple(Ty),
|
||||
std::make_tuple(static_cast<llvm::Metadata *>(RetTy)));
|
||||
|
|
|
@ -2969,6 +2969,11 @@ static void RenderDebugOptions(const ToolChain &TC, const Driver &D,
|
|||
CmdArgs.push_back("-generate-type-units");
|
||||
}
|
||||
|
||||
// Decide how to render forward declarations of template instantiations.
|
||||
// SCE wants full descriptions, others just get them in the name.
|
||||
if (DebuggerTuning == llvm::DebuggerKind::SCE)
|
||||
CmdArgs.push_back("-debug-forward-template-params");
|
||||
|
||||
RenderDebugInfoCompressionArgs(Args, CmdArgs, D);
|
||||
}
|
||||
|
||||
|
|
|
@ -528,6 +528,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Opts.SplitDwarfInlining = !Args.hasArg(OPT_fno_split_dwarf_inlining);
|
||||
Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs);
|
||||
Opts.DebugExplicitImport = Triple.isPS4CPU();
|
||||
Opts.DebugFwdTemplateParams = Args.hasArg(OPT_debug_forward_template_params);
|
||||
|
||||
for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ))
|
||||
Opts.DebugPrefixMap.insert(StringRef(Arg).split('='));
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// RUN: %clang_cc1 %s -triple=%itanium_abi_triple -debug-info-kind=limited -debug-forward-template-params -emit-llvm -o - | FileCheck --check-prefix=CHILD %s
|
||||
// RUN: %clang_cc1 %s -triple=%itanium_abi_triple -debug-info-kind=limited -emit-llvm -o - | FileCheck --check-prefix=NONE %s
|
||||
// A DWARF forward declaration of a template instantiation should have template
|
||||
// parameter children (if we ask for them).
|
||||
|
||||
template<typename T> class A;
|
||||
A<int> *p;
|
||||
|
||||
// CHILD: !DICompositeType(tag: DW_TAG_class_type, name: "A<int>"
|
||||
// CHILD-SAME: flags: DIFlagFwdDecl
|
||||
// CHILD-SAME: templateParams: [[PARAM_LIST:![0-9]*]]
|
||||
// CHILD: [[PARAM_LIST]] = !{[[PARAM:![0-9]*]]}
|
||||
// CHILD: [[PARAM]] = !DITemplateTypeParameter(name: "T",
|
||||
// CHILD-SAME: type: [[BTYPE:![0-9]*]]
|
||||
// CHILD: [[BTYPE]] = !DIBasicType(name: "int"
|
||||
|
||||
// NONE: !DICompositeType(tag: DW_TAG_class_type, name: "A<int>"
|
||||
// NONE-SAME: flags: DIFlagFwdDecl
|
||||
// NONE-NOT: templateParams:
|
||||
// NONE-SAME: )
|
Loading…
Reference in New Issue