[cfe-commits] r88808 - in /cfe/trunk: lib/CodeGen/CGDebugInfo.cpp test/CodeGenCXX/debug-info.cpp
Daniel Dunbar
daniel at zuster.org
Sat Nov 14 20:27:41 PST 2009
Is this correct? Shouldn't debug info want the uncanonicalized type,
so the debug info matches the source?
- Daniel
On Saturday, November 14, 2009, Anders Carlsson <andersca at mac.com> wrote:
> Author: andersca
> Date: Sat Nov 14 15:08:12 2009
> New Revision: 88808
>
> URL: http://llvm.org/viewvc/llvm-project?rev=88808&view=rev
> Log:
> Canonicalize the type before trying to create a debug type.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> cfe/trunk/test/CodeGenCXX/debug-info.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=88808&r1=88807&r2=88808&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Sat Nov 14 15:08:12 2009
> @@ -795,6 +795,29 @@
> 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 @@
> 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 @@
> 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);
>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info.cpp?rev=88808&r1=88807&r2=88808&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/debug-info.cpp Sat Nov 14 15:08:12 2009
> @@ -6,3 +6,8 @@
> void f(Identity<int>::Type a) {}
> void f(Identity<int> a) {}
> void f(int& a) { }
> +
> +template<typename T> struct A {
> + A<T> *next;
> +};
> +void f(A<int>) { }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list