diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2011-07-29 04:09:17 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2011-07-28 21:09:17 -0700 |
commit | 02a8fe00b562ef74f504e32dd2371dfe2e288c69 (patch) | |
tree | b316a55b1d6f43e5ae37241b51034ae22879ddf5 /libgcc | |
parent | 154516d9d2011112deeb5becd98819d63397b2b1 (diff) | |
download | gcc-02a8fe00b562ef74f504e32dd2371dfe2e288c69.zip gcc-02a8fe00b562ef74f504e32dd2371dfe2e288c69.tar.gz gcc-02a8fe00b562ef74f504e32dd2371dfe2e288c69.tar.bz2 |
Add x32 support to config/i386/morestack.S.
2011-07-28 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/morestack.S (X86_64_SAVE_NEW_STACK_BOUNDARY): New.
Use X86_64_SAVE_NEW_STACK_BOUNDARY to save the new stack boundary
for x86-64. Properly check __x86_64__ and __LP64__.
From-SVN: r176912
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 6 | ||||
-rw-r--r-- | libgcc/config/i386/morestack.S | 22 |
2 files changed, 20 insertions, 8 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 99235b7..d0b6d7d 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-28 H.J. Lu <hongjiu.lu@intel.com> + + * config/i386/morestack.S (X86_64_SAVE_NEW_STACK_BOUNDARY): New. + Use X86_64_SAVE_NEW_STACK_BOUNDARY to save the new stack boundary + for x86-64. Properly check __x86_64__ and __LP64__. + 2010-07-28 H.J. Lu <hongjiu.lu@intel.com> * config/i386/64/sfp-machine.h (_FP_W_TYPE): Always use _WIN64 diff --git a/libgcc/config/i386/morestack.S b/libgcc/config/i386/morestack.S index 16279c7..b09ac76 100644 --- a/libgcc/config/i386/morestack.S +++ b/libgcc/config/i386/morestack.S @@ -353,7 +353,13 @@ __morestack: # FIXME: The offset must match # TARGET_THREAD_SPLIT_STACK_OFFSET in # gcc/config/i386/linux64.h. - movq %rax,%fs:0x70 # Save the new stack boundary. + # Macro to save the new stack boundary. +#ifdef __LP64__ +#define X86_64_SAVE_NEW_STACK_BOUNDARY(reg) movq %r##reg,%fs:0x70 +#else +#define X86_64_SAVE_NEW_STACK_BOUNDARY(reg) movl %e##reg,%fs:0x40 +#endif + X86_64_SAVE_NEW_STACK_BOUNDARY (ax) call __morestack_unblock_signals @@ -391,7 +397,7 @@ __morestack: subq 0(%rsp),%rax # Subtract available space. addq $BACKOFF,%rax # Back off 1024 bytes. .LEHE0: - movq %rax,%fs:0x70 # Save the new stack boundary. + X86_64_SAVE_NEW_STACK_BOUNDARY (ax) addq $16,%rsp # Remove values from stack. @@ -433,7 +439,7 @@ __morestack: movq %rbp,%rcx # Get the stack pointer. subq %rax,%rcx # Subtract available space. addq $BACKOFF,%rcx # Back off 1024 bytes. - movq %rcx,%fs:0x70 # Save new stack boundary. + X86_64_SAVE_NEW_STACK_BOUNDARY (cx) movq (%rsp),%rdi # Restore exception data for call. #ifdef __PIC__ call _Unwind_Resume@PLT # Resume unwinding. @@ -493,7 +499,7 @@ __x86.get_pc_thunk.bx: .section .data.DW.ref.__gcc_personality_v0,"awG",@progbits,DW.ref.__gcc_personality_v0,comdat .type DW.ref.__gcc_personality_v0, @object DW.ref.__gcc_personality_v0: -#ifndef __x86_64 +#ifndef __LP64__ .align 4 .size DW.ref.__gcc_personality_v0, 4 .long __gcc_personality_v0 @@ -504,7 +510,7 @@ DW.ref.__gcc_personality_v0: #endif #endif -#ifdef __x86_64__ +#if defined __x86_64__ && defined __LP64__ # This entry point is used for the large model. With this entry point # the upper 32 bits of %r10 hold the argument size and the lower 32 @@ -537,7 +543,7 @@ __morestack_large_model: .size __morestack_large_model, . - __morestack_large_model #endif -#endif /* __x86_64__ */ +#endif /* __x86_64__ && __LP64__ */ # Initialize the stack test value when the program starts or when a # new thread starts. We don't know how large the main stack is, so we @@ -570,7 +576,7 @@ __stack_split_initialize: #else /* defined(__x86_64__) */ leaq -16000(%rsp),%rax # We should have at least 16K. - movq %rax,%fs:0x70 + X86_64_SAVE_NEW_STACK_BOUNDARY (ax) movq %rsp,%rdi movq $16000,%rsi #ifdef __PIC__ @@ -592,7 +598,7 @@ __stack_split_initialize: .section .ctors.65535,"aw",@progbits -#ifndef __x86_64__ +#ifndef __LP64__ .align 4 .long __stack_split_initialize .long __morestack_load_mmap |