X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FTarget%2FCBackend%2FWriter.cpp;h=faa9b925dd13949fa4ad289af602e0673201643c;hp=eeb2bdd4f3b5d727070ee023953c702d1b45e067;hb=01b2d6131145bfa3c9c4c1598edeaac13155e1a5;hpb=7277826d7e20accb9ac433ee55546a83c1316188 diff --git a/lib/Target/CBackend/Writer.cpp b/lib/Target/CBackend/Writer.cpp index eeb2bdd4f3b..faa9b925dd1 100644 --- a/lib/Target/CBackend/Writer.cpp +++ b/lib/Target/CBackend/Writer.cpp @@ -1087,13 +1087,20 @@ void CWriter::visitInvokeInst(InvokeInst &II) { void CWriter::visitUnwindInst(UnwindInst &I) { + // Determine the return size of write() based on the data model. +#ifdef _LP64 + const char * writedecl = " extern signed long long write();\n"; +#else + const char * writedecl = " extern write();\n"; +#endif + // The unwind instructions causes a control flow transfer out of the current // function, unwinding the stack until a caller who used the invoke // instruction is found. In this context, we code generated the invoke // instruction to add an entry to the top of the jmpbuf_list. Thus, here we // just have to longjmp to the specified handler. Out << " if (__llvm_jmpbuf_list == 0) { /* unwind */\n" - << " extern write();\n" + << writedecl << " ((void (*)(int, void*, unsigned))write)(2,\n" << " \"throw found with no handler!\\n\", 31); abort();\n" << " }\n"