summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/m68k/m68k_pic.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/m68k/m68k_pic.S')
-rw-r--r--libc/sysdeps/linux/m68k/m68k_pic.S64
1 files changed, 64 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/m68k/m68k_pic.S b/libc/sysdeps/linux/m68k/m68k_pic.S
new file mode 100644
index 000000000..e01e33b83
--- /dev/null
+++ b/libc/sysdeps/linux/m68k/m68k_pic.S
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2006 CodeSourcery Inc
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ *
+ * This file defines some m68k assembly macros for handling the differences
+ * between PIC and non-PIC.
+ */
+#include <features.h>
+
+ /* When assembling code for shared flat libraries, this is nonzero
+ * if %a5 points the current library's GOT. */
+ .equ have_current_got, 0
+
+ /* Perform the equivalent of "<op> <target>", where <target> is
+ * a text address. <tmp> is available as a temporary address
+ * register. */
+ .macro DO_TEXT op,target,tmp
+#if defined __HAVE_SHARED_FLAT__
+ .ifne have_current_got
+ move.l \target@GOT(%a5),\tmp
+ .else
+ move.l _current_shared_library_a5_offset_(%a5),\tmp
+ move.l \target@GOT(\tmp),\tmp
+ .endif
+ \op (\tmp)
+#elif defined __PIC__
+ lea \target-.-8,\tmp
+ \op (%pc,\tmp)
+#else
+ \op \target
+#endif
+ .endm
+
+ /* Do "pea <target>" when <target> is a text address.
+ * <tmp> is available as a temporary register. */
+ .macro PEA_TEXT target,tmp
+ DO_TEXT pea,\target,\tmp
+ .endm
+
+ /* Likewise jsr. */
+ .macro CALL target,tmp
+ DO_TEXT jsr,\target,\tmp
+ .endm
+
+ /* Likewise jmp. */
+ .macro JUMP target,tmp
+ DO_TEXT jmp,\target,\tmp
+ .endm
+
+ /* Initialize the global pointer, if functions need to do that. */
+ .macro INIT_GP
+#if defined __HAVE_SHARED_FLAT__
+ move.l %a5,-(%sp)
+ move.l _current_shared_library_a5_offset_(%a5),%a5
+#endif
+ .endm
+
+ /* Undo the effects of INIT_GP. */
+ .macro FINI_GP
+#if defined __HAVE_SHARED_FLAT__
+ move.l (%sp)+,%a5
+#endif
+ .endm