From b5815279c6fa486bb6b3a0f6d3e31953d20f25e3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 19 Aug 2002 21:48:40 +0000 Subject: [PATCH] Output forward definitions of global vars to handle recursive intializers correctly. llvm-svn: 3391 --- llvm/lib/CWriter/Writer.cpp | 59 ++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/llvm/lib/CWriter/Writer.cpp b/llvm/lib/CWriter/Writer.cpp index 4a38db7d42e2..f2adf95940cb 100644 --- a/llvm/lib/CWriter/Writer.cpp +++ b/llvm/lib/CWriter/Writer.cpp @@ -414,35 +414,54 @@ void CWriter::printModule(Module *M) { << "#ifndef NULL\n#define NULL 0\n#endif\n\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... if (M->hasSymbolTable()) printSymbolTable(*M->getSymbolTable()); - 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()); + // Global variable declarations... + if (!M->gempty()) { + Out << "\n/* Global Variable Declarations */\n"; + for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I) { + Out << (I->hasExternalLinkage() ? "extern " : "static "); + printType(I->getType()->getElementType(), getValueName(I)); + Out << ";\n"; + } + } + + // 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... - Out << "\n\n/* Function Bodies */\n"; - for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) - printFunction(I); + if (!M->empty()) { + Out << "\n\n/* Function Bodies */\n"; + for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I) + printFunction(I); + } }