diff options
author | Chris Lattner <sabre@nondot.org> | 2007-01-16 07:22:23 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-01-16 07:22:23 +0000 |
commit | 19e8b0c1f5e1137de6679211d17b62f03e69a1fc (patch) | |
tree | 6e74d561ea446f3741b151cfafdba3d19e1941ad /lib/Target/CBackend/CBackend.cpp | |
parent | efe0213626b84d3686e24f7091f054514797e82e (diff) |
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
Diffstat (limited to 'lib/Target/CBackend/CBackend.cpp')
-rw-r--r-- | lib/Target/CBackend/CBackend.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 8a6a0a9df2..304145887b 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<const Type *>::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<StructType>(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<const Type *>::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<Type>(I->second); + const StructType *Ty = cast<StructType>(I->second); std::string Name = "l_" + Mang->makeNameProper(I->first); Out << "typedef "; printType(Out, Ty, false, Name); |