[PATCH] Fix ColdFire support for GCC 3.4 in libgloss
J. Johnston
jjohnstn@redhat.com
Wed Oct 15 10:11:00 GMT 2003
Bernardo,
I'm afraid I can't accept this change as-is. The problem is that gcc code is
under the GPL license and newlib does not accept GPL licensed contributions. If
you want to make your own set of macros based on your "observations of gcc" or
if you were to copy from a BSD-licensed source, that would be fine, but to copy
the macros (plus/minus comments) directly from the gcc code is not.
I would also like to see any such replacement macros placed into a header
file included by the two files rather than copied multiple times.
-- Jeff J.
Bernardo Innocenti wrote:
> Hello,
>
> this patch is required to build libgloss for ColdFire with
> GCC 3.4. It takes care of two changes:
>
> - The __m5200__ predefine is now only present for 52xx ColdFire
> processors. __mcoldfire__ has to be used instead.
>
> - PIC code is now supported on m68k-uclinux and multilibbed versions of
> libgloss need to handle this.
>
> The GAS macros used here are copied over from gcc/config/m68k/lb1sf68.asm.
> I think trying to share this code is not worth the effort. Also, not all
> the macros are used in both sources, but I've left all them for
> consistency.
>
> Please commit this patch to CVS for me if it looks OK. I have no write
> access to sources.redhat.com yet.
>
>
> 2003-10-12 Bernardo Innocenti <bernie@develer.com>
>
> * m68k/crt0.S: Add -fPIC, -msep-data and -mid-shared-library support.
> * m68k/sim-crt0.S: Likewise.
>
> diff -u -3 -p -u -p -r1.1 crt0.S
> --- m68k/crt0.S 17 Mar 2000 22:48:50 -0000 1.1
> +++ m68k/crt0.S 12 Oct 2003 01:57:45 -0000
> @@ -16,6 +16,75 @@
>
> #include "asm.h"
>
> +/* 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__ */
> +
> +
> .title "crt0.S for m68k-coff"
> #define STACKSIZE 0x4000
>
> @@ -84,7 +153,7 @@ SYM (start):
> subql IMM(1), d0
> 2:
> clrb (a0)+
> -#ifndef __mcf5200__
> +#if !defined(__mcoldfire__) && !defined(__mcf5200__)
> dbra d0, 2b
> clrw d0
> subql IMM(1), d0
> @@ -100,13 +169,13 @@ SYM (start):
> * initialize target specific stuff. Only execute these
> * functions it they exist.
> */
> - lea SYM (hardware_init_hook), a0
> + PICLEA SYM (hardware_init_hook), a0
> cmpl IMM(0),a0
> jbeq 4f
> jsr (a0)
> 4:
>
> - lea SYM (software_init_hook), a0
> + PICLEA SYM (software_init_hook), a0
> cmpl IMM(0),a0
> jbeq 5f
> jsr (a0)
> @@ -121,18 +190,18 @@ SYM (start):
> #ifdef ADD_DTORS
> /* put __do_global_dtors in the atexit list so the destructors get
> run */
> movel IMM (SYM(__do_global_dtors)),(sp)
> - jsr SYM (atexit)
> + PICCALL SYM (atexit)
> #endif
> movel IMM (__FINI_SECTION__),(sp)
> - jsr SYM (atexit)
> + PICCALL SYM (atexit)
>
> - jsr __INIT_SECTION__
> + PICCALL __INIT_SECTION__
>
> pea 0
> - pea SYM (environ)
> + PICPEA SYM (environ),a0
> pea sp@(4)
> pea 0
> - jsr SYM (main)
> + PICCALL SYM (main)
> movel d0, sp@-
>
> /*
> @@ -140,4 +209,4 @@ SYM (start):
> * control back to the ROM monitor, if there is one. This calls the
> * exit() from the C library so the C++ tables get cleaned up right.
> */
> - jsr SYM (exit)
> + PICCALL SYM (exit)
> diff -u -3 -p -u -p -r1.1 sim-crt0.S
> --- m68k/sim-crt0.S 28 Feb 2001 18:41:57 -0000 1.1
> +++ m68k/sim-crt0.S 12 Oct 2003 01:57:46 -0000
> @@ -16,6 +16,75 @@
>
> #include "asm.h"
>
> +/* 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__ */
> +
> +
> .title "crt0.S for m68k-coff"
> #define STACKSIZE 0x4000
>
> @@ -78,7 +147,7 @@ SYM (start):
> subql IMM(1), d0
> 2:
> clrb (a0)+
> -#ifndef __mcf5200__
> +#if !defined(__mcoldfire__) && !defined(__mcf5200__)
> dbra d0, 2b
> clrw d0
> subql IMM(1), d0
> @@ -99,18 +168,18 @@ SYM (start):
> #ifdef ADD_DTORS
> /* put __do_global_dtors in the atexit list so the destructors get
> run */
> movel IMM (SYM(__do_global_dtors)),(sp)
> - jsr SYM (atexit)
> + PICCALL SYM (atexit)
> #endif
> movel IMM (__FINI_SECTION__),(sp)
> - jsr SYM (atexit)
> + PICCALL SYM (atexit)
>
> - jsr __INIT_SECTION__
> + PICCALL __INIT_SECTION__
>
> pea 0
> - pea SYM (environ)
> + PICPEA SYM (environ),a0
> pea sp@(4)
> pea 0
> - jsr SYM (main)
> + PICCALL SYM (main)
> movel d0, sp@-
>
> /*
> @@ -118,4 +187,4 @@ SYM (start):
> * control back to the ROM monitor, if there is one. This calls the
> * exit() from the C library so the C++ tables get cleaned up right.
> */
> - jsr SYM (exit)
> + PICCALL SYM (exit)
>
More information about the Newlib
mailing list