From: Chris Lattner Date: Tue, 16 Jan 2007 07:22:23 +0000 (+0000) Subject: Fix PR918 by only using typedefs to name struct types. This makes the later X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=19e8b0c1f5e1137de6679211d17b62f03e69a1fc Fix PR918 by only using typedefs to name struct types. This makes the later type ordering stuff work better. This fixes PR918 and CodeGen/CBackend/2007-01-15-NamedArrayType.ll Patch by Gordon Henriksen. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33254 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 8a6a0a9df23..304145887b0 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -269,13 +269,19 @@ bool CBackendNameAllUsedStructsAndMergeFunctions::runOnModule(Module &M) { for (TypeSymbolTable::iterator TI = TST.begin(), TE = TST.end(); TI != TE; ) { TypeSymbolTable::iterator I = TI++; - - // If this is not used, remove it from the symbol table. - std::set::iterator UTI = UT.find(I->second); - if (UTI == UT.end()) + + // If this isn't a struct type, remove it from our set of types to name. + // This simplifies emission later. + if (!isa(I->second)) { TST.remove(I); - else - UT.erase(UTI); // Only keep one name for this type. + } else { + // If this is not used, remove it from the symbol table. + std::set::iterator UTI = UT.find(I->second); + if (UTI == UT.end()) + TST.remove(I); + else + UT.erase(UTI); // Only keep one name for this type. + } } // UT now contains types that are not named. Loop over it, naming @@ -1694,10 +1700,11 @@ void CWriter::printModuleTypes(const TypeSymbolTable &TST) { Out << '\n'; - // Now we can print out typedefs... + // Now we can print out typedefs. Above, we guaranteed that this can only be + // for struct types. Out << "/* Typedefs */\n"; for (I = TST.begin(); I != End; ++I) { - const Type *Ty = cast(I->second); + const StructType *Ty = cast(I->second); std::string Name = "l_" + Mang->makeNameProper(I->first); Out << "typedef "; printType(Out, Ty, false, Name);