https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80759
--- Comment #49 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot Uni-Bielefeld.DE> --- > --- Comment #47 from Daniel Santos <daniel.santos at pobox dot com> --- [...] > I'm sorry for the delay again. I've been having some health problems > infringing upon my hacking time. No worries at all: don't even think about this stuff before you're well again! > I wanted to study the use of __USER_LABEL_PREFIX__ to make sure I understand > the implications. I'm not completely clear on rather or not this is > automatically applied when a back end uses gen_rtx_SYMBOL_REF (or some such), > but guess is that it is. It is also plausible to omit Darwin support for now, That's my understanding as well. > as I've learned that 64-bit Wine isn't yet working for Darwin either. If > there > are further problems, then that might be the smartest way to go since I don't > have access to such a machine witch which I can test, experiment, debug, etc. > But if this does the trick, then all the better. We're getting considerably closer with this latest patch. I'll describe the current issues below; maybe some of them are issues even beyond Darwin. > I changed the C() macro to ASMNAME() just because I prefer helpful names and I > decided to yank out all of the FUNC_BEGIN/FUNC_END macros from ms-sysv.c and > just use #if directives directly in the string definition. There's no sense > in > maintaining a separate set of asm support macros dealing in strings when > there's only one use site. Fine with me. The new names are certainly more expressive, while I'd just ripped the definitions out of libffi to see if I could something working that way at all. > I also noticed a possible "gotcha" with the #if __x86_64__ and __SSE2__ -- not > that I would expect necessarily expect it to happen. I'm not sure this is even possible... > In hopes of making your review easier, below is a delta between this new (v6) > patch set and your last posted patches. The new patch works fine for me on both x86_64-pc-linux-gnu (as expected) and i386-pc-solaris2.12. On x86_64-apple-darwin11.4.2, there are a couple of isues, some of which I'd already resolved before you posted the revised patch. * Initially all tests SEGVed like this (e.g. with -p0 and compiled with -O2): Program received signal SIGSEGV, Segmentation fault. 0x000000010004664d in regs_to_mem () 1: x/i $pc => 0x10004664d <regs_to_mem>: movaps %xmm6,(%rax) (gdb) where #0 0x000000010004664d in regs_to_mem () #1 0x00000001000465df in do_test_body () #2 0x000000010002f227 in do_tests_0000 () #3 0x00000001000468e3 in main () Here, %rax is 0x0. This happens because some setup happens between do_test_body0 and do_test_body, and do_test_aligned jumps directly to do_test_body: .globl _do_test_body0 .no_dead_strip _do_test_body0 _do_test_body0: movq _test_data@GOTPCREL(%rip), %rax .globl _do_test_body _do_test_body: # Save registers. lea (%rax), %rax call _regs_to_mem By that jump, you bypass the setup of %rax and make the test FAIL. I managed to avoid this by changing the jmp to do_test_body0 instead. This gets me past this failure, and works on Linux/x86_64, too. However, this makes the tests FAIL on Solaris/x86, supposedly due to the -fomit-frame-pointer/-fno-omit-frame-pointer difference (though I haven't looked more closely). * With the do_test_body0 jump, I hit the next issue on Darwin with -O0: the test SEGVs here: Program received signal SIGSEGV, Segmentation fault. 0x0000000100031c4e in do_test_body0 () at /vol/gcc/src/hg/trunk/solaris/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.c:163 163 __asm__ ("\n" 1: x/i $pc => 0x100031c4e <do_test_body0+21>: mov %rax,0x2a8(%rdi) (gdb) where (gdb) p/x $rdi $1 = 0x5dc3340b214ef45c which is no wonder since %rdi got clobbered just before. Here's the assembler output: .globl _do_test_body0 .no_dead_strip _do_test_body0 _do_test_body0: pushq %rbp movq %rsp, %rbp movq _test_data@GOTPCREL(%rip), %rax movq _test_data@GOTPCREL(%rip), %rdx movq _test_data@GOTPCREL(%rip), %rcx movq _test_data@GOTPCREL(%rip), %rsi movq _test_data@GOTPCREL(%rip), %rdi .globl _do_test_body _do_test_body: # Save registers. lea (%rax), %rax call _regs_to_mem # Load registers with random data. lea 224(%rdx), %rax call _mem_to_regs # Save original return address. pop %rax movq %rax, 680(%rdi) # Call the test function call *672(%rsi) # Restore the original return address. movq 680(%rdi), %rcx push %rcx By clobbering %rdi (and %rsi), you cause the SEGV above. To work around this, I've wrapped the save/restore of those regs in !__APPLE__ which gets me a bit further. * Now I hit another SEGV here: Program received signal SIGSEGV, Segmentation fault. 0x0000000100001922 in msabi_00_0 () at /var/gcc/regression/trunk/10.7-gcc/build/gcc/testsuite/gcc/ms-sysv/ms-sysv-generated.h:16 16 { 1: x/i $pc => 0x100001922 <msabi_00_0+13>: movaps %xmm6,(%rsp) (gdb) where #0 0x0000000100001922 in msabi_00_0 () at /var/gcc/regression/trunk/10.7-gcc/build/gcc/testsuite/gcc/ms-sysv/ms-sysv-generated.h:16 #1 0x0000000100031c77 in do_test_body0 () at /vol/gcc/src/hg/trunk/solaris/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/ms-sysv.c:163 Cannot access memory at address 0x6fdc16ba5f5f46bc At this point I gave up for now... Here's the snippet I've been using to get that far: diff --git a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S --- a/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S +++ b/gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/do-test.S @@ -69,8 +69,10 @@ FUNC_BEGIN(regs_to_mem) MOVAPS %xmm13, 0x70(%rax) MOVAPS %xmm14, 0x80(%rax) MOVAPS %xmm15, 0x90(%rax) +#ifndef __APPLE__ mov %rsi, 0xa0(%rax) mov %rdi, 0xa8(%rax) +#endif mov %rbx, 0xb0(%rax) mov %rbp, 0xb8(%rax) mov %r12, 0xc0(%rax) @@ -91,8 +93,10 @@ FUNC_BEGIN(mem_to_regs) MOVAPS 0x70(%rax),%xmm13 MOVAPS 0x80(%rax),%xmm14 MOVAPS 0x90(%rax),%xmm15 +#ifndef __APPLE__ mov 0xa0(%rax),%rsi mov 0xa8(%rax),%rdi +#endif mov 0xb0(%rax),%rbx mov 0xb8(%rax),%rbp mov 0xc0(%rax),%r12 @@ -121,7 +125,11 @@ FUNC_BEGIN(do_test_aligned) int $3 # Stack not aligned L0: popf +#ifdef __APPLE__ + jmp ASMNAME(do_test_body0) +#else jmp ASMNAME(do_test_body) +#endif FUNC_END(do_test_aligned) FUNC_END(do_test_unaligned) Rainer