From: Kai T. <kti...@go...> - 2011-02-23 09:20:41
|
2011/2/23 Dongsheng Song <don...@gm...>: > On Wed, Feb 23, 2011 at 16:20, Kai Tietz <kti...@go...> wrote: >> >> 2011/2/23 Dongsheng Song <don...@gm...>: >> > Sorry, here is the update source can be compiled by MS VC: >> > >> > $ cat have_sse.c >> > #include <setjmp.h> >> > #include <signal.h> >> > >> > jmp_buf env; >> > int have_sse_unit = 1; >> > >> > void illegal_instruction_catcher(int ignore) { >> > signal(SIGILL, SIG_DFL); >> > longjmp(env, 1); >> > } >> > >> > unsigned int sse_get_control() { >> > unsigned int cw; >> > #ifdef _MSC_VER >> > __asm { >> > stmxcsr cw >> > } >> > #else >> > __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory"); >> > #endif >> > return cw; >> > } >> > >> > void detect_sse_unit() { >> > if (setjmp(env)) { >> > have_sse_unit = 0; >> > goto restore_sigill_handler; >> > } >> > >> > signal(SIGILL, illegal_instruction_catcher); >> > (void) sse_get_control(); >> > have_sse_unit = 1; >> > >> > restore_sigill_handler: >> > >> > signal(SIGILL, SIG_DFL); >> > } >> > >> > int main(int argc, char *argv[]) { >> > detect_sse_unit(); >> > return have_sse_unit; >> > } >> > >> > On Wed, Feb 23, 2011 at 11:17, Dongsheng Song <don...@gm...> >> > wrote: >> >> >> >> Hi, >> >> >> >> Here is the bugs exposed by Parma Polyhedra Library. In setjmp manual, >> >> the >> >> only required head >> >> file is setjmp.h, but mingw-w64 is not the case, here is a example: >> >> >> >> >> >> $ cat have_sse.c >> >> #include <setjmp.h> >> >> #include <signal.h> >> >> >> >> jmp_buf env; >> >> int have_sse_unit = 1; >> >> >> >> void illegal_instruction_catcher(int ignore) { >> >> signal(SIGILL, SIG_DFL); >> >> longjmp(env, 1); >> >> } >> >> >> >> inline unsigned int sse_get_control() { >> >> unsigned int cw; >> >> __asm__ __volatile__ ("stmxcsr %0" : "=m" (*&cw) : : "memory"); >> >> return cw; >> >> } >> >> >> >> void detect_sse_unit() { >> >> if (setjmp(env)) { >> >> have_sse_unit = 0; >> >> goto restore_sigill_handler; >> >> } >> >> >> >> signal(SIGILL, illegal_instruction_catcher); >> >> (void) sse_get_control(); >> >> have_sse_unit = 1; >> >> >> >> restore_sigill_handler: >> >> >> >> signal(SIGILL, SIG_DFL); >> >> } >> >> >> >> int main(int argc, char *argv[]) { >> >> detect_sse_unit(); >> >> return have_sse_unit; >> >> } >> >> >> >> This C source file can be compiled by Linux gcc 4.4.5, >> >> MS VC2008, MS VC2010, but can not be compiled by >> >> mingw-w64 target gcc 4.5 and 4.6: >> >> >> >> oracle@vc:~$ ./gcc-4.6-windows_i686-linux/bin/i686-w64-mingw32-gcc >> >> have_sse.c >> >> have_sse.c: In function 'detect_sse_unit': >> >> have_sse.c:25:7: error: 'NULL' undeclared (first use in this function) >> >> have_sse.c:25:7: note: each undeclared identifier is reported only once >> >> for each function it appears in >> >> >> >> oracle@vc:~$ ./gcc-4.5-windows_i686-linux/bin/i686-w64-mingw32-gcc >> >> have_sse.c >> >> have_sse.c: In function 'detect_sse_unit': >> >> have_sse.c:25:7: error: 'NULL' undeclared (first use in this function) >> >> have_sse.c:25:7: note: each undeclared identifier is reported only once >> >> for each function it appears in >> >> >> >> -- >> >> Dongsheng >> >> Hmm, that NULL isn't defined is the issue. So it looks for me more >> like a missing header include of stddef.h, or stdlib.h. > > Yes, but since Linux GCC and MS VC no need include the extra header files, I > think > this should consider a bug, and it seems that PPL (Parma Polyhedra Library) > maintainer do not want add extra C++ header cstddef, mingw-w64 should add > the > extra header file in setjmp.h > > -- > Dongsheng > > Hmm, maybe. Could you check if on glibc the setjmp.h header has dependencies to stdlib, or stddef.h? Kai |