forked from OSchip/llvm-project
[DWARF5][clang]: Added support for DebugInfo generation for auto return type for C++ member functions.
Summary: This patch will provide support for auto return type for the C++ member functions. This patch includes clang side implementation of this feature. Patch by: Awanish Pandey <Awanish.Pandey@amd.com> Reviewers: dblaikie, aprantl, shafik, alok, SouraVX, jini.susan.george Reviewed by: dblaikie Differential Revision: https://reviews.llvm.org/D70524
This commit is contained in:
parent
c958639098
commit
6d6a4590c5
|
@ -810,6 +810,10 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
|
|||
return DBuilder.createBasicType(BTName, Size, Encoding);
|
||||
}
|
||||
|
||||
llvm::DIType *CGDebugInfo::CreateType(const AutoType *Ty) {
|
||||
return DBuilder.createUnspecifiedType("auto");
|
||||
}
|
||||
|
||||
llvm::DIType *CGDebugInfo::CreateType(const ComplexType *Ty) {
|
||||
// Bit size and offset of the type.
|
||||
llvm::dwarf::TypeKind Encoding = llvm::dwarf::DW_ATE_complex_float;
|
||||
|
@ -1457,16 +1461,18 @@ void CGDebugInfo::CollectRecordFields(
|
|||
|
||||
llvm::DISubroutineType *
|
||||
CGDebugInfo::getOrCreateMethodType(const CXXMethodDecl *Method,
|
||||
llvm::DIFile *Unit) {
|
||||
llvm::DIFile *Unit, bool decl) {
|
||||
const FunctionProtoType *Func = Method->getType()->getAs<FunctionProtoType>();
|
||||
if (Method->isStatic())
|
||||
return cast_or_null<llvm::DISubroutineType>(
|
||||
getOrCreateType(QualType(Func, 0), Unit));
|
||||
return getOrCreateInstanceMethodType(Method->getThisType(), Func, Unit);
|
||||
return getOrCreateInstanceMethodType(Method->getThisType(), Func, Unit, decl);
|
||||
}
|
||||
|
||||
llvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType(
|
||||
QualType ThisPtr, const FunctionProtoType *Func, llvm::DIFile *Unit) {
|
||||
llvm::DISubroutineType *
|
||||
CGDebugInfo::getOrCreateInstanceMethodType(QualType ThisPtr,
|
||||
const FunctionProtoType *Func,
|
||||
llvm::DIFile *Unit, bool decl) {
|
||||
// Add "this" pointer.
|
||||
llvm::DITypeRefArray Args(
|
||||
cast<llvm::DISubroutineType>(getOrCreateType(QualType(Func, 0), Unit))
|
||||
|
@ -1474,9 +1480,12 @@ llvm::DISubroutineType *CGDebugInfo::getOrCreateInstanceMethodType(
|
|||
assert(Args.size() && "Invalid number of arguments!");
|
||||
|
||||
SmallVector<llvm::Metadata *, 16> Elts;
|
||||
|
||||
// First element is always return type. For 'void' functions it is NULL.
|
||||
Elts.push_back(Args[0]);
|
||||
QualType temp = Func->getReturnType();
|
||||
if (temp->getTypeClass() == Type::Auto && decl)
|
||||
Elts.push_back(CreateType(cast<AutoType>(temp)));
|
||||
else
|
||||
Elts.push_back(Args[0]);
|
||||
|
||||
// "this" pointer is always first argument.
|
||||
const CXXRecordDecl *RD = ThisPtr->getPointeeCXXRecordDecl();
|
||||
|
@ -1535,7 +1544,7 @@ llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
|
|||
isa<CXXConstructorDecl>(Method) || isa<CXXDestructorDecl>(Method);
|
||||
|
||||
StringRef MethodName = getFunctionName(Method);
|
||||
llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit);
|
||||
llvm::DISubroutineType *MethodTy = getOrCreateMethodType(Method, Unit, true);
|
||||
|
||||
// Since a single ctor/dtor corresponds to multiple functions, it doesn't
|
||||
// make sense to give a single ctor/dtor a linkage name.
|
||||
|
@ -2754,7 +2763,7 @@ llvm::DIType *CGDebugInfo::CreateType(const MemberPointerType *Ty,
|
|||
return DBuilder.createMemberPointerType(
|
||||
getOrCreateInstanceMethodType(
|
||||
CXXMethodDecl::getThisType(FPT, Ty->getMostRecentCXXRecordDecl()),
|
||||
FPT, U),
|
||||
FPT, U, false),
|
||||
ClassType, Size, /*Align=*/0, Flags);
|
||||
}
|
||||
|
||||
|
@ -3529,7 +3538,7 @@ llvm::DISubroutineType *CGDebugInfo::getOrCreateFunctionType(const Decl *D,
|
|||
return DBuilder.createSubroutineType(DBuilder.getOrCreateTypeArray(None));
|
||||
|
||||
if (const auto *Method = dyn_cast<CXXMethodDecl>(D))
|
||||
return getOrCreateMethodType(Method, F);
|
||||
return getOrCreateMethodType(Method, F, false);
|
||||
|
||||
const auto *FTy = FnType->getAs<FunctionType>();
|
||||
CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C;
|
||||
|
|
|
@ -165,6 +165,7 @@ class CGDebugInfo {
|
|||
/// ivars and property accessors.
|
||||
llvm::DIType *CreateType(const BuiltinType *Ty);
|
||||
llvm::DIType *CreateType(const ComplexType *Ty);
|
||||
llvm::DIType *CreateType(const AutoType *Ty);
|
||||
llvm::DIType *CreateQualifiedType(QualType Ty, llvm::DIFile *Fg);
|
||||
llvm::DIType *CreateType(const TypedefType *Ty, llvm::DIFile *Fg);
|
||||
llvm::DIType *CreateType(const TemplateSpecializationType *Ty,
|
||||
|
@ -214,10 +215,10 @@ class CGDebugInfo {
|
|||
/// not updated to include implicit \c this pointer. Use this routine
|
||||
/// to get a method type which includes \c this pointer.
|
||||
llvm::DISubroutineType *getOrCreateMethodType(const CXXMethodDecl *Method,
|
||||
llvm::DIFile *F);
|
||||
llvm::DIFile *F, bool decl);
|
||||
llvm::DISubroutineType *
|
||||
getOrCreateInstanceMethodType(QualType ThisPtr, const FunctionProtoType *Func,
|
||||
llvm::DIFile *Unit);
|
||||
llvm::DIFile *Unit, bool decl);
|
||||
llvm::DISubroutineType *
|
||||
getOrCreateFunctionType(const Decl *D, QualType FnType, llvm::DIFile *F);
|
||||
/// \return debug info descriptor for vtable.
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// Test for debug info for C++11 auto return member functions
|
||||
// RUN: %clang_cc1 -dwarf-version=5 -emit-llvm -triple x86_64-linux-gnu %s -o - \
|
||||
// RUN: -O0 -disable-llvm-passes \
|
||||
// RUN: -debug-info-kind=standalone \
|
||||
// RUN: | FileCheck %s
|
||||
|
||||
// CHECK: !DISubprogram(name: "findMax",{{.*}}, type: ![[FUN_TYPE:[0-9]+]],{{.*}}
|
||||
|
||||
// CHECK: ![[FUN_TYPE]] = !DISubroutineType(types: ![[TYPE_NODE:[0-9]+]])
|
||||
// CHECK-NEXT: ![[TYPE_NODE]] = !{![[DOUBLE_TYPE:[0-9]+]], {{.*}}
|
||||
// CHECK-NEXT: ![[DOUBLE_TYPE]] = !DIBasicType(name: "double", {{.*}})
|
||||
|
||||
// CHECK: !DISubroutineType(types: ![[TYPE_DECL_NODE:[0-9]+]])
|
||||
// CHECK-NEXT: ![[TYPE_DECL_NODE]] = !{![[AUTO_TYPE:[0-9]+]], {{.*}}
|
||||
// CHECK-NEXT: ![[AUTO_TYPE]] = !DIBasicType(tag: DW_TAG_unspecified_type, name: "auto")
|
||||
struct myClass {
|
||||
auto findMax();
|
||||
};
|
||||
|
||||
auto myClass::findMax() {
|
||||
return 0.0;
|
||||
}
|
Loading…
Reference in New Issue