Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2003-10-27 23:03:10 +0300
committerJeff Johnston <jjohnstn@redhat.com>2003-10-27 23:03:10 +0300
commitbfe5ae413f342eb424ff2f812a2f4fbf1a992135 (patch)
tree34f1b62e7e3d48ea434872d5e60b4f251c6f1b35 /libgloss/m68k
parent56a4ceac3dcc1247239862db270688a6ca6ed2a2 (diff)
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.
Diffstat (limited to 'libgloss/m68k')
-rw-r--r--libgloss/m68k/asm.h69
-rw-r--r--libgloss/m68k/crt0.S18
-rw-r--r--libgloss/m68k/sim-crt0.S14
3 files changed, 85 insertions, 16 deletions
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)