diff options
-rw-r--r-- | libgloss/ChangeLog | 8 | ||||
-rw-r--r-- | libgloss/m68k/asm.h | 69 | ||||
-rw-r--r-- | libgloss/m68k/crt0.S | 18 | ||||
-rw-r--r-- | libgloss/m68k/sim-crt0.S | 14 |
4 files changed, 93 insertions, 16 deletions
diff --git a/libgloss/ChangeLog b/libgloss/ChangeLog index 9027a2c43..512945753 100644 --- a/libgloss/ChangeLog +++ b/libgloss/ChangeLog @@ -1,3 +1,11 @@ +2003-10-27 Bernardo Innocenti <bernie@develer.com> + + * m68k/asm.h: Add macros for -fPIC, -msep-data and + -mid-shared-library support. + * m68k/crt0.S: Use macros for -fPIC, -msep-data and + -mid-shared-library support. + * m68k/sim-crt0.S: Likewise. + 2003-10-15 Bernardo Innocenti <bernie@develer.com> * m68k/sim-funcs.c (_XOPEN_SOURCE): Define to get the pid_t diff --git a/libgloss/m68k/asm.h b/libgloss/m68k/asm.h index 035024a3f..e3413858a 100644 --- a/libgloss/m68k/asm.h +++ b/libgloss/m68k/asm.h @@ -83,3 +83,72 @@ #define fpcr REG (fpcr) #define fpsr REG (fpsr) #define fpi REG (fpi) + +/* 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__ */ + diff --git a/libgloss/m68k/crt0.S b/libgloss/m68k/crt0.S index cb7848157..321b97f03 100644 --- a/libgloss/m68k/crt0.S +++ b/libgloss/m68k/crt0.S @@ -84,7 +84,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 +100,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 +121,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 +140,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 --git a/libgloss/m68k/sim-crt0.S b/libgloss/m68k/sim-crt0.S index bc255142c..49f77778c 100644 --- a/libgloss/m68k/sim-crt0.S +++ b/libgloss/m68k/sim-crt0.S @@ -78,7 +78,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 +99,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 +118,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) |