From 67aa2e235dc62f1caf110fed14674df976865e81 Mon Sep 17 00:00:00 2001 From: Nick Hildenbrandt Date: Sat, 14 Sep 2002 21:36:24 +0000 Subject: [PATCH] Fixed problem with printing struct definitions in the correct order. This allows for the Regression/Transforms/ScalarReplacement/scalarize.c to run correctly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3721 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/CBackend/CBackend.cpp | 67 ++++++++++++++++++++++++-------- lib/Target/CBackend/Writer.cpp | 67 ++++++++++++++++++++++++-------- 2 files changed, 102 insertions(+), 32 deletions(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index c54af08e844..55fc6704b7f 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -36,6 +36,8 @@ namespace { const Module *TheModule; map TypeNames; std::set MangledGlobals; + std::set StructPrinted; + public: CWriter(ostream &o) : Out(o) {} @@ -72,6 +74,7 @@ namespace { private : bool nameAllUsedStructureTypes(Module &M); + void parseStruct(const Type *Ty); void printModule(Module *M); void printSymbolTable(const SymbolTable &ST); void printGlobal(const GlobalVariable *GV); @@ -568,36 +571,68 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); - for (; I != End; ++I) - if (const Type *Ty = dyn_cast(I->second)) { - string Name = "struct l_" + makeNameProper(I->first); - Out << Name << ";\n"; - TypeNames.insert(std::make_pair(Ty, Name)); + for (; I != End; ++I){ + const Value *V = I->second; + if (const Type *Ty = dyn_cast(V)) { + if (const Type *STy = dyn_cast(V)) { + string Name = "struct l_" + makeNameProper(I->first); + Out << Name << ";\n"; + TypeNames.insert(std::make_pair(STy, Name)); + } + else { + string Name = "l_" + makeNameProper(I->first); + Out << "typedef "; + printType(Ty, Name, true); + Out << ";\n"; + } } + } } Out << "\n"; + // Loop over all structures then push them into the stack so they are + // printed in the correct order. for (SymbolTable::const_iterator TI = ST.begin(); TI != ST.end(); ++TI) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); for (; I != End; ++I) { - const Value *V = I->second; - if (const Type *Ty = dyn_cast(V)) { - string Name = "l_" + makeNameProper(I->first); - if (isa(Ty)) - Name = "struct " + makeNameProper(Name); - else - Out << "typedef "; - - printType(Ty, Name, true); - Out << ";\n"; - } + if (const StructType *STy = dyn_cast(I->second)) + parseStruct(STy); } } } +// Push the struct onto the stack and recursively push all structs +// this one depends on. +void CWriter::parseStruct(const Type *Ty) { + if (const StructType *STy = dyn_cast(Ty)){ + //Check to see if we have already printed this struct + if (StructPrinted.find(STy) == StructPrinted.end()){ + for (StructType::ElementTypes::const_iterator + I = STy->getElementTypes().begin(), + E = STy->getElementTypes().end(); I != E; ++I) { + const Type *Ty1 = dyn_cast(I->get()); + if (isa(Ty1) || isa(Ty1)) + parseStruct(Ty1); + } + + //Print struct + StructPrinted.insert(STy); + string Name = TypeNames[STy]; + printType(STy, Name, true); + Out << ";\n"; + } + } + // If it is an array check it's type and continue + else if (const ArrayType *ATy = dyn_cast(Ty)){ + const Type *Ty1 = ATy->getElementType(); + if (isa(Ty1) || isa(Ty1)) + parseStruct(Ty1); + } +} + void CWriter::printFunctionSignature(const Function *F, bool Prototype) { if (F->hasInternalLinkage()) Out << "static "; diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index c54af08e844..55fc6704b7f 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -36,6 +36,8 @@ namespace { const Module *TheModule; map TypeNames; std::set MangledGlobals; + std::set StructPrinted; + public: CWriter(ostream &o) : Out(o) {} @@ -72,6 +74,7 @@ namespace { private : bool nameAllUsedStructureTypes(Module &M); + void parseStruct(const Type *Ty); void printModule(Module *M); void printSymbolTable(const SymbolTable &ST); void printGlobal(const GlobalVariable *GV); @@ -568,36 +571,68 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); - for (; I != End; ++I) - if (const Type *Ty = dyn_cast(I->second)) { - string Name = "struct l_" + makeNameProper(I->first); - Out << Name << ";\n"; - TypeNames.insert(std::make_pair(Ty, Name)); + for (; I != End; ++I){ + const Value *V = I->second; + if (const Type *Ty = dyn_cast(V)) { + if (const Type *STy = dyn_cast(V)) { + string Name = "struct l_" + makeNameProper(I->first); + Out << Name << ";\n"; + TypeNames.insert(std::make_pair(STy, Name)); + } + else { + string Name = "l_" + makeNameProper(I->first); + Out << "typedef "; + printType(Ty, Name, true); + Out << ";\n"; + } } + } } Out << "\n"; + // Loop over all structures then push them into the stack so they are + // printed in the correct order. for (SymbolTable::const_iterator TI = ST.begin(); TI != ST.end(); ++TI) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); for (; I != End; ++I) { - const Value *V = I->second; - if (const Type *Ty = dyn_cast(V)) { - string Name = "l_" + makeNameProper(I->first); - if (isa(Ty)) - Name = "struct " + makeNameProper(Name); - else - Out << "typedef "; - - printType(Ty, Name, true); - Out << ";\n"; - } + if (const StructType *STy = dyn_cast(I->second)) + parseStruct(STy); } } } +// Push the struct onto the stack and recursively push all structs +// this one depends on. +void CWriter::parseStruct(const Type *Ty) { + if (const StructType *STy = dyn_cast(Ty)){ + //Check to see if we have already printed this struct + if (StructPrinted.find(STy) == StructPrinted.end()){ + for (StructType::ElementTypes::const_iterator + I = STy->getElementTypes().begin(), + E = STy->getElementTypes().end(); I != E; ++I) { + const Type *Ty1 = dyn_cast(I->get()); + if (isa(Ty1) || isa(Ty1)) + parseStruct(Ty1); + } + + //Print struct + StructPrinted.insert(STy); + string Name = TypeNames[STy]; + printType(STy, Name, true); + Out << ";\n"; + } + } + // If it is an array check it's type and continue + else if (const ArrayType *ATy = dyn_cast(Ty)){ + const Type *Ty1 = ATy->getElementType(); + if (isa(Ty1) || isa(Ty1)) + parseStruct(Ty1); + } +} + void CWriter::printFunctionSignature(const Function *F, bool Prototype) { if (F->hasInternalLinkage()) Out << "static ";