This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PATCH: Fix config/i386/morestack.S for x32
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org, ian at airs dot com
- Date: Thu, 28 Jul 2011 13:51:43 -0700
- Subject: Re: PATCH: Fix config/i386/morestack.S for x32
- References: <20110728194222.GA16287@intel.com> <4E31C191.6000607@redhat.com>
On Thu, Jul 28, 2011 at 1:07 PM, Richard Henderson <rth@redhat.com> wrote:
> On 07/28/2011 12:42 PM, H.J. Lu wrote:
>> +#ifdef __LP64__
>> ? ? ? movq ? ?%rax,%fs:0x70 ? ? ? ? ? # Save the new stack boundary.
>> +#else
>> + ? ? movl ? ?%eax,%fs:0x40 ? ? ? ? ? # Save the new stack boundary.
>> +#endif
>
> Please macro-ize this.
>
>
Here is is the updated patch. OK for trunk?
Thanks.
--
H.J.
---
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__.
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__.
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