Output forward definitions of global vars to handle recursive intializers correctly.

llvm-svn: 3391
This commit is contained in:
Chris Lattner 2002-08-19 21:48:40 +00:00
parent 8858f0272d
commit b5815279c6
1 changed files with 39 additions and 20 deletions

View File

@ -414,35 +414,54 @@ void CWriter::printModule(Module *M) {
<< "#ifndef NULL\n#define NULL 0\n#endif\n\n" << "#ifndef NULL\n#define NULL 0\n#endif\n\n"
<< "typedef unsigned char bool;\n" << "typedef unsigned char bool;\n"
<< "\n\n/* Global Symbols */\n"; << "\n\n/* Global Declarations */\n";
// First output all the declarations for the program, because C requires
// Functions & globals to be declared before they are used.
//
// Loop over the symbol table, emitting all named constants... // Loop over the symbol table, emitting all named constants...
if (M->hasSymbolTable()) if (M->hasSymbolTable())
printSymbolTable(*M->getSymbolTable()); printSymbolTable(*M->getSymbolTable());
Out << "\n\n/* Global Data */\n"; // Global variable declarations...
for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I) { if (!M->gempty()) {
if (I->hasInternalLinkage()) Out << "static "; Out << "\n/* Global Variable Declarations */\n";
printType(I->getType()->getElementType(), getValueName(I)); for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I) {
Out << (I->hasExternalLinkage() ? "extern " : "static ");
if (I->hasInitializer()) { printType(I->getType()->getElementType(), getValueName(I));
Out << " = " ; Out << ";\n";
writeOperand(I->getInitializer()); }
}
// Function declarations
if (!M->empty()) {
Out << "\n/* Function Declarations */\n";
for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
printFunctionDecl(I);
}
// Output the global variable contents...
if (!M->gempty()) {
Out << "\n\n/* Global Data */\n";
for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I) {
if (I->hasInternalLinkage()) Out << "static ";
printType(I->getType()->getElementType(), getValueName(I));
if (I->hasInitializer()) {
Out << " = " ;
writeOperand(I->getInitializer());
}
Out << ";\n";
} }
Out << ";\n";
} }
// First output all the declarations of the functions as C requires Functions
// be declared before they are used.
//
Out << "\n\n/* Function Declarations */\n";
for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
printFunctionDecl(I);
// Output all of the functions... // Output all of the functions...
Out << "\n\n/* Function Bodies */\n"; if (!M->empty()) {
for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) Out << "\n\n/* Function Bodies */\n";
printFunction(I); for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
printFunction(I);
}
} }