* Add a couple of comments to the output c code
authorChris Lattner <sabre@nondot.org>
Fri, 20 Sep 2002 15:18:30 +0000 (15:18 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 20 Sep 2002 15:18:30 +0000 (15:18 +0000)
* _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
lib/Target/CBackend/Writer.cpp

index 4b9b7cc5dddc887780f3d8ae764605776992c9ce..469a3a8f00731562c7209f37334cb03a7b709177 100644 (file)
@@ -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<Type>(V))
-      if (const Type *STy = dyn_cast<StructType>(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<StructType>(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<Type>(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<StructType>(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
index 4b9b7cc5dddc887780f3d8ae764605776992c9ce..469a3a8f00731562c7209f37334cb03a7b709177 100644 (file)
@@ -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<Type>(V))
-      if (const Type *STy = dyn_cast<StructType>(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<StructType>(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<Type>(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<StructType>(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