diff options
author | Nick Hildenbrandt <hldnbrnd@uiuc.edu> | 2002-09-14 21:36:24 +0000 |
---|---|---|
committer | Nick Hildenbrandt <hldnbrnd@uiuc.edu> | 2002-09-14 21:36:24 +0000 |
commit | 67aa2e235dc62f1caf110fed14674df976865e81 (patch) | |
tree | 9a0f0de0cb6a5a6517ebad1186a0d8f1199db9f5 /lib | |
parent | 86bdc54d02701184455688fd5196ec1dcd3d81fa (diff) | |
download | external_llvm-67aa2e235dc62f1caf110fed14674df976865e81.zip external_llvm-67aa2e235dc62f1caf110fed14674df976865e81.tar.gz external_llvm-67aa2e235dc62f1caf110fed14674df976865e81.tar.bz2 |
Fixed problem with printing struct definitions in the correct order.
This allows for the Regression/Transforms/ScalarReplacement/scalarize.c to run correctly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3721 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/CBackend/CBackend.cpp | 65 | ||||
-rw-r--r-- | lib/Target/CBackend/Writer.cpp | 65 |
2 files changed, 100 insertions, 30 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp index c54af08..55fc670 100644 --- a/lib/Target/CBackend/CBackend.cpp +++ b/lib/Target/CBackend/CBackend.cpp @@ -36,6 +36,8 @@ namespace { const Module *TheModule; map<const Type *, string> TypeNames; std::set<const Value*> MangledGlobals; + std::set<const StructType *> StructPrinted; + public: CWriter(ostream &o) : Out(o) {} @@ -72,6 +74,7 @@ namespace { private : bool nameAllUsedStructureTypes(Module &M); + void parseStruct(const Type *Ty); void printModule(Module *M); void printSymbolTable(const SymbolTable &ST); void printGlobal(const GlobalVariable *GV); @@ -568,34 +571,66 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); - for (; I != End; ++I) - if (const Type *Ty = dyn_cast<StructType>(I->second)) { - string Name = "struct l_" + makeNameProper(I->first); - Out << Name << ";\n"; - TypeNames.insert(std::make_pair(Ty, Name)); + for (; I != End; ++I){ + const Value *V = I->second; + if (const Type *Ty = dyn_cast<Type>(V)) { + if (const Type *STy = dyn_cast<StructType>(V)) { + 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"; + } } + } } Out << "\n"; + // Loop over all structures then push them into the stack so they are + // printed in the correct order. for (SymbolTable::const_iterator TI = ST.begin(); TI != ST.end(); ++TI) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); for (; I != End; ++I) { - const Value *V = I->second; - if (const Type *Ty = dyn_cast<Type>(V)) { - string Name = "l_" + makeNameProper(I->first); - if (isa<StructType>(Ty)) - Name = "struct " + makeNameProper(Name); - else - Out << "typedef "; + if (const StructType *STy = dyn_cast<StructType>(I->second)) + parseStruct(STy); + } + } +} - printType(Ty, Name, true); - Out << ";\n"; - } +// Push the struct onto the stack and recursively push all structs +// this one depends on. +void CWriter::parseStruct(const Type *Ty) { + if (const StructType *STy = dyn_cast<StructType>(Ty)){ + //Check to see if we have already printed this struct + if (StructPrinted.find(STy) == StructPrinted.end()){ + for (StructType::ElementTypes::const_iterator + I = STy->getElementTypes().begin(), + E = STy->getElementTypes().end(); I != E; ++I) { + const Type *Ty1 = dyn_cast<Type>(I->get()); + if (isa<StructType>(Ty1) || isa<ArrayType>(Ty1)) + parseStruct(Ty1); + } + + //Print struct + StructPrinted.insert(STy); + string Name = TypeNames[STy]; + printType(STy, Name, true); + Out << ";\n"; } } + // If it is an array check it's type and continue + else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)){ + const Type *Ty1 = ATy->getElementType(); + if (isa<StructType>(Ty1) || isa<ArrayType>(Ty1)) + parseStruct(Ty1); + } } diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index c54af08..55fc670 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -36,6 +36,8 @@ namespace { const Module *TheModule; map<const Type *, string> TypeNames; std::set<const Value*> MangledGlobals; + std::set<const StructType *> StructPrinted; + public: CWriter(ostream &o) : Out(o) {} @@ -72,6 +74,7 @@ namespace { private : bool nameAllUsedStructureTypes(Module &M); + void parseStruct(const Type *Ty); void printModule(Module *M); void printSymbolTable(const SymbolTable &ST); void printGlobal(const GlobalVariable *GV); @@ -568,34 +571,66 @@ void CWriter::printSymbolTable(const SymbolTable &ST) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); - for (; I != End; ++I) - if (const Type *Ty = dyn_cast<StructType>(I->second)) { - string Name = "struct l_" + makeNameProper(I->first); - Out << Name << ";\n"; - TypeNames.insert(std::make_pair(Ty, Name)); + for (; I != End; ++I){ + const Value *V = I->second; + if (const Type *Ty = dyn_cast<Type>(V)) { + if (const Type *STy = dyn_cast<StructType>(V)) { + 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"; + } } + } } Out << "\n"; + // Loop over all structures then push them into the stack so they are + // printed in the correct order. for (SymbolTable::const_iterator TI = ST.begin(); TI != ST.end(); ++TI) { SymbolTable::type_const_iterator I = ST.type_begin(TI->first); SymbolTable::type_const_iterator End = ST.type_end(TI->first); for (; I != End; ++I) { - const Value *V = I->second; - if (const Type *Ty = dyn_cast<Type>(V)) { - string Name = "l_" + makeNameProper(I->first); - if (isa<StructType>(Ty)) - Name = "struct " + makeNameProper(Name); - else - Out << "typedef "; + if (const StructType *STy = dyn_cast<StructType>(I->second)) + parseStruct(STy); + } + } +} - printType(Ty, Name, true); - Out << ";\n"; - } +// Push the struct onto the stack and recursively push all structs +// this one depends on. +void CWriter::parseStruct(const Type *Ty) { + if (const StructType *STy = dyn_cast<StructType>(Ty)){ + //Check to see if we have already printed this struct + if (StructPrinted.find(STy) == StructPrinted.end()){ + for (StructType::ElementTypes::const_iterator + I = STy->getElementTypes().begin(), + E = STy->getElementTypes().end(); I != E; ++I) { + const Type *Ty1 = dyn_cast<Type>(I->get()); + if (isa<StructType>(Ty1) || isa<ArrayType>(Ty1)) + parseStruct(Ty1); + } + + //Print struct + StructPrinted.insert(STy); + string Name = TypeNames[STy]; + printType(STy, Name, true); + Out << ";\n"; } } + // If it is an array check it's type and continue + else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)){ + const Type *Ty1 = ATy->getElementType(); + if (isa<StructType>(Ty1) || isa<ArrayType>(Ty1)) + parseStruct(Ty1); + } } |