diff options
author | Anders Carlsson <andersca@mac.com> | 2009-11-14 21:08:12 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-11-14 21:08:12 +0000 |
commit | 5b6117a7727565be9fcaf709706c7d720bf191ad (patch) | |
tree | 616ea516d5f89d5eea41b72cb89ee810efbb929e /lib/CodeGen/CGDebugInfo.cpp | |
parent | 0dd57c6cf8c6f6e4ee1a8e42daccf8ad1bb6fa4a (diff) |
Canonicalize the type before trying to create a debug type.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88808 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGDebugInfo.cpp')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 99bd0198bb..64748dc8f3 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -795,6 +795,29 @@ llvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty, Ty, Ty->getPointeeType(), Unit); } +static QualType CanonicalizeTypeForDebugInfo(QualType T) { + switch (T->getTypeClass()) { + default: + return T; + case Type::TemplateSpecialization: + return cast<TemplateSpecializationType>(T)->desugar(); + case Type::TypeOfExpr: { + TypeOfExprType *Ty = cast<TypeOfExprType>(T); + return CanonicalizeTypeForDebugInfo(Ty->getUnderlyingExpr()->getType()); + } + case Type::TypeOf: + return cast<TypeOfType>(T)->getUnderlyingType(); + case Type::Decltype: + return cast<DecltypeType>(T)->getUnderlyingType(); + case Type::QualifiedName: + return cast<QualifiedNameType>(T)->getNamedType(); + case Type::SubstTemplateTypeParm: + return cast<SubstTemplateTypeParmType>(T)->getReplacementType(); + case Type::Elaborated: + return cast<ElaboratedType>(T)->getUnderlyingType(); + } +} + /// getOrCreateType - Get the type from the cache or create a new /// one if necessary. llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, @@ -802,6 +825,9 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, if (Ty.isNull()) return llvm::DIType(); + // Canonicalize the type. + Ty = CanonicalizeTypeForDebugInfo(Ty); + // Check for existing entry. std::map<void *, llvm::WeakVH>::iterator it = TypeCache.find(Ty.getAsOpaquePtr()); @@ -859,36 +885,10 @@ llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, case Type::FunctionProto: case Type::FunctionNoProto: return CreateType(cast<FunctionType>(Ty), Unit); - case Type::Elaborated: - return getOrCreateType(cast<ElaboratedType>(Ty)->getUnderlyingType(), - Unit); - case Type::ConstantArray: case Type::VariableArray: case Type::IncompleteArray: return CreateType(cast<ArrayType>(Ty), Unit); - case Type::TypeOfExpr: - return getOrCreateType(cast<TypeOfExprType>(Ty)->getUnderlyingExpr() - ->getType(), Unit); - case Type::TypeOf: - return getOrCreateType(cast<TypeOfType>(Ty)->getUnderlyingType(), Unit); - case Type::Decltype: - return getOrCreateType(cast<DecltypeType>(Ty)->getUnderlyingType(), Unit); - - case Type::QualifiedName: { - const QualifiedNameType *T = cast<QualifiedNameType>(Ty); - return CreateTypeNode(T->getNamedType(), Unit); - } - - case Type::SubstTemplateTypeParm: { - const SubstTemplateTypeParmType *T = cast<SubstTemplateTypeParmType>(Ty); - return CreateTypeNode(T->getReplacementType(), Unit); - } - - case Type::TemplateSpecialization: { - const TemplateSpecializationType *T = cast<TemplateSpecializationType>(Ty); - return CreateTypeNode(T->desugar(), Unit); - } case Type::LValueReference: return CreateType(cast<LValueReferenceType>(Ty), Unit); |