update boehm-gc for powerpc m64 darwin.

boehm-gc:

	* powerpc_darwin_mach_dep.s:  Update for m64.  Add eh frames.
	Do not build or use the picsymbol stub for Darwin >= 9.
	* tests/test.c (reverse_test):  Modify count for ppc64-darwin.
	* pthread_support.c (GC_get_thread_stack_base): Correct a debug
	statement.

From-SVN: r167681
This commit is contained in:
Iain Sandoe 2010-12-10 10:09:10 +00:00
parent ec3e9f8267
commit 48f854c788
4 changed files with 132 additions and 36 deletions

View File

@ -1,3 +1,11 @@
2010-12-10 Iain Sandoe <iains@gcc.gnu.org>
* powerpc_darwin_mach_dep.s: Update for m64. Add eh frames.
Do not build or use the picsymbol stub for Darwin >= 9.
* tests/test.c (reverse_test): Modify count for ppc64-darwin.
* pthread_support.c (GC_get_thread_stack_base): Correct a debug
statement.
2010-11-29 Iain Sandoe <iains@gcc.gnu.org>
Mike Stump <mrs@gcc.gnu.org>

View File

@ -4,11 +4,37 @@
#define MODE_CHOICE(x, y) x
#endif
#define lgu MODE_CHOICE(lwzu, ldu)
#define machine_choice MODE_CHOICE(ppc7400,ppc64)
#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
; Define some pseudo-opcodes for size-independent load & store of GPRs ...
#define lgu MODE_CHOICE(lwzu, ldu)
#define lg MODE_CHOICE(lwz,ld)
#define sg MODE_CHOICE(stw,std)
#define sgu MODE_CHOICE(stwu,stdu)
#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
; ... and the size of GPRs and their storage indicator.
#define GPR_BYTES MODE_CHOICE(4,8)
#define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
#define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
#define LINKAGE_SIZE MODE_CHOICE(24,48)
#define PARAM_AREA MODE_CHOICE(32,64)
#define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */
; The whole stack frame **MUST** be 16byte-aligned.
#define SAVE_SIZE (LINKAGE_SIZE+PARAM_AREA)
#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
; We no longer need the pic symbol stub for Darwin >= 9.
#define BLGCP1 _GC_push_one
#undef WANT_STUB
#else
#define BLGCP1 L_GC_push_one$stub
#define WANT_STUB
#endif
.machine machine_choice
; GC_push_regs function. Under some optimization levels GCC will clobber
; some of the non-volatile registers before we get a chance to save them
@ -21,61 +47,116 @@ _GC_push_regs:
; Prolog
mflr r0
stw r0,8(r1)
stwu r1,-80(r1)
sg r0,SAVED_LR_OFFSET(r1)
sgu r1,-SAVE_SIZE(r1)
; Push r13-r31
L_body:
; 'Push' r13-r31
mr r3,r13
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r14
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r15
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r16
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r17
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r18
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r19
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r20
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r21
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r22
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r23
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r24
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r25
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r26
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r27
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r28
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r29
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r30
bl L_GC_push_one$stub
bl BLGCP1
mr r3,r31
bl L_GC_push_one$stub
bl BLGCP1
;
lwz r0,88(r1)
addi r1,r1,80
L_epilog:
; Epilog
lg r0,SAVE_SIZE+SAVED_LR_OFFSET(r1)
addi r1,r1,SAVE_SIZE
mtlr r0
; Return
; Return
blr
LFE0:
; PIC stuff, generated by GCC
; eh frames, for those that want 'em.
.data
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
#define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
#define EH_FRAME_OFFSET MODE_CHOICE(0x40,0x70)
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0 ; Length of Common Information Entry
LSCIE1:
.long 0 ; CIE Identifier Tag
.byte 0x1 ; CIE Version
.ascii "zR\0" ; CIE Augmentation
.byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor
.byte EH_DATA_ALIGN_FACT ; sleb128 -4/-8; CIE Data Alignment Factor
.byte 0x41 ; CIE RA Column
.byte 0x1 ; uleb128 0x1; Augmentation size
.byte 0x10 ; FDE Encoding (pcrel)
.byte 0xc ; DW_CFA_def_cfa
.byte 0x1 ; uleb128 0x1
.byte 0 ; uleb128 0
.align LOG2_GPR_BYTES
LECIE1:
.globl _GC_push_regs.eh
_GC_push_regs.eh:
LSFDE1:
.set L$set$1,LEFDE1-LASFDE1
.long L$set$1 ; FDE Length
LASFDE1:
.long LASFDE1-EH_frame1 ; FDE CIE offset
.g_long _GC_push_regs-. ; FDE initial location
.set L$set$2,LFE0-_GC_push_regs
.g_long L$set$2 ; FDE address range
.byte 0 ; uleb128 0; Augmentation size
.byte 0x4 ; DW_CFA_advance_loc4
.set L$set$3,L_body-_GC_push_regs
.long L$set$3
.byte 0xe ; DW_CFA_def_cfa_offset
.byte EH_FRAME_OFFSET ; uleb128 0x40/0x70
.byte 0x11 ; DW_CFA_offset_extended_sf
.byte 0x41 ; uleb128 0x41
.byte 0x7e ; sleb128 -2
.byte 0x4 ; DW_CFA_advance_loc4
.set L$set$4,L_epilog-L_body
.long L$set$4
.byte 0xe ; DW_CFA_def_cfa_offset
.byte 0 ; uleb128 0
.align LOG2_GPR_BYTES
LEFDE1:
.data
#ifdef WANT_STUB
; PIC stub stuff, generated by GCC
.section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
.align LOG2_GPR_BYTES
L_GC_push_one$stub:
.indirect_symbol _GC_push_one
@ -88,8 +169,10 @@ L0$_GC_push_one:
lgu r12,lo16(L_GC_push_one$lazy_ptr-L0$_GC_push_one)(r11)
mtctr r12
bctr
.data
.lazy_symbol_pointer
.data
.lazy_symbol_pointer
L_GC_push_one$lazy_ptr:
.indirect_symbol _GC_push_one
.g_long dyld_stub_binding_helper
#endif

View File

@ -1158,7 +1158,7 @@ GC_PTR GC_get_thread_stack_base()
# else
# ifdef DEBUG_THREADS
GC_printf1("Can not determine stack base for attached thread");
GC_printf0("Can not determine stack base for attached thread");
# endif
return 0;
# endif

View File

@ -624,7 +624,12 @@ void reverse_test()
/* OSF has limited stack space by default, and large frames. */
# define BIG 200
# else
# define BIG 4500
# if defined(__MACH__) && defined(__ppc64__)
/* Small stack and largish frames. */
# define BIG 2500
# else
# define BIG 4500
# endif
# endif
# endif
# endif