This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[m68k] Add uClinux-specific code generation options (version 2)



Add -msep-data and -mid-shared-library support for uClinux. These are two special PIC variants that allow executing linux applications in ROM filesystems without loading an additional copy in memory (XIP).

With -msep-data, references to global data are made through register
A5 which is loaded with a pointer to the start of the data/bss
segment allocated in RAM.

The -mid-shared-library option allows using a special shared
library flavour that allows allocationg a distinct data/bss section
for each process without the need to relocate code in both library
and application.

This version of the patch incorporates the following changes since
the last submission:

- Remove CPP_SPEC changes, already present in TARGET_CPU_CPP_BUILTINS;

- Move common code for call and call_value insns to m68k.c;

- Use GAS macros instead of preprocessor macros in lb1sf68.asm;

- Refactor m68k_library_id_string usage to make code smaller & cleaner.


(based on uClinux patches for GCC 2.95.3 by Paul Dale <pauli@snapgear.com>)



2003-08-21 Bernardo Innocenti <bernie@develer.com> Paul Dale <pauli@snapgear.com>

* config/m68k/lb1sf68.asm: Add __PIC__ and __ID_SHARED_LIBRARY__
support. * config/m68k/m68k-none.h (ASM_SPEC): Pass --pcrel to assembler on
-fpic, -fPIC, -msep-data and -mid-shared-library.
* config/m68k/m68k.c (m68k_library_id_string): New global variable.
* config/m68k/m68k.c (override_options): Add -msep-data and
-mshared-library-id support.
* config/m68k/m68k.c (m68k_output_function_prologue): Generate code
to load A5 for TARGET_ID_SHARED_LIBRARY and TARGET_SEP_DATA.
* config/m68k/m68k.c (m68k_output_mi_thunk): Emit indirect jump
on TARGET_ID_SHARED_LIBRARY.
* config/m68k/m68k.c (m68k_output_pic_call): New function.
gcc/config/m68k/m68k.h (TARGET_SEP_DATA): New target flag.
gcc/config/m68k/m68k.h (TARGET_ID_SHARED_LIBRARY): Ditto.
gcc/config/m68k/m68k.h (TARGET_SWITCHES): Add switches for
-mid-shared-library and -msep-data.
gcc/config/m68k/m68k.md (call): Call m68k_output_pic_call().
gcc/config/m68k/m68k.md (call_value): Likewise.


diff -Nru gcc-3.4-20030910.orig/gcc/config/m68k/lb1sf68.asm gcc-3.4-20030910/gcc/config/m68k/lb1sf68.asm
--- gcc-3.4-20030910.orig/gcc/config/m68k/lb1sf68.asm	2003-09-16 02:41:11.000000000 +0200
+++ gcc-3.4-20030910/gcc/config/m68k/lb1sf68.asm	2003-09-16 03:24:45.000000000 +0200
@@ -86,6 +86,76 @@
#define a6 REG (a6)
#define fp REG (fp)
#define sp REG (sp)
+#define pc REG (pc)
+
+/* Provide a few macros to allow for PIC code support.
+ * With PIC, data is stored A5 relative so we've got to take a bit of special
+ * care to ensure that all loads of global data is via A5.  PIC also requires
+ * jumps and subroutine calls to be PC relative rather than absolute.  We cheat
+ * a little on this and in the PIC case, we use short offset branches and
+ * hope that the final object code is within range (which it should be).
+ */
+#ifndef __PIC__
+
+	/* Non PIC (absolute/relocatable) versions */
+
+	.macro PICCALL addr
+	jbsr	\addr
+	.endm
+
+	.macro PICJUMP addr
+	jmp	\addr
+	.endm
+
+	.macro PICLEA sym, reg
+	lea	\sym, \reg
+	.endm
+
+	.macro PICPEA sym, areg
+	pea	\sym
+	.endm
+
+#else /* !__PIC__ */
+
+	/* Common for -mid-shared-libary and -msep-data */
+
+	.macro PICCALL addr
+	bsr	\addr
+	.endm
+
+	.macro PICJUMP addr
+	bra	\addr
+	.endm
+
+# if defined(__ID_SHARED_LIBRARY__)
+
+	/* -mid-shared-library versions  */
+
+	.macro PICLEA sym, reg
+	movel	a5@(_current_shared_library_a5_offset_), \reg
+	movel	\sym@GOT(\reg), \reg
+	.endm
+
+	.macro PICPEA sym, areg
+	movel	a5@(_current_shared_library_a5_offset_), \areg
+	movel	\sym@GOT(\areg), sp@-
+	.endm
+
+# else /* !__ID_SHARED_LIBRARY__ */
+
+	/* Versions for -msep-data */
+
+	.macro PICLEA sym, reg
+	movel	\sym@GOT(a5), \reg
+	.endm
+
+	.macro PICPEA sym, areg
+	movel	\sym@GOT(a5), sp@-
+	.endm
+
+# endif /* !__ID_SHARED_LIBRARY__ */
+#endif /* !__PIC__ */
+

#ifdef L_floatex

@@ -213,7 +283,7 @@

| void __clear_sticky_bits(void);
SYM (__clear_sticky_bit):		
-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
#ifndef __mcoldfire__
	movew	IMM (0),a0@(STICK)
#else
@@ -246,7 +316,7 @@
FPTRAP = 15

$_exception_handler:
-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
	movew	d7,a0@(EBITS)	| set __exception_bits
#ifndef __mcoldfire__
	orw	d7,a0@(STICK)	| and __sticky_bits
@@ -282,7 +352,7 @@
	andl	d6,d7
#endif
	beq	1f		| no, exit
-	pea	SYM (_fpCCR)	| yes, push address of _fpCCR
+	PICPEA	SYM (_fpCCR),a1	| yes, push address of _fpCCR
	trap	IMM (FPTRAP)	| and trap
#ifndef __mcoldfire__
1:	moveml	sp@+,d2-d7	| restore data registers
@@ -421,7 +491,7 @@

L2:	movel	d1, sp@-
	movel	d0, sp@-
-	jbsr	SYM (__udivsi3)	/* divide abs(dividend) by abs(divisor) */
+	PICCALL	SYM (__udivsi3)	/* divide abs(dividend) by abs(divisor) */
	addql	IMM (8), sp

	tstb	d2
@@ -441,13 +511,13 @@
	movel	sp@(4), d0	/* d0 = dividend */
	movel	d1, sp@-
	movel	d0, sp@-
-	jbsr	SYM (__udivsi3)
+	PICCALL	SYM (__udivsi3)
	addql	IMM (8), sp
	movel	sp@(8), d1	/* d1 = divisor */
#ifndef __mcoldfire__
	movel	d1, sp@-
	movel	d0, sp@-
-	jbsr	SYM (__mulsi3)	/* d0 = (a/b)*b */
+	PICCALL	SYM (__mulsi3)	/* d0 = (a/b)*b */
	addql	IMM (8), sp
#else
	mulsl	d1,d0
@@ -467,13 +537,13 @@
	movel	sp@(4), d0	/* d0 = dividend */
	movel	d1, sp@-
	movel	d0, sp@-
-	jbsr	SYM (__divsi3)
+	PICCALL	SYM (__divsi3)
	addql	IMM (8), sp
	movel	sp@(8), d1	/* d1 = divisor */
#ifndef __mcoldfire__
	movel	d1, sp@-
	movel	d0, sp@-
-	jbsr	SYM (__mulsi3)	/* d0 = (a/b)*b */
+	PICCALL	SYM (__mulsi3)	/* d0 = (a/b)*b */
	addql	IMM (8), sp
#else
	mulsl	d1,d0
@@ -540,7 +610,7 @@
	orl	d7,d0
	movew	IMM (INEXACT_RESULT+UNDERFLOW),d7
	moveq	IMM (DOUBLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

Ld$infty:
Ld$overflow:
@@ -550,7 +620,7 @@
	orl	d7,d0
	movew	IMM (INEXACT_RESULT+OVERFLOW),d7
	moveq	IMM (DOUBLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

Ld$underflow:
| Return 0 and set the exception flags @@ -558,7 +628,7 @@
movel d0,d1
movew IMM (INEXACT_RESULT+UNDERFLOW),d7
moveq IMM (DOUBLE_FLOAT),d6
- jmp $_exception_handler
+ PICJUMP $_exception_handler


Ld$inop:
| Return a quiet NaN and set the exception flags
@@ -566,7 +636,7 @@
	movel	d0,d1
	movew	IMM (INEXACT_RESULT+INVALID_OPERATION),d7
	moveq	IMM (DOUBLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

Ld$div$0:
| Return a properly signed INFINITY and set the exception flags
@@ -575,7 +645,7 @@
	orl	d7,d0
	movew	IMM (INEXACT_RESULT+DIVIDE_BY_ZERO),d7
	moveq	IMM (DOUBLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

|=============================================================================
|=============================================================================
@@ -1015,8 +1085,8 @@
	addl	IMM (1),d4
#endif
1:
-	lea	Ladddf$5,a0	| to return from rounding routine
-	lea	SYM (_fpCCR),a1	| check the rounding mode
+	lea	pc@(Ladddf$5),a0 | to return from rounding routine
+	PICLEA	SYM (_fpCCR),a1	| check the rounding mode
#ifdef __mcoldfire__
	clrl	d6
#endif
@@ -1123,8 +1193,8 @@
	addl	IMM (1),d4
#endif
1:
-	lea	Lsubdf$1,a0	| to return from rounding routine
-	lea	SYM (_fpCCR),a1	| check the rounding mode
+	lea	pc@(Lsubdf$1),a0 | to return from rounding routine
+	PICLEA	SYM (_fpCCR),a1	| check the rounding mode
#ifdef __mcoldfire__
	clrl	d6
#endif
@@ -1168,7 +1238,7 @@
#endif
	movel	a6@(16),d0
	movel	a6@(20),d1
-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7	| restore data registers
@@ -1190,7 +1260,7 @@
#endif
	movel	a6@(8),d0
	movel	a6@(12),d1
-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7	| restore data registers
@@ -1248,7 +1318,7 @@

Ladddf$ret:
| Normal exit.
- lea SYM (_fpCCR),a0
+ PICLEA SYM (_fpCCR),a0
movew IMM (0),a0@
orl d7,d0 | put sign bit back
#ifndef __mcoldfire__
@@ -1610,7 +1680,7 @@
bclr IMM (31),d2 | clear sign bit
1: cmpl IMM (0x7ff00000),d2 | check for non-finiteness
bge Ld$inop | in case NaN or +/-INFINITY return NaN
- lea SYM (_fpCCR),a0
+ PICLEA SYM (_fpCCR),a0
movew IMM (0),a0@
#ifndef __mcoldfire__
moveml sp@+,d2-d7
@@ -1895,7 +1965,7 @@
bne Ld$inop |
1: movel IMM (0),d0 | else return zero
movel d0,d1 | - lea SYM (_fpCCR),a0 | clear exception flags
+ PICLEA SYM (_fpCCR),a0 | clear exception flags
movew IMM (0),a0@ |
#ifndef __mcoldfire__
moveml sp@+,d2-d7 | @@ -2035,8 +2105,8 @@
orl d7,d3 | the bits which were flushed right
movel a0,d7 | get back sign bit into d7
| Now call the rounding routine (which takes care of denormalized numbers):
- lea Lround$0,a0 | to return from rounding routine
- lea SYM (_fpCCR),a1 | check the rounding mode
+ lea pc@(Lround$0),a0 | to return from rounding routine
+ PICLEA SYM (_fpCCR),a1 | check the rounding mode
#ifdef __mcoldfire__
clrl d6
#endif
@@ -2084,7 +2154,7 @@
swap d0 |
orl d7,d0 | and sign also


-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7
@@ -2126,7 +2196,7 @@
	movel	d0,d7		| else get sign and return INFINITY
	andl	IMM (0x80000000),d7
	bra	Ld$infty		
-1:	lea	SYM (_fpCCR),a0
+1:	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7
@@ -2424,7 +2494,7 @@
	orl	d7,d0
	movew	IMM (INEXACT_RESULT+UNDERFLOW),d7
	moveq	IMM (SINGLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

Lf$infty:
Lf$overflow:
@@ -2433,21 +2503,21 @@
	orl	d7,d0
	movew	IMM (INEXACT_RESULT+OVERFLOW),d7
	moveq	IMM (SINGLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

Lf$underflow:
| Return 0 and set the exception flags movel IMM (0),d0
movew IMM (INEXACT_RESULT+UNDERFLOW),d7
moveq IMM (SINGLE_FLOAT),d6
- jmp $_exception_handler
+ PICJUMP $_exception_handler


Lf$inop:
| Return a quiet NaN and set the exception flags
	movel	IMM (QUIET_NaN),d0
	movew	IMM (INEXACT_RESULT+INVALID_OPERATION),d7
	moveq	IMM (SINGLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

Lf$div$0:
| Return a properly signed INFINITY and set the exception flags
@@ -2455,7 +2525,7 @@
	orl	d7,d0
	movew	IMM (INEXACT_RESULT+DIVIDE_BY_ZERO),d7
	moveq	IMM (SINGLE_FLOAT),d6
-	jmp	$_exception_handler
+	PICJUMP	$_exception_handler

|=============================================================================
|=============================================================================
@@ -2737,8 +2807,8 @@
#endif
	addl	IMM (1),d2
1:
-	lea	Laddsf$4,a0	| to return from rounding routine
-	lea	SYM (_fpCCR),a1	| check the rounding mode
+	lea	pc@(Laddsf$4),a0 | to return from rounding routine
+	PICLEA	SYM (_fpCCR),a1	| check the rounding mode
#ifdef __mcoldfire__
	clrl	d6
#endif
@@ -2802,8 +2872,8 @@
| Note that we do not have to normalize, since in the subtraction bit
| #FLT_MANT_DIG+1 is never set, and denormalized numbers are handled by
| the rounding routines themselves.
-	lea	Lsubsf$1,a0	| to return from rounding routine
-	lea	SYM (_fpCCR),a1	| check the rounding mode
+	lea	pc@(Lsubsf$1),a0 | to return from rounding routine
+	PICLEA	SYM (_fpCCR),a1	| check the rounding mode
#ifdef __mcoldfire__
	clrl	d6
#endif
@@ -2834,7 +2904,7 @@
| check for finiteness or zero).
Laddsf$a$small:
	movel	a6@(12),d0
-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7	| restore data registers
@@ -2848,7 +2918,7 @@

Laddsf$b$small:
movel a6@(8),d0
- lea SYM (_fpCCR),a0
+ PICLEA SYM (_fpCCR),a0
movew IMM (0),a0@
#ifndef __mcoldfire__
moveml sp@+,d2-d7 | restore data registers
@@ -2905,7 +2975,7 @@
Laddsf$ret:
| Normal exit (a and b nonzero, result is not NaN nor +/-infty).
| We have to clear the exception flags (just the exception type).
- lea SYM (_fpCCR),a0
+ PICLEA SYM (_fpCCR),a0
movew IMM (0),a0@
orl d7,d0 | put sign bit
#ifndef __mcoldfire__
@@ -3141,7 +3211,7 @@
1: bclr IMM (31),d1 | clear sign bit cmpl IMM (INFINITY),d1 | and check for a large exponent
bge Lf$inop | if b is +/-INFINITY or NaN return NaN
- lea SYM (_fpCCR),a0 | else return zero
+ PICLEA SYM (_fpCCR),a0 | else return zero
movew IMM (0),a0@ | #ifndef __mcoldfire__
moveml sp@+,d2-d7 | @@ -3341,7 +3411,7 @@
cmpl IMM (INFINITY),d1 | check for NaN
bhi Lf$inop | movel IMM (0),d0 | else return zero
- lea SYM (_fpCCR),a0 |
+ PICLEA SYM (_fpCCR),a0 |
movew IMM (0),a0@ |
#ifndef __mcoldfire__
moveml sp@+,d2-d7 | @@ -3444,8 +3514,8 @@
2: orl d6,d1 | this is a trick so we don't lose '
| the extra bits which were flushed right
| Now call the rounding routine (which takes care of denormalized numbers):
- lea Lround$0,a0 | to return from rounding routine
- lea SYM (_fpCCR),a1 | check the rounding mode
+ lea pc@(Lround$0),a0 | to return from rounding routine
+ PICLEA SYM (_fpCCR),a1 | check the rounding mode
#ifdef __mcoldfire__
clrl d6
#endif
@@ -3493,7 +3563,7 @@
swap d0 |
orl d7,d0 | and sign also


-	lea	SYM (_fpCCR),a0
+	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7
@@ -3534,7 +3604,7 @@
	movel	d0,d7		| else get sign and return INFINITY
	andl	IMM (0x80000000),d7
	bra	Lf$infty		
-1:	lea	SYM (_fpCCR),a0
+1:	PICLEA	SYM (_fpCCR),a0
	movew	IMM (0),a0@
#ifndef __mcoldfire__
	moveml	sp@+,d2-d7
@@ -3742,7 +3812,7 @@
	movl	a6@(16),sp@-
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpdf2)
+	PICCALL	SYM (__cmpdf2)
	unlk	a6
	rts
#endif /* L_eqdf2 */
@@ -3757,7 +3827,7 @@
	movl	a6@(16),sp@-
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpdf2)
+	PICCALL	SYM (__cmpdf2)
	unlk	a6
	rts
#endif /* L_nedf2 */
@@ -3772,7 +3842,7 @@
	movl	a6@(16),sp@-
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpdf2)
+	PICCALL	SYM (__cmpdf2)
	unlk	a6
	rts
#endif /* L_gtdf2 */
@@ -3787,7 +3857,7 @@
	movl	a6@(16),sp@-
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpdf2)
+	PICCALL	SYM (__cmpdf2)
	unlk	a6
	rts
#endif /* L_gedf2 */
@@ -3802,7 +3872,7 @@
	movl	a6@(16),sp@-
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpdf2)
+	PICCALL	SYM (__cmpdf2)
	unlk	a6
	rts
#endif /* L_ltdf2 */
@@ -3817,7 +3887,7 @@
	movl	a6@(16),sp@-
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpdf2)
+	PICCALL	SYM (__cmpdf2)
	unlk	a6
	rts
#endif /* L_ledf2 */
@@ -3833,7 +3903,7 @@
	link	a6,IMM (0)
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpsf2)
+	PICCALL	SYM (__cmpsf2)
	unlk	a6
	rts
#endif /* L_eqsf2 */
@@ -3846,7 +3916,7 @@
	link	a6,IMM (0)
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpsf2)
+	PICCALL	SYM (__cmpsf2)
	unlk	a6
	rts
#endif /* L_nesf2 */
@@ -3859,7 +3929,7 @@
	link	a6,IMM (0)
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpsf2)
+	PICCALL	SYM (__cmpsf2)
	unlk	a6
	rts
#endif /* L_gtsf2 */
@@ -3872,7 +3942,7 @@
	link	a6,IMM (0)
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpsf2)
+	PICCALL	SYM (__cmpsf2)
	unlk	a6
	rts
#endif /* L_gesf2 */
@@ -3885,7 +3955,7 @@
	link	a6,IMM (0)
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpsf2)
+	PICCALL	SYM (__cmpsf2)
	unlk	a6
	rts
#endif /* L_ltsf2 */
@@ -3898,7 +3968,7 @@
	link	a6,IMM (0)
	movl	a6@(12),sp@-
	movl	a6@(8),sp@-
-	jbsr	SYM (__cmpsf2)
+	PICCALL	SYM (__cmpsf2)
	unlk	a6
	rts
#endif /* L_lesf2 */
diff -Nru gcc-3.4-20030910.orig/gcc/config/m68k/m68k-none.h gcc-3.4-20030910/gcc/config/m68k/m68k-none.h
--- gcc-3.4-20030910.orig/gcc/config/m68k/m68k-none.h	2003-09-16 02:41:11.000000000 +0200
+++ gcc-3.4-20030910/gcc/config/m68k/m68k-none.h	2003-09-12 19:34:06.000000000 +0200
@@ -84,6 +84,7 @@
#undef ASM_SPEC
#define ASM_SPEC "\
%{m68851}%{mno-68851}%{m68881}%{mno-68881}%{msoft-float:-mno-68881} %{m68000}%{m68302}%{mc68000}%{m68010}%{m68020}%{mc68020}%{m68030}%{m68040}%{m68020-40:-mc68040} %{m68020-60:-mc68040} %{m68060}%{mcpu32}%{m68332}%{m5200}%{m5206e}%{m528x}%{m5307}%{m5407}%{!mc68000:%{!m68000:%{!m68302:%{!m68010:%{!mc68020:%{!m68020:%{!m68030:%{!m68040:%{!m68020-40:%{!m68020-60:%{!m68060:%{!mcpu32:%{!m68332:%{!m5200:%{!m5206e:%{!m528x:%{!m5307:%{!m5407:%(asm_cpu_default)}}}}}}}}}}}}}}}}}} \
+%{fPIC:--pcrel} %{fpic:--pcrel} %{msep-data:--pcrel} %{mid-shared-library:--pcrel} \
"

/* cc1/cc1plus always receives all the -m flags. If the specs strings above diff -Nru gcc-3.4-20030910.orig/gcc/config/m68k/m68k-protos.h gcc-3.4-20030910/gcc/config/m68k/m68k-protos.h
--- gcc-3.4-20030910.orig/gcc/config/m68k/m68k-protos.h 2003-09-09 08:47:18.000000000 +0200
+++ gcc-3.4-20030910/gcc/config/m68k/m68k-protos.h 2003-09-15 02:44:09.000000000 +0200
@@ -38,6 +38,7 @@
extern const char *output_andsi3 (rtx *);
extern const char *output_iorsi3 (rtx *);
extern const char *output_xorsi3 (rtx *);
+extern void m68k_output_pic_call (rtx dest);
extern void output_dbcc_and_branch (rtx *);
extern int const_uint32_operand (rtx, enum machine_mode);
extern int const_sint32_operand (rtx, enum machine_mode);
diff -Nru gcc-3.4-20030910.orig/gcc/config/m68k/m68k.c gcc-3.4-20030910/gcc/config/m68k/m68k.c
--- gcc-3.4-20030910.orig/gcc/config/m68k/m68k.c 2003-09-16 02:41:11.000000000 +0200
+++ gcc-3.4-20030910/gcc/config/m68k/m68k.c 2003-09-16 03:41:55.000000000 +0200
@@ -96,6 +96,8 @@
const char *m68k_align_jumps_string;
/* Specify power of two alignment used for functions. */
const char *m68k_align_funcs_string;
+/* Specify the identification number of the library being built */
+const char *m68k_library_id_string;


/* Specify power of two alignment used for loops.  */
int m68k_align_loops;
@@ -199,6 +201,39 @@
	m68k_align_loops = i;
    }

+  /* Library identification */
+  if (m68k_library_id_string)
+    {
+      int id;
+
+      if (! TARGET_ID_SHARED_LIBRARY)
+	error ("-mshared-library-id= specified without -mid-shared-library");
+      id = atoi (m68k_library_id_string);
+      if (id < 0 || id > MAX_LIBRARY_ID)
+	error ("-mshared-library-id=%d is not between 0 and %d", id, MAX_LIBRARY_ID);
+
+      /* From now on, m68k_library_id_string will contain the library offset.  */
+      free(m68k_library_id_string);
+      asprintf(&m68k_library_id_string, "%d", (id * -4) - 4);
+    }
+  else
+    /* If TARGET_ID_SHARED_LIBRARY is enabled, this will point to the
+       current library.  */
+    m68k_library_id_string = "_current_shared_library_a5_offset_";
+
+  /* Sanity check to ensure that msep-data and mid-sahred-library are not
+   * both specified together.  Doing so simply doesn't make sense.
+   */
+  if (TARGET_SEP_DATA && TARGET_ID_SHARED_LIBRARY)
+    error ("cannot specify both -msep-data and -mid-shared-library");
+
+  /* If we're generating code for a separate A5 relative data segment,
+   * we've got to enable -fPIC as well.  This might be relaxable to
+   * -fpic but it hasn't been tested properly.
+   */
+  if (TARGET_SEP_DATA || TARGET_ID_SHARED_LIBRARY)
+    flag_pic = 2;
+
  /* Validate -malign-jumps= value, or provide default */
  m68k_align_jumps = def_align;
  if (m68k_align_jumps_string)
@@ -224,7 +259,7 @@

  /* -fPIC uses 32-bit pc-relative displacements, which don't exist
     until the 68020.  */
-  if (! TARGET_68020 && flag_pic == 2)
+  if (!TARGET_68020 && !TARGET_COLDFIRE && (flag_pic == 2))
    error("-fPIC is not currently supported on the 68000 or 68010\n");

  /* ??? A historic way of turning on pic, or is this intended to
@@ -707,18 +742,30 @@
				  -cfa_offset + n_regs++ * 4);
	}
    }
-  if (flag_pic && current_function_uses_pic_offset_table)
+  if (!TARGET_SEP_DATA && flag_pic &&
+      (current_function_uses_pic_offset_table ||
+        (!current_function_is_leaf && TARGET_ID_SHARED_LIBRARY)))
    {
+      if (TARGET_ID_SHARED_LIBRARY)
+	{
+	  asm_fprintf (stream, "\tmovel %s@(%s), %s\n",
+		       reg_names[PIC_OFFSET_TABLE_REGNUM],
+		       m68k_library_id_string,
+		       reg_names[PIC_OFFSET_TABLE_REGNUM]);
+	}
+      else
+	{
#ifdef MOTOROLA
-      asm_fprintf (stream, "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
-		   reg_names[PIC_OFFSET_TABLE_REGNUM]);
+	  asm_fprintf (stream, "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
+		       reg_names[PIC_OFFSET_TABLE_REGNUM]);
#else
-      asm_fprintf (stream, "\tmovel %I%U_GLOBAL_OFFSET_TABLE_, %s\n",
-		   reg_names[PIC_OFFSET_TABLE_REGNUM]);
-      asm_fprintf (stream, "\tlea %Rpc@(0,%s:l),%s\n",
-		   reg_names[PIC_OFFSET_TABLE_REGNUM],
-		   reg_names[PIC_OFFSET_TABLE_REGNUM]);
+	  asm_fprintf (stream, "\tmovel %I%U_GLOBAL_OFFSET_TABLE_, %s\n",
+		       reg_names[PIC_OFFSET_TABLE_REGNUM]);
+	  asm_fprintf (stream, "\tlea %Rpc@(0,%s:l),%s\n",
+		       reg_names[PIC_OFFSET_TABLE_REGNUM],
+		       reg_names[PIC_OFFSET_TABLE_REGNUM]);
#endif
+	}
    }
}

@@ -728,13 +775,11 @@
use_return_insn ()
{
  int regno;
-  bool interrupt_handler;
+  bool interrupt_handler = m68k_interrupt_function_p (current_function_decl);

if (!reload_completed || frame_pointer_needed || get_frame_size () != 0)
return 0;
- interrupt_handler = m68k_interrupt_function_p (current_function_decl);
-
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
if (m68k_save_reg (regno, interrupt_handler))
return 0;
@@ -1129,6 +1174,39 @@
return cc_status.flags & CC_IN_68881;
}


+/* Output a BSR instruction suitable for PIC code. */
+void
+m68k_output_pic_call(rtx dest)
+{
+ const char *out;
+
+ if (!(GET_CODE (dest) == MEM && GET_CODE (XEXP (dest, 0)) == SYMBOL_REF))
+ out = "jsr %0";
+ /* We output a BSR instruction if we've using -fpic or we're building for
+ * a target that supports long branches. If we're building -fPIC on the
+ * 68000, 68010 or ColdFire we generate one of two sequences:
+ * a shorter one that uses a GOT entry or a longer one that doesn't.
+ * We'll use the -Os command-line flag to decide which to generate.
+ * Both sequences take the same time to execute on the ColdFire.
+ */
+ else if (TARGET_PCREL)
+ out = "bsr.l %o0";
+ else if ((flag_pic == 1) || TARGET_68020)
+#ifdef HPUX_ASM
+ out = "bsr.l %0";
+#elif defined(USE_GAS)
+ out = "bsr %0@PLTPC";
+#else
+ out = "bsr.l %0@PLTPC";
+#endif
+ else if (optimize_size || TARGET_ID_SHARED_LIBRARY)
+ out = "move.l %0@GOT(%%a5), %%a1\n\tjsr (%%a1)";
+ else
+ out = "lea %0-.-8,%%a1\n\tjsr 0(%%pc,%%a1)";
+
+ output_asm_insn(out, &dest);
+}
+
/* Output a dbCC; jCC sequence. Note we do not handle the floating point version of this sequence (Fdbcc). We also
do not handle alternative conditions when CC_NO_OVERFLOW is
@@ -3641,7 +3719,7 @@
{
if (TARGET_PCREL)
fmt = "bra.l %o0";
- else
+ else if ((flag_pic == 1) || TARGET_68020)
{
#ifdef MOTOROLA
#ifdef HPUX_ASM
@@ -3661,6 +3739,10 @@
#endif
#endif
}
+ else if (optimize_size || TARGET_ID_SHARED_LIBRARY)
+ fmt = "move.l %0@GOT(%%a5), %%a1\n\tjmp (%%a1)";
+ else
+ fmt = "lea %0-.-8,%%a1\n\tjsr 0(%%pc,%%a1)";
}
else
{
@@ -201,6 +197,18 @@
#define MASK_528x 0x80000
#define TARGET_528x (target_flags & MASK_528x)


+/* Support A5 relative data seperate from text.
+ * This option implies -fPIC, however it inhibits the generation of the
+ * A5 save/restore in functions and the loading of a5 with a got pointer.
+ */
+#define MASK_SEP_DATA	0x100000
+#define TARGET_SEP_DATA (target_flags & MASK_SEP_DATA)
+
+/* Compile using library ID based shared libraries.
+ * Set a specific ID using the -mshared-library-id=xxx option.
+ */
+#define MASK_ID_SHARED_LIBRARY	0x200000
+#define TARGET_ID_SHARED_LIBRARY	(target_flags & MASK_ID_SHARED_LIBRARY)

/* Is the target a coldfire */
#define MASK_COLDFIRE	(MASK_5200|MASK_528x|MASK_CFV3|MASK_CFV4)
@@ -300,6 +308,14 @@
      N_("Align variables on a 32-bit boundary") },			\
    { "no-align-int", -MASK_ALIGN_INT, 					\
      N_("Align variables on a 16-bit boundary") },			\
+    { "sep-data", MASK_SEP_DATA,					\
+      N_("Enable separate data segment") },				\
+    { "no-sep-data", -MASK_SEP_DATA,					\
+      N_("Disable separate data segment") },				\
+    { "id-shared-library", MASK_ID_SHARED_LIBRARY,			\
+      N_("Enable ID based shared library") },				\
+    { "no-id-shared-library", -MASK_ID_SHARED_LIBRARY,			\
+      N_("Disable ID based shared library") },				\
    { "pcrel", MASK_PCREL,						\
      N_("Generate pc-relative code") },				\
    { "strict-align", -MASK_NO_STRICT_ALIGNMENT,			\
@@ -326,6 +342,8 @@
    N_("Jump targets are aligned to this power of 2"), 0},		\
  { "align-functions=",	&m68k_align_funcs_string,			\
    N_("Function starts are aligned to this power of 2"), 0},		\
+  { "shared-library-id=",	&m68k_library_id_string,		\
+    N_("ID of shared library to build"), 0},				\
  SUBTARGET_OPTIONS							\
}

@@ -402,6 +420,9 @@
/* Maximum power of 2 that code can be aligned to.  */
#define MAX_CODE_ALIGN	2			/* 4 byte alignment */

+/* Maximum number of library ids we permit */
+#define MAX_LIBRARY_ID 255
+
/* Align loop starts for optimal branching.  */
#define LOOP_ALIGN(LABEL) (m68k_align_loops)

@@ -1638,6 +1659,7 @@
extern const char *m68k_align_loops_string;
extern const char *m68k_align_jumps_string;
extern const char *m68k_align_funcs_string;
+extern const char *m68k_library_id_string;
extern int m68k_align_loops;
extern int m68k_align_jumps;
extern int m68k_align_funcs;
diff -Nru gcc-3.4-20030910.orig/gcc/config/m68k/m68k.md gcc-3.4-20030910/gcc/config/m68k/m68k.md
--- gcc-3.4-20030910.orig/gcc/config/m68k/m68k.md	2003-09-16 02:41:11.000000000 +0200
+++ gcc-3.4-20030910/gcc/config/m68k/m68k.md	2003-09-15 02:42:35.000000000 +0200
@@ -6796,31 +6796,8 @@

  "flag_pic"
  "*
-  if (GET_CODE (operands[0]) == MEM
-      && GET_CODE (XEXP (operands[0], 0)) == SYMBOL_REF)
-    {
-      if (TARGET_PCREL) return \"bsr.l %o0\";
-#ifdef MOTOROLA
-#ifdef HPUX_ASM
-      return \"bsr.l %0\";
-#else
-#ifdef USE_GAS
-      return \"bsr.l %0@PLTPC\";
-#else
-      return \"bsr %0@PLTPC\";
-#endif
-#endif
-#else
-#ifdef USE_GAS
-      return \"bsr.l %0\";
-#else
-      /* The ',a1' is a dummy argument telling the Sun assembler we want PIC,
-	 GAS just plain ignores it.  FIXME: not anymore, gas doesn't!  */
-      return \"jbsr %0,a1\";
-#endif
-#endif
-    }
-  return \"jsr %0\";
+  m68k_output_pic_call(operands[0]);
+  return \"\";
")

;; Call subroutine, returning value in operand 0
@@ -6861,31 +6838,8 @@
  ;; Operand 2 not really used on the m68000.
  "flag_pic"
  "*
-  if (GET_CODE (operands[1]) == MEM
-      && GET_CODE (XEXP (operands[1], 0)) == SYMBOL_REF)
-    {
-      if (TARGET_PCREL) return \"bsr.l %o1\";
-#ifdef MOTOROLA
-#ifdef HPUX_ASM
-      return \"bsr.l %1\";
-#else
-#ifdef USE_GAS
-      return \"bsr.l %1@PLTPC\";
-#else
-      return \"bsr %1@PLTPC\";
-#endif
-#endif
-#else
-#ifdef USE_GAS
-      return \"bsr.l %1\";
-#else
-      /* The ',a1' is a dummy argument telling the Sun assembler we want PIC
-         GAS just plain ignores it.  FIXME: Not anymore, gas doesn't!  */
-      return \"jbsr %1,a1\";
-#endif
-#endif
-    }
-  return \"jsr %1\";
+  m68k_output_pic_call(operands[1]);
+  return \"\";
")

;; Call subroutine returning any type.

--
 // Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/  http://www.develer.com/

Please don't send Word attachments - http://www.gnu.org/philosophy/no-word-attachments.html




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]