diff options
author | Chris Lattner <sabre@nondot.org> | 2006-01-20 18:57:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-01-20 18:57:03 +0000 |
commit | 14d9b20b78951a0832a45b3a6edaa1f7629fa19a (patch) | |
tree | 7edc109dad549e9154298acc5ee71ae477b8f92e /lib/Target/CBackend/Writer.cpp | |
parent | 1f16ff6f0ad3e4cc0cd95e5244bd9feb50fef369 (diff) |
Simplify CWriter::printContainedStructs, also allowing it to work with
PackedTypes as a side-effect.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25485 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/CBackend/Writer.cpp')
-rw-r--r-- | lib/Target/CBackend/Writer.cpp | 29 |
1 files changed, 11 insertions, 18 deletions
diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index dd45582168..87a575b813 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -1037,29 +1037,22 @@ void CWriter::printModuleTypes(const SymbolTable &ST) { // this one depends on. void CWriter::printContainedStructs(const Type *Ty, std::set<const StructType*> &StructPrinted){ + // Don't walk through pointers. + if (isa<PointerType>(Ty) || Ty->isPrimitiveType()) return; + + // Print all contained types first. + for (Type::subtype_iterator I = Ty->subtype_begin(), + E = Ty->subtype_end(); I != E; ++I) + printContainedStructs(*I, StructPrinted); + if (const StructType *STy = dyn_cast<StructType>(Ty)) { - //Check to see if we have already printed this struct - if (StructPrinted.count(STy) == 0) { - // Print all contained types first... - for (StructType::element_iterator I = STy->element_begin(), - E = STy->element_end(); I != E; ++I) { - const Type *Ty1 = I->get(); - if (isa<StructType>(Ty1) || isa<ArrayType>(Ty1)) - printContainedStructs(*I, StructPrinted); - } - - //Print structure type out.. - StructPrinted.insert(STy); + // Check to see if we have already printed this struct. + if (StructPrinted.insert(STy).second) { + // Print structure type out. std::string Name = TypeNames[STy]; printType(Out, STy, Name, true); Out << ";\n\n"; } - - // If it is an array, check contained types and continue - } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)){ - const Type *Ty1 = ATy->getElementType(); - if (isa<StructType>(Ty1) || isa<ArrayType>(Ty1)) - printContainedStructs(Ty1, StructPrinted); } } |