The "correct" fix for CBackend/2003-10-23-UnusedType.ll is to not even try

to emit types which are not used.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9647 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2003-11-02 01:29:27 +00:00
parent ba12c23ca7
commit fa395ec036
2 changed files with 48 additions and 30 deletions

View File

@ -36,6 +36,8 @@ namespace {
std::ostream &Out;
Mangler *Mang;
const Module *TheModule;
FindUsedTypes *FUT;
std::map<const Type *, std::string> TypeNames;
std::set<const Value*> MangledGlobals;
bool needsMalloc, emittedInvoke;
@ -52,6 +54,7 @@ namespace {
virtual bool run(Module &M) {
// Initialize
TheModule = &M;
FUT = &getAnalysis<FindUsedTypes>();
// Ensure that all structure types have names...
bool Changed = nameAllUsedStructureTypes(M);
@ -542,7 +545,7 @@ void CWriter::writeOperand(Value *Operand) {
//
bool CWriter::nameAllUsedStructureTypes(Module &M) {
// Get a set of types that are used by the program...
std::set<const Type *> UT = getAnalysis<FindUsedTypes>().getTypes();
std::set<const Type *> UT = FUT->getTypes();
// Loop over the module symbol table, removing types from UT that are already
// named.
@ -786,7 +789,9 @@ void CWriter::printSymbolTable(const SymbolTable &ST) {
// 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)) {
if (const Type *STy = dyn_cast<StructType>(I->second))
// Only print out used types!
if (FUT->getTypes().count(STy)) {
std::string Name = "struct l_" + Mangler::makeNameProper(I->first);
Out << Name << ";\n";
TypeNames.insert(std::make_pair(STy, Name));
@ -796,7 +801,9 @@ void CWriter::printSymbolTable(const SymbolTable &ST) {
// Now we can print out typedefs...
Out << "/* Typedefs */\n";
for (I = ST.type_begin(Type::TypeTy); I != End; ++I) {
for (I = ST.type_begin(Type::TypeTy); I != End; ++I)
// Only print out used types!
if (FUT->getTypes().count(cast<Type>(I->second))) {
const Type *Ty = cast<Type>(I->second);
std::string Name = "l_" + Mangler::makeNameProper(I->first);
Out << "typedef ";
@ -815,6 +822,8 @@ void CWriter::printSymbolTable(const SymbolTable &ST) {
Out << "/* Structure contents */\n";
for (I = ST.type_begin(Type::TypeTy); I != End; ++I)
if (const StructType *STy = dyn_cast<StructType>(I->second))
// Only print out used types!
if (FUT->getTypes().count(STy))
printContainedStructs(STy, StructPrinted);
}

View File

@ -36,6 +36,8 @@ namespace {
std::ostream &Out;
Mangler *Mang;
const Module *TheModule;
FindUsedTypes *FUT;
std::map<const Type *, std::string> TypeNames;
std::set<const Value*> MangledGlobals;
bool needsMalloc, emittedInvoke;
@ -52,6 +54,7 @@ namespace {
virtual bool run(Module &M) {
// Initialize
TheModule = &M;
FUT = &getAnalysis<FindUsedTypes>();
// Ensure that all structure types have names...
bool Changed = nameAllUsedStructureTypes(M);
@ -542,7 +545,7 @@ void CWriter::writeOperand(Value *Operand) {
//
bool CWriter::nameAllUsedStructureTypes(Module &M) {
// Get a set of types that are used by the program...
std::set<const Type *> UT = getAnalysis<FindUsedTypes>().getTypes();
std::set<const Type *> UT = FUT->getTypes();
// Loop over the module symbol table, removing types from UT that are already
// named.
@ -786,7 +789,9 @@ void CWriter::printSymbolTable(const SymbolTable &ST) {
// 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)) {
if (const Type *STy = dyn_cast<StructType>(I->second))
// Only print out used types!
if (FUT->getTypes().count(STy)) {
std::string Name = "struct l_" + Mangler::makeNameProper(I->first);
Out << Name << ";\n";
TypeNames.insert(std::make_pair(STy, Name));
@ -796,7 +801,9 @@ void CWriter::printSymbolTable(const SymbolTable &ST) {
// Now we can print out typedefs...
Out << "/* Typedefs */\n";
for (I = ST.type_begin(Type::TypeTy); I != End; ++I) {
for (I = ST.type_begin(Type::TypeTy); I != End; ++I)
// Only print out used types!
if (FUT->getTypes().count(cast<Type>(I->second))) {
const Type *Ty = cast<Type>(I->second);
std::string Name = "l_" + Mangler::makeNameProper(I->first);
Out << "typedef ";
@ -815,6 +822,8 @@ void CWriter::printSymbolTable(const SymbolTable &ST) {
Out << "/* Structure contents */\n";
for (I = ST.type_begin(Type::TypeTy); I != End; ++I)
if (const StructType *STy = dyn_cast<StructType>(I->second))
// Only print out used types!
if (FUT->getTypes().count(STy))
printContainedStructs(STy, StructPrinted);
}