summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNick Hildenbrandt <hldnbrnd@uiuc.edu>2002-09-14 21:36:24 +0000
committerNick Hildenbrandt <hldnbrnd@uiuc.edu>2002-09-14 21:36:24 +0000
commit67aa2e235dc62f1caf110fed14674df976865e81 (patch)
tree9a0f0de0cb6a5a6517ebad1186a0d8f1199db9f5 /lib
parent86bdc54d02701184455688fd5196ec1dcd3d81fa (diff)
downloadllvm-67aa2e235dc62f1caf110fed14674df976865e81.tar.gz
llvm-67aa2e235dc62f1caf110fed14674df976865e81.tar.bz2
llvm-67aa2e235dc62f1caf110fed14674df976865e81.tar.xz
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.cpp65
-rw-r--r--lib/Target/CBackend/Writer.cpp65
2 files changed, 100 insertions, 30 deletions
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index c54af08e84..55fc6704b7 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 c54af08e84..55fc6704b7 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);
+ }
}