forked from OSchip/llvm-project
Emit debug info for function template parameters.
llvm-svn: 128948
This commit is contained in:
parent
9f738849ab
commit
b87c428055
|
@ -835,23 +835,15 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// CollectCXXTemplateParams - A helper function to collect debug info for
|
/// CollectTemplateParams - A helper function to collect template parameters.
|
||||||
/// template parameters.
|
|
||||||
llvm::DIArray CGDebugInfo::
|
llvm::DIArray CGDebugInfo::
|
||||||
CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial,
|
CollectTemplateParams(const TemplateParameterList *TPList,
|
||||||
llvm::DIFile Unit) {
|
const TemplateArgumentList &TAList,
|
||||||
llvm::PointerUnion<ClassTemplateDecl *,
|
llvm::DIFile Unit) {
|
||||||
ClassTemplatePartialSpecializationDecl *>
|
|
||||||
PU = TSpecial->getSpecializedTemplateOrPartial();
|
|
||||||
|
|
||||||
TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ?
|
|
||||||
PU.get<ClassTemplateDecl *>()->getTemplateParameters() :
|
|
||||||
PU.get<ClassTemplatePartialSpecializationDecl *>()->getTemplateParameters();
|
|
||||||
const TemplateArgumentList &TAList = TSpecial->getTemplateInstantiationArgs();
|
|
||||||
llvm::SmallVector<llvm::Value *, 16> TemplateParams;
|
llvm::SmallVector<llvm::Value *, 16> TemplateParams;
|
||||||
for (unsigned i = 0, e = TAList.size(); i != e; ++i) {
|
for (unsigned i = 0, e = TAList.size(); i != e; ++i) {
|
||||||
const TemplateArgument &TA = TAList[i];
|
const TemplateArgument &TA = TAList[i];
|
||||||
NamedDecl *ND = TPList->getParam(i);
|
const NamedDecl *ND = TPList->getParam(i);
|
||||||
if (TA.getKind() == TemplateArgument::Type) {
|
if (TA.getKind() == TemplateArgument::Type) {
|
||||||
llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit);
|
llvm::DIType TTy = getOrCreateType(TA.getAsType(), Unit);
|
||||||
llvm::DITemplateTypeParameter TTP =
|
llvm::DITemplateTypeParameter TTP =
|
||||||
|
@ -868,6 +860,35 @@ CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial,
|
||||||
return DBuilder.getOrCreateArray(TemplateParams.data(), TemplateParams.size());
|
return DBuilder.getOrCreateArray(TemplateParams.data(), TemplateParams.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// CollectFunctionTemplateParams - A helper function to collect debug
|
||||||
|
/// info for function template parameters.
|
||||||
|
llvm::DIArray CGDebugInfo::
|
||||||
|
CollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit) {
|
||||||
|
if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplateSpecialization){
|
||||||
|
const TemplateParameterList *TList =
|
||||||
|
FD->getTemplateSpecializationInfo()->getTemplate()->getTemplateParameters();
|
||||||
|
return
|
||||||
|
CollectTemplateParams(TList, *FD->getTemplateSpecializationArgs(), Unit);
|
||||||
|
}
|
||||||
|
return llvm::DIArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// CollectCXXTemplateParams - A helper function to collect debug info for
|
||||||
|
/// template parameters.
|
||||||
|
llvm::DIArray CGDebugInfo::
|
||||||
|
CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TSpecial,
|
||||||
|
llvm::DIFile Unit) {
|
||||||
|
llvm::PointerUnion<ClassTemplateDecl *,
|
||||||
|
ClassTemplatePartialSpecializationDecl *>
|
||||||
|
PU = TSpecial->getSpecializedTemplateOrPartial();
|
||||||
|
|
||||||
|
TemplateParameterList *TPList = PU.is<ClassTemplateDecl *>() ?
|
||||||
|
PU.get<ClassTemplateDecl *>()->getTemplateParameters() :
|
||||||
|
PU.get<ClassTemplatePartialSpecializationDecl *>()->getTemplateParameters();
|
||||||
|
const TemplateArgumentList &TAList = TSpecial->getTemplateInstantiationArgs();
|
||||||
|
return CollectTemplateParams(TPList, TAList, Unit);
|
||||||
|
}
|
||||||
|
|
||||||
/// getOrCreateVTablePtrType - Return debug info descriptor for vtable.
|
/// getOrCreateVTablePtrType - Return debug info descriptor for vtable.
|
||||||
llvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) {
|
llvm::DIType CGDebugInfo::getOrCreateVTablePtrType(llvm::DIFile Unit) {
|
||||||
if (VTablePtrType.isValid())
|
if (VTablePtrType.isValid())
|
||||||
|
@ -1538,6 +1559,7 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
|
||||||
unsigned Flags = 0;
|
unsigned Flags = 0;
|
||||||
llvm::DIFile Unit = getOrCreateFile(CurLoc);
|
llvm::DIFile Unit = getOrCreateFile(CurLoc);
|
||||||
llvm::DIDescriptor FDContext(Unit);
|
llvm::DIDescriptor FDContext(Unit);
|
||||||
|
llvm::DIArray TParamsArray;
|
||||||
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
|
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
|
||||||
// If there is a DISubprogram for this function available then use it.
|
// If there is a DISubprogram for this function available then use it.
|
||||||
llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator
|
llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator
|
||||||
|
@ -1561,6 +1583,9 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
|
||||||
if (const NamespaceDecl *NSDecl =
|
if (const NamespaceDecl *NSDecl =
|
||||||
dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
|
dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
|
||||||
FDContext = getOrCreateNameSpace(NSDecl);
|
FDContext = getOrCreateNameSpace(NSDecl);
|
||||||
|
|
||||||
|
// Collect template parameters.
|
||||||
|
TParamsArray = CollectFunctionTemplateParams(FD, Unit);
|
||||||
} else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) {
|
} else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) {
|
||||||
Name = getObjCMethodName(OMD);
|
Name = getObjCMethodName(OMD);
|
||||||
Flags |= llvm::DIDescriptor::FlagPrototyped;
|
Flags |= llvm::DIDescriptor::FlagPrototyped;
|
||||||
|
@ -1582,7 +1607,8 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
|
||||||
DBuilder.createFunction(FDContext, Name, LinkageName, Unit,
|
DBuilder.createFunction(FDContext, Name, LinkageName, Unit,
|
||||||
LineNo, getOrCreateType(FnType, Unit),
|
LineNo, getOrCreateType(FnType, Unit),
|
||||||
Fn->hasInternalLinkage(), true/*definition*/,
|
Fn->hasInternalLinkage(), true/*definition*/,
|
||||||
Flags, CGM.getLangOptions().Optimize, Fn);
|
Flags, CGM.getLangOptions().Optimize, Fn,
|
||||||
|
TParamsArray);
|
||||||
|
|
||||||
// Push function on region stack.
|
// Push function on region stack.
|
||||||
llvm::MDNode *SPN = SP;
|
llvm::MDNode *SPN = SP;
|
||||||
|
|
|
@ -123,7 +123,13 @@ class CGDebugInfo {
|
||||||
llvm::DIFile F,
|
llvm::DIFile F,
|
||||||
llvm::SmallVectorImpl<llvm::Value *> &EltTys,
|
llvm::SmallVectorImpl<llvm::Value *> &EltTys,
|
||||||
llvm::DIType RecordTy);
|
llvm::DIType RecordTy);
|
||||||
|
|
||||||
|
llvm::DIArray
|
||||||
|
CollectTemplateParams(const TemplateParameterList *TPList,
|
||||||
|
const TemplateArgumentList &TAList,
|
||||||
|
llvm::DIFile Unit);
|
||||||
|
llvm::DIArray
|
||||||
|
CollectFunctionTemplateParams(const FunctionDecl *FD, llvm::DIFile Unit);
|
||||||
llvm::DIArray
|
llvm::DIArray
|
||||||
CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TS,
|
CollectCXXTemplateParams(const ClassTemplateSpecializationDecl *TS,
|
||||||
llvm::DIFile F);
|
llvm::DIFile F);
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct XF {
|
||||||
|
T member;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T fx(XF<T> xi) {
|
||||||
|
return xi.member;
|
||||||
|
}
|
||||||
|
|
||||||
|
//CHECK: DW_TAG_template_type_parameter
|
||||||
|
//CHECK: XF<int>
|
||||||
|
template int fx(XF<int>);
|
Loading…
Reference in New Issue