forked from OSchip/llvm-project
TypeFinder: prefer iterative algorithm to keep stack usage low.
Introduce subtype_reverse_iterator to maintain the numbering assigned during the recursive type walk. llvm-svn: 192770
This commit is contained in:
parent
50a86e125a
commit
70b66f0df2
|
@ -324,6 +324,14 @@ public:
|
|||
subtype_iterator subtype_begin() const { return ContainedTys; }
|
||||
subtype_iterator subtype_end() const { return &ContainedTys[NumContainedTys];}
|
||||
|
||||
typedef std::reverse_iterator<subtype_iterator> subtype_reverse_iterator;
|
||||
subtype_reverse_iterator subtype_rbegin() const {
|
||||
return subtype_reverse_iterator(subtype_end());
|
||||
}
|
||||
subtype_reverse_iterator subtype_rend() const {
|
||||
return subtype_reverse_iterator(subtype_begin());
|
||||
}
|
||||
|
||||
/// getContainedType - This method is used to implement the type iterator
|
||||
/// (defined a the end of the file). For derived types, this returns the
|
||||
/// types 'contained' in the derived type.
|
||||
|
|
|
@ -94,19 +94,27 @@ void TypeFinder::clear() {
|
|||
/// incorporateType - This method adds the type to the list of used structures
|
||||
/// if it's not in there already.
|
||||
void TypeFinder::incorporateType(Type *Ty) {
|
||||
// Check to see if we're already visited this type.
|
||||
// Check to see if we've already visited this type.
|
||||
if (!VisitedTypes.insert(Ty).second)
|
||||
return;
|
||||
|
||||
// If this is a structure or opaque type, add a name for the type.
|
||||
if (StructType *STy = dyn_cast<StructType>(Ty))
|
||||
if (!OnlyNamed || STy->hasName())
|
||||
StructTypes.push_back(STy);
|
||||
SmallVector<Type *, 4> TypeWorklist;
|
||||
TypeWorklist.push_back(Ty);
|
||||
do {
|
||||
Ty = TypeWorklist.pop_back_val();
|
||||
|
||||
// Recursively walk all contained types.
|
||||
for (Type::subtype_iterator I = Ty->subtype_begin(),
|
||||
E = Ty->subtype_end(); I != E; ++I)
|
||||
incorporateType(*I);
|
||||
// If this is a structure or opaque type, add a name for the type.
|
||||
if (StructType *STy = dyn_cast<StructType>(Ty))
|
||||
if (!OnlyNamed || STy->hasName())
|
||||
StructTypes.push_back(STy);
|
||||
|
||||
// Add all unvisited subtypes to worklist for processing
|
||||
for (Type::subtype_reverse_iterator I = Ty->subtype_rbegin(),
|
||||
E = Ty->subtype_rend();
|
||||
I != E; ++I)
|
||||
if (VisitedTypes.insert(*I).second)
|
||||
TypeWorklist.push_back(*I);
|
||||
} while (!TypeWorklist.empty());
|
||||
}
|
||||
|
||||
/// incorporateValue - This method is used to walk operand lists finding types
|
||||
|
|
Loading…
Reference in New Issue