From 8a41bd88d783fa6692bc8aea85bc40d47ae043d0 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Mon, 13 Feb 2012 14:56:11 +0000 Subject: [PATCH] Temporarily walk back a few of my recent debug info limiting changes while reworking how we handle wanting to emit only parts of structures. Fixes PR11970. llvm-svn: 150388 --- clang/lib/CodeGen/CGDebugInfo.cpp | 119 ++++-------------- clang/lib/CodeGen/CGDebugInfo.h | 11 -- .../CodeGenCXX/debug-info-dup-fwd-decl.cpp | 1 + .../test/CodeGenCXX/debug-info-limit-type.cpp | 1 + 4 files changed, 26 insertions(+), 106 deletions(-) diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index ab8f5fdbf6de..f6166ca8ae9b 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -486,25 +486,23 @@ llvm::DIType CGDebugInfo::createRecordFwdDecl(const RecordDecl *RD, llvm::DIFile DefUnit = getOrCreateFile(RD->getLocation()); unsigned Line = getLineNumber(RD->getLocation()); - StringRef RDName = RD->getName(); - - // Get the tag. const CXXRecordDecl *CXXDecl = dyn_cast(RD); - unsigned Tag = 0; - if (CXXDecl) { - RDName = getClassName(RD); - Tag = llvm::dwarf::DW_TAG_class_type; - } + + if (CXXDecl) + return DBuilder.createClassType(Ctx, getClassName(RD), DefUnit, + Line, 0, 0, 0, + llvm::DIType::FlagFwdDecl, + llvm::DIType(), llvm::DIArray()); else if (RD->isStruct()) - Tag = llvm::dwarf::DW_TAG_structure_type; + return DBuilder.createStructType(Ctx, RD->getName(), DefUnit, + Line, 0, 0, llvm::DIType::FlagFwdDecl, + llvm::DIArray()); else if (RD->isUnion()) - Tag = llvm::dwarf::DW_TAG_union_type; + return DBuilder.createUnionType(Ctx, RD->getName(), DefUnit, + Line, 0, 0, llvm::DIType::FlagFwdDecl, + llvm::DIArray()); else llvm_unreachable("Unknown RecordDecl type!"); - - // Create the type. - return DBuilder.createForwardDecl(Tag, RDName, DefUnit, - Line); } // Walk up the context chain and create forward decls for record decls, @@ -528,7 +526,7 @@ llvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) { llvm::DIDescriptor FDContext = createContextChain(cast(RD->getDeclContext())); llvm::DIType Ty = createRecordFwdDecl(RD, FDContext); - TypeCache[QualType(RD->getTypeForDecl(),0).getAsOpaquePtr()] = Ty; + RegionMap[Context] = llvm::WeakVH(Ty); return llvm::DIDescriptor(Ty); } @@ -558,10 +556,10 @@ llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy, RecordDecl *RD = RTy->getDecl(); llvm::DIDescriptor FDContext = getContextDescriptor(cast(RD->getDeclContext())); - llvm::DIType DTy = createRecordFwdDecl(RD, FDContext); - TypeCache[PointeeTy.getAsOpaquePtr()] = DTy; + return createRecordFwdDecl(RD, FDContext); } return getOrCreateType(PointeeTy, Unit); + } llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag, @@ -674,12 +672,8 @@ llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, if (isa(Ty)) EltTys.push_back(DBuilder.createUnspecifiedParameter()); else if (const FunctionProtoType *FTP = dyn_cast(Ty)) { - for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) { - if (CGM.getCodeGenOpts().LimitDebugInfo) - EltTys.push_back(getOrCreateLimitedType(FTP->getArgType(i), Unit)); - else - EltTys.push_back(getOrCreateType(FTP->getArgType(i), Unit)); - } + for (unsigned i = 0, e = FTP->getNumArgs(); i != e; ++i) + EltTys.push_back(getOrCreateType(FTP->getArgType(i), Unit)); } llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(EltTys); @@ -688,6 +682,7 @@ llvm::DIType CGDebugInfo::CreateType(const FunctionType *Ty, return DbgTy; } + void CGDebugInfo:: CollectRecordStaticVars(const RecordDecl *RD, llvm::DIType FwdDecl) { @@ -1155,14 +1150,9 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty) { // If this is just a forward declaration, construct an appropriately // marked node and just return it. - if (!RD->getDefinition()) { - llvm::DIType FwdTy = createRecordFwdDecl(RD, RDContext); - TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = FwdTy; - return FwdTy; - } + if (!RD->getDefinition()) + return createRecordFwdDecl(RD, RDContext); - // Create a temporary type here - different than normal forward declared - // types. llvm::DIType FwdDecl = DBuilder.createTemporaryType(DefUnit); llvm::MDNode *MN = FwdDecl; @@ -1633,7 +1623,7 @@ llvm::DIType CGDebugInfo::getTypeOrNull(QualType Ty) { // Unwrap the type as needed for debug information. Ty = UnwrapTypeForDebugInfo(Ty); - + // Check for existing entry. llvm::DenseMap::iterator it = TypeCache.find(Ty.getAsOpaquePtr()); @@ -1654,79 +1644,18 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, llvm::DIFile Unit) { // Unwrap the type as needed for debug information. Ty = UnwrapTypeForDebugInfo(Ty); - - // Check if we already have the type. If we've gotten here and - // have a forward declaration of the type we may want the full type. - // Go ahead and create it if that's the case. + llvm::DIType T = getTypeOrNull(Ty); - if (T.Verify() && !T.isForwardDecl()) return T; + if (T.Verify()) return T; // Otherwise create the type. llvm::DIType Res = CreateTypeNode(Ty, Unit); // And update the type cache. - TypeCache[Ty.getAsOpaquePtr()] = Res; + TypeCache[Ty.getAsOpaquePtr()] = Res; return Res; } -/// getOrCreateLimitedType - Get the type from the cache or create a new -/// limited type if necessary. -llvm::DIType CGDebugInfo::getOrCreateLimitedType(QualType Ty, - llvm::DIFile Unit) { - if (Ty.isNull()) - return llvm::DIType(); - - // Unwrap the type as needed for debug information. - Ty = UnwrapTypeForDebugInfo(Ty); - - llvm::DIType T = getTypeOrNull(Ty); - if (T.Verify()) return T; - - // Otherwise create the type. - llvm::DIType Res = CreateLimitedTypeNode(Ty, Unit); - - // And update the type cache. - TypeCache[Ty.getAsOpaquePtr()] = Res; - return Res; -} - -// TODO: Not safe to use for inner types or for fields. Currently only -// used for by value arguments to functions anything else needs to be -// audited carefully. -llvm::DIType CGDebugInfo::CreateLimitedType(const RecordType *Ty) { - RecordDecl *RD = Ty->getDecl(); - - // For templated records we want the full type information and - // our forward decls don't handle this correctly. - if (isa(RD)) - return CreateType(Ty); - - llvm::DIDescriptor RDContext - = createContextChain(cast(RD->getDeclContext())); - - return createRecordFwdDecl(RD, RDContext); -} - -/// CreateLimitedTypeNode - Create a new debug type node, but only forward -/// declare composite types that haven't been processed yet. -llvm::DIType CGDebugInfo::CreateLimitedTypeNode(QualType Ty,llvm::DIFile Unit) { - - // Work out details of type. - switch (Ty->getTypeClass()) { -#define TYPE(Class, Base) -#define ABSTRACT_TYPE(Class, Base) -#define NON_CANONICAL_TYPE(Class, Base) -#define DEPENDENT_TYPE(Class, Base) case Type::Class: - #include "clang/AST/TypeNodes.def" - llvm_unreachable("Dependent types cannot show up in debug information"); - - case Type::Record: - return CreateLimitedType(cast(Ty)); - default: - return CreateTypeNode(Ty, Unit); - } -} - /// CreateTypeNode - Create a new debug type node. llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty, llvm::DIFile Unit) { // Handle qualifiers, which recursively handles what they refer to. diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index c00c46909723..48cf3fa19e6b 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -73,9 +73,6 @@ class CGDebugInfo { llvm::DenseMap SPCache; llvm::DenseMap NameSpaceCache; - /// Helper functions for getOrCreateLimitedType. - llvm::DIType CreateLimitedType(const RecordType *Ty); - /// Helper functions for getOrCreateType. llvm::DIType CreateType(const BuiltinType *Ty); llvm::DIType CreateType(const ComplexType *Ty); @@ -260,17 +257,9 @@ private: /// necessary. llvm::DIType getOrCreateType(QualType Ty, llvm::DIFile F); - /// getOrCreateLimitedType - Get the type from the cache or create a flat - /// limited type. - llvm::DIType getOrCreateLimitedType(QualType Ty, llvm::DIFile F); - /// CreateTypeNode - Create type metadata for a source language type. llvm::DIType CreateTypeNode(QualType Ty, llvm::DIFile F); - /// CreateLimitedTypeNode - Create type metadata for a source language type, - /// but create as little as possible. - llvm::DIType CreateLimitedTypeNode(QualType Ty, llvm::DIFile F); - /// CreateMemberType - Create new member and increase Offset by FType's size. llvm::DIType CreateMemberType(llvm::DIFile Unit, QualType FType, StringRef Name, uint64_t *Offset); diff --git a/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp b/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp index d7cf27534d73..695d1b0967ed 100644 --- a/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp +++ b/clang/test/CodeGenCXX/debug-info-dup-fwd-decl.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s +// XFAIL: * class Test { public: diff --git a/clang/test/CodeGenCXX/debug-info-limit-type.cpp b/clang/test/CodeGenCXX/debug-info-limit-type.cpp index 760e3ece39ef..e03024fb3cd9 100644 --- a/clang/test/CodeGenCXX/debug-info-limit-type.cpp +++ b/clang/test/CodeGenCXX/debug-info-limit-type.cpp @@ -1,4 +1,5 @@ // RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s +// XFAIL: * class B { public: