Date: Tue, 9 Feb 2010 17:29:05 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r203709 - in projects/ppc64: contrib/gcc/config/rs6000 gnu/usr.bin/cc gnu/usr.bin/gdb lib/csu/powerpc64 lib/libc/powerpc64/sys rescue/rescue usr.sbin/named Message-ID: <201002091729.o19HT5C4033212@svn.freebsd.org>
index | next in thread | raw e-mail
Author: nwhitehorn Date: Tue Feb 9 17:29:04 2010 New Revision: 203709 URL: http://svn.freebsd.org/changeset/base/203709 Log: Modify CRT generation such that the linker can automatically split up large executables into multiple TOC sections and modify libc to be able to handle this. This eliminates the need for the -mminimal-toc hacks in large programs like gcc and named. Discussed with: Alan Modra <amodra at gmail dot com> Modified: projects/ppc64/contrib/gcc/config/rs6000/freebsd.h projects/ppc64/gnu/usr.bin/cc/Makefile.tgt projects/ppc64/gnu/usr.bin/gdb/Makefile.inc projects/ppc64/lib/csu/powerpc64/crti.S projects/ppc64/lib/csu/powerpc64/crtn.S projects/ppc64/lib/libc/powerpc64/sys/brk.S projects/ppc64/lib/libc/powerpc64/sys/sbrk.S projects/ppc64/lib/libc/powerpc64/sys/setlogin.S projects/ppc64/rescue/rescue/Makefile projects/ppc64/usr.sbin/named/Makefile Modified: projects/ppc64/contrib/gcc/config/rs6000/freebsd.h ============================================================================== --- projects/ppc64/contrib/gcc/config/rs6000/freebsd.h Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/contrib/gcc/config/rs6000/freebsd.h Tue Feb 9 17:29:04 2010 (r203709) @@ -151,3 +151,16 @@ /* Override rs6000.h definition. */ #undef ASM_APP_OFF #define ASM_APP_OFF "#NO_APP\n" + +/* _init and _fini functions are built from bits spread across many + object files, each potentially with a different TOC pointer. For + that reason, place a nop after the call so that the linker can + restore the TOC pointer if a TOC adjusting call stub is needed. */ +#ifdef __powerpc64__ +#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \ + asm (SECTION_OP "\n" \ +" bl ." #FUNC "\n" \ +" nop\n" \ +" .previous"); +#endif + Modified: projects/ppc64/gnu/usr.bin/cc/Makefile.tgt ============================================================================== --- projects/ppc64/gnu/usr.bin/cc/Makefile.tgt Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/gnu/usr.bin/cc/Makefile.tgt Tue Feb 9 17:29:04 2010 (r203709) @@ -22,6 +22,3 @@ TARGET_CPU_DEFAULT= TARGET_CPU_ultraspar TARGET_CPU_DEFAULT= \"powerpc64\" .endif -.if ${MACHINE_ARCH} == "powerpc64" -CFLAGS+= -mminimal-toc -.endif Modified: projects/ppc64/gnu/usr.bin/gdb/Makefile.inc ============================================================================== --- projects/ppc64/gnu/usr.bin/gdb/Makefile.inc Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/gnu/usr.bin/gdb/Makefile.inc Tue Feb 9 17:29:04 2010 (r203709) @@ -38,10 +38,6 @@ CFLAGS+= -I${CNTRB_GDB}/include CFLAGS+= -I${CNTRB_BU}/include CFLAGS+= -I${CNTRB_BU}/bfd -.if ${MACHINE_ARCH} == "powerpc64" -CFLAGS+= -mminimal-toc -.endif - GENSRCS+= nm.h tm.h .if defined(GDB_CROSS_DEBUGGER) Modified: projects/ppc64/lib/csu/powerpc64/crti.S ============================================================================== --- projects/ppc64/lib/csu/powerpc64/crti.S Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/lib/csu/powerpc64/crti.S Tue Feb 9 17:29:04 2010 (r203709) @@ -38,10 +38,7 @@ _init: ._init: stdu 1,-48(1) mflr 0 - std 31,40(1) std 0,64(1) - mr 31,1 - .section .fini,"ax",@progbits .align 2 @@ -58,10 +55,7 @@ _fini: ._fini: stdu 1,-48(1) mflr 0 - std 31,40(1) std 0,64(1) - mr 31,1 - .section .rodata .ascii "$FreeBSD: projects/ppc64/lib/csu/powerpc/crti.S 96632 2002-05-15 04:19:49Z obrien $\0" Modified: projects/ppc64/lib/csu/powerpc64/crtn.S ============================================================================== --- projects/ppc64/lib/csu/powerpc64/crtn.S Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/lib/csu/powerpc64/crtn.S Tue Feb 9 17:29:04 2010 (r203709) @@ -24,20 +24,16 @@ */ .section .init,"ax",@progbits - ld 11,0(1) - ld 0,16(11) + ld %r1,0(%r1) + ld 0,16(%r1) mtlr 0 - ld 31,-8(11) - mr 1,11 blr .section .fini,"ax",@progbits - ld 11,0(1) - ld 0,16(11) + ld %r1,0(%r1) + ld 0,16(%r1) mtlr 0 - ld 31,-8(11) - mr 1,11 blr Modified: projects/ppc64/lib/libc/powerpc64/sys/brk.S ============================================================================== --- projects/ppc64/lib/libc/powerpc64/sys/brk.S Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/lib/libc/powerpc64/sys/brk.S Tue Feb 9 17:29:04 2010 (r203709) @@ -41,7 +41,8 @@ HIDENAME(minbrk): .text ENTRY(brk) - ld %r5,HIDENAME(minbrk)@got(%r2) + addis %r5,%r2,HIDENAME(minbrk)@toc@ha + ld %r5,HIDENAME(minbrk)@toc@l(%r5) ld %r6,0(%r5) cmpld %r6,%r3 /* if (minbrk <= r3) */ bgt 0f @@ -51,8 +52,12 @@ ENTRY(brk) li %r0,SYS_break sc /* assume, that r5 is kept */ bso 1f - ld %r7,HIDENAME(curbrk)@got(%r2) /* record new break */ + + /* record new break */ + addis %r7,%r2,HIDENAME(curbrk)@toc@ha + ld %r7,HIDENAME(curbrk)@toc@l(%r7) std %r6,0(%r7) + blr /* return 0 */ 1: Modified: projects/ppc64/lib/libc/powerpc64/sys/sbrk.S ============================================================================== --- projects/ppc64/lib/libc/powerpc64/sys/sbrk.S Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/lib/libc/powerpc64/sys/sbrk.S Tue Feb 9 17:29:04 2010 (r203709) @@ -39,7 +39,8 @@ HIDENAME(curbrk): .text ENTRY(sbrk) - ld %r5,HIDENAME(curbrk)@got(%r2) + addis %r5,%r2,HIDENAME(curbrk)@toc@ha + ld %r5,HIDENAME(curbrk)@toc@l(%r5) ld %r6,0(%r5) /* r6 = old break */ cmpdi %r3,0 /* sbrk(0) - return curbrk */ beq 1f Modified: projects/ppc64/lib/libc/powerpc64/sys/setlogin.S ============================================================================== --- projects/ppc64/lib/libc/powerpc64/sys/setlogin.S Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/lib/libc/powerpc64/sys/setlogin.S Tue Feb 9 17:29:04 2010 (r203709) @@ -33,7 +33,8 @@ __FBSDID("$FreeBSD$"); .globl CNAME(_logname_valid) /* in _getlogin() */ SYSCALL(setlogin) - ld %r4,CNAME(_logname_valid)@got(%r2) + addis %r4,%r2,CNAME(_logname_valid)@toc@ha + ld %r4,CNAME(_logname_valid)@toc@l(%r4) li %r5,%r0 std %r5,0(%r4) blr Modified: projects/ppc64/rescue/rescue/Makefile ============================================================================== --- projects/ppc64/rescue/rescue/Makefile Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/rescue/rescue/Makefile Tue Feb 9 17:29:04 2010 (r203709) @@ -47,11 +47,7 @@ CLEANFILES+= dhclient_FIXED # Define Makefile variable RESCUE CRUNCH_BUILDOPTS+= -DRESCUE # Define compile-time RESCUE symbol when compiling components -.if ${MACHINE_ARCH} == powerpc64 -CRUNCH_BUILDOPTS+= CRUNCH_CFLAGS=\"-DRESCUE -mminimal-toc\" -.else CRUNCH_BUILDOPTS+= CRUNCH_CFLAGS=-DRESCUE -.endif # An experiment that failed: try overriding bsd.lib.mk and bsd.prog.mk # rather than incorporating rescue-specific logic into standard files. Modified: projects/ppc64/usr.sbin/named/Makefile ============================================================================== --- projects/ppc64/usr.sbin/named/Makefile Tue Feb 9 17:20:00 2010 (r203708) +++ projects/ppc64/usr.sbin/named/Makefile Tue Feb 9 17:29:04 2010 (r203709) @@ -48,10 +48,6 @@ CFLAGS+= -DCONFIGARGS="\"${CONFIGARGS}\" CFLAGS+= -I${SRCDIR}/unix/include -I${SRCDIR}/include -I${LIB_BIND_DIR} CFLAGS+= -I${BIND_DIR}/lib/isc/${ISC_ATOMIC_ARCH}/include -.if ${MACHINE_ARCH} == powerpc64 -CFLAGS+= -mminimal-toc -.endif - # Remove the date stamp to make it more obvious when real changes happen CFLAGS+= -U__DATE__help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002091729.o19HT5C4033212>
