From dbf69f1992a3ee2b66071fcc314d39092f378c18 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 8 Mar 2005 16:19:59 +0000 Subject: [PATCH] Make sure to remove all dead type names from the symbol table, not just struct types. This fixes Regression/CodeGen/CBackend/2005-03-08-RecursiveTypeCrash.ll, a crash on Java output that Alkis reported. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20519 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/CBackend/CBackend.cpp | 17 ++++++++--------- lib/Target/CBackend/Writer.cpp | 17 ++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index 57de4e5f770..111468f0237 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -227,20 +227,19 @@ bool CBackendNameAllUsedStructs::runOnModule(Module &M) { std::set UT = getAnalysis().getTypes(); // Loop over the module symbol table, removing types from UT that are - // already named, and removing names for structure types that are not used. + // already named, and removing names for types that are not used. // SymbolTable &MST = M.getSymbolTable(); for (SymbolTable::type_iterator TI = MST.type_begin(), TE = MST.type_end(); TI != TE; ) { SymbolTable::type_iterator I = TI++; - if (const StructType *STy = dyn_cast(I->second)) { - // If this is not used, remove it from the symbol table. - std::set::iterator UTI = UT.find(STy); - if (UTI == UT.end()) - MST.remove(I); - else - UT.erase(UTI); - } + + // If this is not used, remove it from the symbol table. + std::set::iterator UTI = UT.find(I->second); + if (UTI == UT.end()) + MST.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 diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index 57de4e5f770..111468f0237 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -227,20 +227,19 @@ bool CBackendNameAllUsedStructs::runOnModule(Module &M) { std::set UT = getAnalysis().getTypes(); // Loop over the module symbol table, removing types from UT that are - // already named, and removing names for structure types that are not used. + // already named, and removing names for types that are not used. // SymbolTable &MST = M.getSymbolTable(); for (SymbolTable::type_iterator TI = MST.type_begin(), TE = MST.type_end(); TI != TE; ) { SymbolTable::type_iterator I = TI++; - if (const StructType *STy = dyn_cast(I->second)) { - // If this is not used, remove it from the symbol table. - std::set::iterator UTI = UT.find(STy); - if (UTI == UT.end()) - MST.remove(I); - else - UT.erase(UTI); - } + + // If this is not used, remove it from the symbol table. + std::set::iterator UTI = UT.find(I->second); + if (UTI == UT.end()) + MST.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 -- 2.34.1