OSDN Git Service

2003-10-27 Bernardo Innocenti <bernie@develer.com>
authorjjohnstn <jjohnstn>
Mon, 27 Oct 2003 20:03:09 +0000 (20:03 +0000)
committerjjohnstn <jjohnstn>
Mon, 27 Oct 2003 20:03:09 +0000 (20:03 +0000)
        * 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.

libgloss/ChangeLog
libgloss/m68k/asm.h
libgloss/m68k/crt0.S
libgloss/m68k/sim-crt0.S

index 9027a2c..5129457 100644 (file)
@@ -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
index 035024a..e341385 100644 (file)
 #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__ */
+
index cb78481..321b97f 100644 (file)
@@ -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)
index bc25514..49f7777 100644 (file)
@@ -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)