[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