mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 05:22:04 +00:00
TypeFinder: prefer iterative algorithm to keep stack usage low.
Introduce subtype_reverse_iterator to maintain the numbering assigned during the recursive type walk. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@192770 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+17
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user