diff --git a/lib/CWriter/Writer.cpp b/lib/CWriter/Writer.cpp index 8d9b314695f..88e0a264a9c 100644 --- a/lib/CWriter/Writer.cpp +++ b/lib/CWriter/Writer.cpp @@ -504,6 +504,17 @@ bool CWriter::nameAllUsedStructureTypes(Module &M) { return Changed; } +static void generateAllocaDecl(ostream& Out) +{ + // On SunOS, we need to insert the alloca macro & proto for the builtin. + Out << "#ifdef sun\n" + << "extern void *__builtin_alloca(unsigned long);\n" + << "#define alloca(x) __builtin_alloca(x)\n" + << "#else\n" + << "#include <alloca.h>\n" + << "#endif\n\n"; +} + void CWriter::printModule(Module *M) { // Calculate which global values have names that will collide when we throw // away type information. @@ -528,18 +539,18 @@ void CWriter::printModule(Module *M) { //Out << "#include <stdlib.h>\n"; // get declaration for alloca - Out << "/* Provide Declarations */\n" - << "#include <alloca.h>\n\n" - - // Provide a definition for null if one does not already exist, - // and for `bool' if not compiling with a C++ compiler. - << "#ifndef NULL\n#define NULL 0\n#endif\n\n" + Out << "/* Provide Declarations */\n"; + generateAllocaDecl(Out); + + // Provide a definition for null if one does not already exist, + // and for `bool' if not compiling with a C++ compiler. + Out << "#ifndef NULL\n#define NULL 0\n#endif\n\n" << "#ifndef __cplusplus\ntypedef unsigned char bool;\n#endif\n" - + << "\n\n/* Support for floating point constants */\n" << "typedef unsigned long long ConstantDoubleTy;\n" << "typedef unsigned int ConstantFloatTy;\n" - + << "\n\n/* Global Declarations */\n"; // First output all the declarations for the program, because C requires