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
This commit is contained in:
Eric Christopher 2012-02-13 14:56:11 +00:00
parent 043fdf091d
commit 8a41bd88d7
4 changed files with 26 additions and 106 deletions

View File

@ -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<CXXRecordDecl>(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<Decl>(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<Decl>(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<FunctionNoProtoType>(Ty))
EltTys.push_back(DBuilder.createUnspecifiedParameter());
else if (const FunctionProtoType *FTP = dyn_cast<FunctionProtoType>(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<void *, llvm::WeakVH>::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<ClassTemplateSpecializationDecl>(RD))
return CreateType(Ty);
llvm::DIDescriptor RDContext
= createContextChain(cast<Decl>(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<RecordType>(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.

View File

@ -73,9 +73,6 @@ class CGDebugInfo {
llvm::DenseMap<const FunctionDecl *, llvm::WeakVH> SPCache;
llvm::DenseMap<const NamespaceDecl *, llvm::WeakVH> 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);

View File

@ -1,4 +1,5 @@
// RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s
// XFAIL: *
class Test
{
public:

View File

@ -1,4 +1,5 @@
// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s
// XFAIL: *
class B {
public: