diff options
author | edlinger <edlinger@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-05-13 16:23:11 +0000 |
---|---|---|
committer | edlinger <edlinger@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-05-13 16:23:11 +0000 |
commit | b061dab231b806bfa80134a11b0a55524ddcdcef (patch) | |
tree | fbcc4f4a9f2fcf4816b6055b5e2b235c10e3d758 /libffi | |
parent | fe2a2cce250aa22ac2692f7feda446a5df7d622d (diff) | |
download | gcc-b061dab231b806bfa80134a11b0a55524ddcdcef.tar.gz |
Enable Java on Cygwin-64
Currently it is not possible to build GCC's libjava support on Cygwin-64.
This patch fixes the current build-problems on Cygwin-64 and the most
fundamental bugs on that platform.
Note you must still add --enable-threads=posix to successfully build the
java language support.
boehm-gc/ChangeLog:
2014-05-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
Fix current cygwin-64 build problems.
* include/gc_config_macros.h (GC_PTHREADS): Use __CYGWIN__ instead
of __CYGWIN32__ here.
* win32_threads.c (GC_push_all_stacks): Push all X86_64 registers.
(GC_get_thread_stack_base): Get the stack base for X86_64.
libffi/ChangeLog:
2014-05-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
Fix current cygwin-64 build problems.
* src/java_raw_api.c: Remove if !defined(FFI_NO_RAW_API).
* src/x86/ffi.c: Add if defined(__CYGWIN__).
* src/x86/win64.S (ffi_closure_win64, ffi_call_win64): Added
handling for FFI_TYPE_UINT64, FFI_TYPE_POINTER and FFI_TYPE_INT.
Added SEH information. Fixed formatting.
libgcc/ChangeLog:
2014-05-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
* unwind-seh.c (_Unwind_Backtrace): Uncommented, finished
implementation.
libjava/ChangeLog:
2014-05-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
Fix current cygwin-64 build problems.
* configure.host: Added handling for x86_64-*-cygwin/mingw.
* boehm.cc (_Jv_GCAttachThread, _Jv_GCDetachThread): Don't compile if
GC_WIN32_THREADS is defined.
* java/lang/natClass.cc (_Jv_InterfaceAssignableFrom): Rename interface
to source_interface.
libjava/classpath/ChangeLog:
2014-05-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
Fix current cygwin-64 build problems.
* native/fdlibm/mprec.c (_REENT_CHECK_MP, _REENT_MP_FREELIST,
_REENT_MP_P5S, __ULong, __Long): Undefine previous definitions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210386 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libffi')
-rw-r--r-- | libffi/ChangeLog | 9 | ||||
-rw-r--r-- | libffi/src/java_raw_api.c | 4 | ||||
-rw-r--r-- | libffi/src/x86/ffi.c | 2 | ||||
-rw-r--r-- | libffi/src/x86/win64.S | 168 |
4 files changed, 122 insertions, 61 deletions
diff --git a/libffi/ChangeLog b/libffi/ChangeLog index 75bfd8036a0..9ca95562fbd 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,12 @@ +2014-05-13 Bernd Edlinger <bernd.edlinger@hotmail.de> + + Fix current cygwin-64 build problems. + * src/java_raw_api.c: Remove if !defined(FFI_NO_RAW_API). + * src/x86/ffi.c: Add if defined(__CYGWIN__). + * src/x86/win64.S (ffi_closure_win64, ffi_call_win64): Added + handling for FFI_TYPE_UINT64, FFI_TYPE_POINTER and FFI_TYPE_INT. + Added SEH information. Fixed formatting. + 2014-04-22 Jakub Jelinek <jakub@redhat.com> PR other/43620 diff --git a/libffi/src/java_raw_api.c b/libffi/src/java_raw_api.c index 522c8bfd67e..d8e79ea1d45 100644 --- a/libffi/src/java_raw_api.c +++ b/libffi/src/java_raw_api.c @@ -39,7 +39,7 @@ #include <ffi_common.h> #include <stdlib.h> -#if !defined(NO_JAVA_RAW_API) && !defined(FFI_NO_RAW_API) +#if !defined(NO_JAVA_RAW_API) size_t ffi_java_raw_size (ffi_cif *cif) @@ -353,4 +353,4 @@ ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, #endif /* FFI_CLOSURES */ #endif /* !FFI_NATIVE_RAW_API */ -#endif /* !FFI_NO_RAW_API */ +#endif /* !NO_JAVA_RAW_API */ diff --git a/libffi/src/x86/ffi.c b/libffi/src/x86/ffi.c index 611e2219716..6338de2a0f2 100644 --- a/libffi/src/x86/ffi.c +++ b/libffi/src/x86/ffi.c @@ -28,7 +28,7 @@ DEALINGS IN THE SOFTWARE. ----------------------------------------------------------------------- */ -#if !defined(__x86_64__) || defined(_WIN64) +#if !defined(__x86_64__) || defined(_WIN64) || defined(__CYGWIN__) #ifdef _WIN64 #include <windows.h> diff --git a/libffi/src/x86/win64.S b/libffi/src/x86/win64.S index 1394cf177b6..687f97c451d 100644 --- a/libffi/src/x86/win64.S +++ b/libffi/src/x86/win64.S @@ -1,8 +1,8 @@ #define LIBFFI_ASM #include <fficonfig.h> #include <ffi.h> - -/* Constants for ffi_call_win64 */ + +/* Constants for ffi_call_win64 */ #define STACK 0 #define PREP_ARGS_FN 32 #define ECIF 40 @@ -12,8 +12,8 @@ #define FN 72 /* ffi_call_win64 (void (*prep_args_fn)(char *, extended_cif *), - extended_cif *ecif, unsigned bytes, unsigned flags, - unsigned *rvalue, void (*fn)()); + extended_cif *ecif, unsigned bytes, unsigned flags, + unsigned *rvalue, void (*fn)()); */ #ifdef _MSC_VER @@ -31,11 +31,11 @@ _TEXT SEGMENT ;;; ;;; It must move the parameters passed in registers to their stack location, ;;; call ffi_closure_win64_inner for the actual work, then return the result. -;;; +;;; ffi_closure_win64 PROC FRAME ;; copy register arguments onto stack test r11, 1 - jne first_is_float + jne first_is_float mov QWORD PTR [rsp+8], rcx jmp second first_is_float: @@ -43,7 +43,7 @@ first_is_float: second: test r11, 2 - jne second_is_float + jne second_is_float mov QWORD PTR [rsp+16], rdx jmp third second_is_float: @@ -51,7 +51,7 @@ second_is_float: third: test r11, 4 - jne third_is_float + jne third_is_float mov QWORD PTR [rsp+24], r8 jmp fourth third_is_float: @@ -59,16 +59,16 @@ third_is_float: fourth: test r11, 8 - jne fourth_is_float + jne fourth_is_float mov QWORD PTR [rsp+32], r9 jmp done fourth_is_float: movlpd QWORD PTR [rsp+32], xmm3 done: - .ALLOCSTACK 40 + .ALLOCSTACK 40 sub rsp, 40 - .ENDPROLOG + .ENDPROLOG mov rcx, rax ; context is first parameter mov rdx, rsp ; stack is second parameter add rdx, 48 ; point to start of arguments @@ -76,23 +76,23 @@ done: call rax ; call the real closure function add rsp, 40 movd xmm0, rax ; If the closure returned a float, - ; ffi_closure_win64_inner wrote it to rax + ; ffi_closure_win64_inner wrote it to rax ret 0 ffi_closure_win64 ENDP ffi_call_win64 PROC FRAME - ;; copy registers onto stack + ;; copy registers onto stack mov QWORD PTR [rsp+32], r9 mov QWORD PTR [rsp+24], r8 mov QWORD PTR [rsp+16], rdx mov QWORD PTR [rsp+8], rcx - .PUSHREG rbp + .PUSHREG rbp push rbp - .ALLOCSTACK 48 + .ALLOCSTACK 48 sub rsp, 48 ; 00000030H - .SETFRAME rbp, 32 + .SETFRAME rbp, 32 lea rbp, QWORD PTR [rsp+32] - .ENDPROLOG + .ENDPROLOG mov eax, DWORD PTR CIF_BYTES[rbp] add rax, 15 @@ -209,20 +209,45 @@ ret_float$: ret_double$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_DOUBLE - jne SHORT ret_sint64$ + jne SHORT ret_uint64$ mov rax, QWORD PTR RVALUE[rbp] movlpd QWORD PTR [rax], xmm0 jmp SHORT ret_void$ +ret_uint64$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_UINT64 + jne SHORT ret_sint64$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + ret_sint64$: cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_SINT64 - jne ret_void$ + jne SHORT ret_pointer$ mov rcx, QWORD PTR RVALUE[rbp] mov QWORD PTR [rcx], rax jmp SHORT ret_void$ - + +ret_pointer$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_POINTER + jne SHORT ret_int$ + + mov rcx, QWORD PTR RVALUE[rbp] + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + +ret_int$: + cmp DWORD PTR CIF_FLAGS[rbp], FFI_TYPE_INT + jne SHORT ret_void$ + + mov rcx, QWORD PTR RVALUE[rbp] + cdqe + mov QWORD PTR [rcx], rax + jmp SHORT ret_void$ + ret_void$: xor rax, rax @@ -252,13 +277,14 @@ END # # It must move the parameters passed in registers to their stack location, # call ffi_closure_win64_inner for the actual work, then return the result. -# +# .balign 16 - .globl SYMBOL_NAME(ffi_closure_win64) + .globl SYMBOL_NAME(ffi_closure_win64) + .seh_proc SYMBOL_NAME(ffi_closure_win64) SYMBOL_NAME(ffi_closure_win64): # copy register arguments onto stack test $1,%r11 - jne .Lfirst_is_float + jne .Lfirst_is_float mov %rcx, 8(%rsp) jmp .Lsecond .Lfirst_is_float: @@ -266,7 +292,7 @@ SYMBOL_NAME(ffi_closure_win64): .Lsecond: test $2, %r11 - jne .Lsecond_is_float + jne .Lsecond_is_float mov %rdx, 16(%rsp) jmp .Lthird .Lsecond_is_float: @@ -274,7 +300,7 @@ SYMBOL_NAME(ffi_closure_win64): .Lthird: test $4, %r11 - jne .Lthird_is_float + jne .Lthird_is_float mov %r8,24(%rsp) jmp .Lfourth .Lthird_is_float: @@ -282,16 +308,16 @@ SYMBOL_NAME(ffi_closure_win64): .Lfourth: test $8, %r11 - jne .Lfourth_is_float + jne .Lfourth_is_float mov %r9, 32(%rsp) jmp .Ldone .Lfourth_is_float: movlpd %xmm3, 32(%rsp) .Ldone: -#.ALLOCSTACK 40 + .seh_stackalloc 40 sub $40, %rsp -#.ENDPROLOG + .seh_endprologue mov %rax, %rcx # context is first parameter mov %rsp, %rdx # stack is second parameter add $48, %rdx # point to start of arguments @@ -299,25 +325,26 @@ SYMBOL_NAME(ffi_closure_win64): callq *%rax # call the real closure function add $40, %rsp movq %rax, %xmm0 # If the closure returned a float, - # ffi_closure_win64_inner wrote it to rax + # ffi_closure_win64_inner wrote it to rax retq -.ffi_closure_win64_end: + .seh_endproc .balign 16 - .globl SYMBOL_NAME(ffi_call_win64) + .globl SYMBOL_NAME(ffi_call_win64) + .seh_proc SYMBOL_NAME(ffi_call_win64) SYMBOL_NAME(ffi_call_win64): - # copy registers onto stack + # copy registers onto stack mov %r9,32(%rsp) mov %r8,24(%rsp) mov %rdx,16(%rsp) mov %rcx,8(%rsp) - #.PUSHREG rbp + .seh_pushreg rbp push %rbp - #.ALLOCSTACK 48 + .seh_stackalloc 48 sub $48,%rsp - #.SETFRAME rbp, 32 + .seh_setframe rbp, 32 lea 32(%rsp),%rbp - #.ENDPROLOG + .seh_endprologue mov CIF_BYTES(%rbp),%eax add $15, %rax @@ -366,15 +393,15 @@ Lch_done: .Lret_struct2b: cmpl $FFI_TYPE_SMALL_STRUCT_2B, CIF_FLAGS(%rbp) jne .Lret_struct1b - + mov RVALUE(%rbp), %rcx mov %ax, (%rcx) jmp .Lret_void - + .Lret_struct1b: cmpl $FFI_TYPE_SMALL_STRUCT_1B, CIF_FLAGS(%rbp) jne .Lret_uint8 - + mov RVALUE(%rbp), %rcx mov %al, (%rcx) jmp .Lret_void @@ -382,45 +409,45 @@ Lch_done: .Lret_uint8: cmpl $FFI_TYPE_UINT8, CIF_FLAGS(%rbp) jne .Lret_sint8 - - mov RVALUE(%rbp), %rcx - movzbq %al, %rax + + mov RVALUE(%rbp), %rcx + movzbq %al, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_sint8: cmpl $FFI_TYPE_SINT8, CIF_FLAGS(%rbp) jne .Lret_uint16 - - mov RVALUE(%rbp), %rcx - movsbq %al, %rax + + mov RVALUE(%rbp), %rcx + movsbq %al, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_uint16: cmpl $FFI_TYPE_UINT16, CIF_FLAGS(%rbp) jne .Lret_sint16 - - mov RVALUE(%rbp), %rcx - movzwq %ax, %rax + + mov RVALUE(%rbp), %rcx + movzwq %ax, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_sint16: cmpl $FFI_TYPE_SINT16, CIF_FLAGS(%rbp) jne .Lret_uint32 - - mov RVALUE(%rbp), %rcx - movswq %ax, %rax + + mov RVALUE(%rbp), %rcx + movswq %ax, %rax movq %rax, (%rcx) jmp .Lret_void .Lret_uint32: cmpl $FFI_TYPE_UINT32, CIF_FLAGS(%rbp) jne .Lret_sint32 - - mov RVALUE(%rbp), %rcx - movl %eax, %eax + + mov RVALUE(%rbp), %rcx + movl %eax, %eax movq %rax, (%rcx) jmp .Lret_void @@ -443,26 +470,51 @@ Lch_done: .Lret_double: cmpl $FFI_TYPE_DOUBLE, CIF_FLAGS(%rbp) - jne .Lret_sint64 + jne .Lret_uint64 mov RVALUE(%rbp), %rax movlpd %xmm0, (%rax) jmp .Lret_void +.Lret_uint64: + cmpl $FFI_TYPE_UINT64, CIF_FLAGS(%rbp) + jne .Lret_sint64 + + mov RVALUE(%rbp), %rcx + mov %rax, (%rcx) + jmp .Lret_void + .Lret_sint64: cmpl $FFI_TYPE_SINT64, CIF_FLAGS(%rbp) - jne .Lret_void + jne .Lret_pointer + + mov RVALUE(%rbp), %rcx + mov %rax, (%rcx) + jmp .Lret_void + +.Lret_pointer: + cmpl $FFI_TYPE_POINTER, CIF_FLAGS(%rbp) + jne .Lret_int mov RVALUE(%rbp), %rcx mov %rax, (%rcx) jmp .Lret_void - + +.Lret_int: + cmpl $FFI_TYPE_INT, CIF_FLAGS(%rbp) + jne .Lret_void + + mov RVALUE(%rbp), %rcx + cltq + movq %rax, (%rcx) + jmp .Lret_void + .Lret_void: xor %rax, %rax lea 16(%rbp), %rsp pop %rbp retq -.ffi_call_win64_end: + .seh_endproc #endif /* !_MSC_VER */ |