From 58d04d4e35d0744b7823636b4d7ff7c2421cb03a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 20 Sep 2002 15:18:30 +0000 Subject: [PATCH] * Add a couple of comments to the output c code * _FIX_ infinite recursion problem, due to typedefs of a structure being printed before the structure. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3859 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/CBackend/CBackend.cpp | 35 +++++++++++++++++++------------- lib/Target/CBackend/Writer.cpp | 35 +++++++++++++++++++------------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 4b9b7cc5ddd..469a3a8f007 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -578,19 +578,25 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { SymbolTable::type_const_iterator I = ST.type_begin(Type::TypeTy); SymbolTable::type_const_iterator End = ST.type_end(Type::TypeTy); - for (; I != End; ++I) { - const Value *V = I->second; - if (const Type *Ty = dyn_cast(V)) - if (const Type *STy = dyn_cast(Ty)) { - 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"; - } + // Print out forward declarations for structure types before anything else! + Out << "/* Structure forward decls */\n"; + for (; I != End; ++I) + if (const Type *STy = dyn_cast(I->second)) { + string Name = "struct l_" + makeNameProper(I->first); + Out << Name << ";\n"; + TypeNames.insert(std::make_pair(STy, Name)); + } + + Out << "\n"; + + // Now we can print out typedefs... + Out << "/* Typedefs */\n"; + for (I = ST.type_begin(Type::TypeTy); I != End; ++I) { + const Type *Ty = cast(I->second); + string Name = "l_" + makeNameProper(I->first); + Out << "typedef "; + printType(Ty, Name, true); + Out << ";\n"; } Out << "\n"; @@ -601,6 +607,7 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { // Loop over all structures then push them into the stack so they are // printed in the correct order. // + Out << "/* Structure contents */\n"; for (I = ST.type_begin(Type::TypeTy); I != End; ++I) if (const StructType *STy = dyn_cast(I->second)) printContainedStructs(STy, StructPrinted); @@ -626,7 +633,7 @@ void CWriter::printContainedStructs(const Type *Ty, StructPrinted.insert(STy); string Name = TypeNames[STy]; printType(STy, Name, true); - Out << ";\n"; + Out << ";\n\n"; } // If it is an array, check contained types and continue diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index 4b9b7cc5ddd..469a3a8f007 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -578,19 +578,25 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { SymbolTable::type_const_iterator I = ST.type_begin(Type::TypeTy); SymbolTable::type_const_iterator End = ST.type_end(Type::TypeTy); - for (; I != End; ++I) { - const Value *V = I->second; - if (const Type *Ty = dyn_cast(V)) - if (const Type *STy = dyn_cast(Ty)) { - 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"; - } + // Print out forward declarations for structure types before anything else! + Out << "/* Structure forward decls */\n"; + for (; I != End; ++I) + if (const Type *STy = dyn_cast(I->second)) { + string Name = "struct l_" + makeNameProper(I->first); + Out << Name << ";\n"; + TypeNames.insert(std::make_pair(STy, Name)); + } + + Out << "\n"; + + // Now we can print out typedefs... + Out << "/* Typedefs */\n"; + for (I = ST.type_begin(Type::TypeTy); I != End; ++I) { + const Type *Ty = cast(I->second); + string Name = "l_" + makeNameProper(I->first); + Out << "typedef "; + printType(Ty, Name, true); + Out << ";\n"; } Out << "\n"; @@ -601,6 +607,7 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { // Loop over all structures then push them into the stack so they are // printed in the correct order. // + Out << "/* Structure contents */\n"; for (I = ST.type_begin(Type::TypeTy); I != End; ++I) if (const StructType *STy = dyn_cast(I->second)) printContainedStructs(STy, StructPrinted); @@ -626,7 +633,7 @@ void CWriter::printContainedStructs(const Type *Ty, StructPrinted.insert(STy); string Name = TypeNames[STy]; printType(STy, Name, true); - Out << ";\n"; + Out << ";\n\n"; } // If it is an array, check contained types and continue -- 2.34.1