Hi, I am testing a cross-compiler targetting arm-wince-pe and based on gcc-trunk revision r144975 and when compiling a project I get the following error :
vinc...@vincent-pc:~/projects$ arm-mingw32ce-gcc -std=gnu99 -save-temps -I/home/vincent/local/wince/include -DNDEBUG -O3 -c cegcc-errno-bug.c -DDLL_EXPORT -DPIC -o libeet_la-eet_lib.o cegcc-errno-bug.c: In function 'eet_close': cegcc-errno-bug.c:134: error: unrecognizable insn: (insn 6 5 7 3 cegcc-errno-bug.c:114 (set (reg/f:SI 138) (symbol_ref:SI ("errno") [flags 0x4c0] <var_decl 0xb7db26e0 errno>)) -1 (nil)) cegcc-errno-bug.c:134: internal compiler error: in extract_insn, at recog.c:2048 Of course I could report a bug but since original sources are patched the bug might be due to one of the modifications. Anyway if someone knows how I could fix this, the only thing I see is the fact the problem seems to be related to errno and on wince platform by default there is no errno. So the project I am compiling declare it like this and is defined in a library. /home/vincent/local/wince/include/errno.h: #ifndef __EVIL_ERRNO_H__ #define __EVIL_ERRNO_H__ #ifdef EAPI # undef EAPI #endif /* EAPI */ #ifdef _WIN32 # ifdef EFL_EVIL_BUILD # ifdef DLL_EXPORT # define EAPI __declspec(dllexport) # else # define EAPI # endif /* ! DLL_EXPORT */ # else # define EAPI __declspec(dllimport) # endif /* ! EFL_EVIL_BUILD */ #endif /* _WIN32 */ #ifdef __cplusplus extern "C" { #endif extern EAPI int errno; /* Fake values */ #define E2BIG 1 #define EACCES 2 ... #ifdef __cplusplus } #endif #endif /* __EVIL_ERRNO_H__ */ ----------------------------------------------------- And here is the testcase : //#ifdef HAVE_CONFIG_H //# include <config.h> //#endif #ifdef HAVE_ALLOCA_H # include <alloca.h> #elif defined __GNUC__ # define alloca __builtin_alloca #elif defined _AIX # define alloca __alloca #elif defined _MSC_VER # include <malloc.h> # define alloca _alloca #else # include <stddef.h> # ifdef __cplusplus extern "C" # endif void *alloca (size_t); #endif #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <time.h> #include <string.h> #include <fnmatch.h> #include <fcntl.h> #include <unistd.h> #include <zlib.h> #ifdef HAVE_OPENSSL #include <openssl/err.h> #endif #ifdef HAVE_NETINET_IN_H # include <netinet/in.h> #endif #if defined(_WIN32) && ! defined(__CEGCC__) # include <winsock2.h> #endif //#ifdef HAVE_EVIL //# include <Evil.h> //#endif #ifdef HAVE_GNUTLS # include <gnutls/gnutls.h> # include <gcrypt.h> #endif #ifdef HAVE_OPENSSL # include <openssl/err.h> # include <openssl/evp.h> #endif //#include <Eina.h> //#include "Eet.h" //#include "Eet_private.h" #ifdef HAVE_REALPATH #undef HAVE_REALPATH #endif #define EET_MAGIC_FILE 0x1ee7ff00 #define EET_MAGIC_FILE_HEADER 0x1ee7ff01 #define EET_MAGIC_FILE2 0x1ee70f42 typedef enum _Eet_File_Mode { EET_FILE_MODE_INVALID = -1, EET_FILE_MODE_READ, EET_FILE_MODE_WRITE, EET_FILE_MODE_READ_WRITE } Eet_File_Mode; typedef enum _Eet_Error { EET_ERROR_NONE, EET_ERROR_BAD_OBJECT, EET_ERROR_EMPTY, EET_ERROR_NOT_WRITABLE, EET_ERROR_OUT_OF_MEMORY, EET_ERROR_WRITE_ERROR, EET_ERROR_WRITE_ERROR_FILE_TOO_BIG, EET_ERROR_WRITE_ERROR_IO_ERROR, EET_ERROR_WRITE_ERROR_OUT_OF_SPACE, EET_ERROR_WRITE_ERROR_FILE_CLOSED, EET_ERROR_MMAP_FAILED, EET_ERROR_X509_ENCODING_FAILED, EET_ERROR_SIGNATURE_FAILED, EET_ERROR_INVALID_SIGNATURE, EET_ERROR_NOT_SIGNED, EET_ERROR_NOT_IMPLEMENTED, EET_ERROR_PRNG_NOT_SEEDED, EET_ERROR_ENCRYPT_FAILED, EET_ERROR_DECRYPT_FAILED } Eet_Error; /* prototypes of internal calls */ static Eet_Error eet_flush2(int *ef); /* flush out writes to a v2 eet file */ static Eet_Error eet_flush2(int *ef) { Eet_Error error = EET_ERROR_NONE; switch (errno) { case EFBIG: error = EET_ERROR_WRITE_ERROR_FILE_TOO_BIG; break; case EIO: error = EET_ERROR_WRITE_ERROR_IO_ERROR; break; case ENOSPC: error = EET_ERROR_WRITE_ERROR_OUT_OF_SPACE; break; case EPIPE: error = EET_ERROR_WRITE_ERROR_FILE_CLOSED; break; default: error = EET_ERROR_WRITE_ERROR; break; } return error; } EAPI Eet_Error eet_close(int *ef) { Eet_Error err; err = eet_flush2(ef); return err; } // L134 : where gcc crash If I comment the errno variable inside the switch and replace it by 1 for instance, it compiles fine. Where should I start ?