mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 08:56:15 +08:00
Quick fix for PR2950, infinite loop generating debug info for
recursive types. - Style will be clean up in further patches. llvm-svn: 58490
This commit is contained in:
@@ -375,22 +375,27 @@ CGDebugInfo::getOrCreateFunctionType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
}
|
||||
|
||||
/// getOrCreateRecordType - get structure or union type.
|
||||
llvm::TypeDesc *
|
||||
CGDebugInfo::getOrCreateRecordType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
void CGDebugInfo::getOrCreateRecordType(QualType type,
|
||||
llvm::CompileUnitDesc *Unit,
|
||||
llvm::TypeDesc *&Slot)
|
||||
{
|
||||
// Prevent recursing in type generation by initializing the slot
|
||||
// here.
|
||||
llvm::CompositeTypeDesc *RecType;
|
||||
if (type->isStructureType())
|
||||
RecType = new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_structure_type);
|
||||
Slot = RecType =
|
||||
new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_structure_type);
|
||||
else if (type->isUnionType())
|
||||
RecType = new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_union_type);
|
||||
Slot = RecType =
|
||||
new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_union_type);
|
||||
else
|
||||
return NULL;
|
||||
return;
|
||||
|
||||
RecordDecl *RecDecl = type->getAsRecordType()->getDecl();
|
||||
// We can not get the type for forward declarations.
|
||||
// FIXME: What *should* we be doing here?
|
||||
if (!RecDecl->getDefinition(M->getContext()))
|
||||
return NULL;
|
||||
return;
|
||||
const ASTRecordLayout &RL = M->getContext().getASTRecordLayout(RecDecl);
|
||||
|
||||
SourceManager &SM = M->getContext().getSourceManager();
|
||||
@@ -417,7 +422,6 @@ CGDebugInfo::getOrCreateRecordType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
RecType->setAlign(RL.getAlignment());
|
||||
RecType->setOffset(0);
|
||||
}
|
||||
return RecType;
|
||||
}
|
||||
|
||||
/// getOrCreateEnumType - get Enum type.
|
||||
@@ -428,7 +432,7 @@ CGDebugInfo::getOrCreateEnumType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
= new llvm::CompositeTypeDesc(llvm::dwarf::DW_TAG_enumeration_type);
|
||||
|
||||
EnumType *EType = dyn_cast<EnumType>(type);
|
||||
if (!EType) return NULL;
|
||||
if (!EType) return(NULL);
|
||||
|
||||
EnumDecl *EDecl = EType->getDecl();
|
||||
SourceManager &SM = M->getContext().getSourceManager();
|
||||
@@ -520,15 +524,14 @@ CGDebugInfo::getOrCreateArrayType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
|
||||
|
||||
/// getOrCreateTaggedType - get or create structure/union/Enum type.
|
||||
llvm::TypeDesc *
|
||||
CGDebugInfo::getOrCreateTaggedType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
void CGDebugInfo::getOrCreateTaggedType(QualType type,
|
||||
llvm::CompileUnitDesc *Unit,
|
||||
llvm::TypeDesc *&Slot)
|
||||
{
|
||||
if (type->isStructureType() || type->isUnionType())
|
||||
return getOrCreateRecordType(type, Unit);
|
||||
getOrCreateRecordType(type, Unit, Slot);
|
||||
else if (type->isEnumeralType())
|
||||
return getOrCreateEnumType(type, Unit);
|
||||
else
|
||||
return NULL;
|
||||
Slot = getOrCreateEnumType(type, Unit);
|
||||
}
|
||||
|
||||
/// getOrCreateType - Get the type from the cache or create a new
|
||||
@@ -545,7 +548,7 @@ CGDebugInfo::getOrCreateType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
|
||||
// We need to check for the CVR qualifiers as the first thing.
|
||||
if (type.getCVRQualifiers()) {
|
||||
Slot = getOrCreateCVRType (type, Unit);
|
||||
Slot = getOrCreateCVRType(type, Unit);
|
||||
return Slot;
|
||||
}
|
||||
|
||||
@@ -582,7 +585,7 @@ CGDebugInfo::getOrCreateType(QualType type, llvm::CompileUnitDesc *Unit)
|
||||
break;
|
||||
|
||||
case Type::Tagged:
|
||||
Slot = getOrCreateTaggedType(type, Unit);
|
||||
getOrCreateTaggedType(type, Unit, Slot);
|
||||
break;
|
||||
|
||||
case Type::ConstantArray:
|
||||
|
||||
@@ -88,12 +88,14 @@ private:
|
||||
llvm::CompileUnitDesc *unit);
|
||||
llvm::TypeDesc *getOrCreateFunctionType(QualType type,
|
||||
llvm::CompileUnitDesc *unit);
|
||||
llvm::TypeDesc *getOrCreateRecordType(QualType type,
|
||||
llvm::CompileUnitDesc *unit);
|
||||
void getOrCreateRecordType(QualType type,
|
||||
llvm::CompileUnitDesc *unit,
|
||||
llvm::TypeDesc *&Slot);
|
||||
llvm::TypeDesc *getOrCreateEnumType(QualType type,
|
||||
llvm::CompileUnitDesc *unit);
|
||||
llvm::TypeDesc *getOrCreateTaggedType(QualType type,
|
||||
llvm::CompileUnitDesc *unit);
|
||||
void getOrCreateTaggedType(QualType type,
|
||||
llvm::CompileUnitDesc *unit,
|
||||
llvm::TypeDesc *&Slot);
|
||||
llvm::TypeDesc *getOrCreateArrayType(QualType type,
|
||||
llvm::CompileUnitDesc *unit);
|
||||
|
||||
|
||||
10
clang/test/CodeGen/PR2950-debug-info-on-recursive-type.c
Normal file
10
clang/test/CodeGen/PR2950-debug-info-on-recursive-type.c
Normal file
@@ -0,0 +1,10 @@
|
||||
// RUN: clang -g -emit-llvm -o %t %s
|
||||
|
||||
struct s0;
|
||||
struct s0 { struct s0 *p; } g0;
|
||||
|
||||
struct s0 *f0(struct s0 *a0) {
|
||||
return a0->p;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user