about summary refs log tree commit diff
path: root/sysdeps/cris/sysdep.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/cris/sysdep.h')
-rw-r--r--sysdeps/cris/sysdep.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/sysdeps/cris/sysdep.h b/sysdeps/cris/sysdep.h
new file mode 100644
index 0000000000..ada5de350c
--- /dev/null
+++ b/sysdeps/cris/sysdep.h
@@ -0,0 +1,114 @@
+/* Assembler macros for CRIS.
+   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <sysdeps/generic/sysdep.h>
+
+#ifndef HAVE_ELF
+# error ELF is assumed.  Generalize the code and retry.
+#endif
+
+#ifndef NO_UNDERSCORES
+# error User-label prefix (underscore) assumed absent.  Generalize the code and retry.
+#endif
+
+#ifdef	__ASSEMBLER__
+
+/* Syntactic details of assembly-code.  */
+
+/* It is *not* generally true that "ELF uses byte-counts for .align, most
+   others use log2 of count of bytes", like some neighboring configs say.
+   See "align" in gas/read.c which is not overridden by
+   gas/config/obj-elf.c.  It takes a log2 argument.  *Some* targets
+   override it to take a byte argument.  People should read source instead
+   of relying on hearsay.  */
+# define ALIGNARG(log2) log2
+
+# define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
+# define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+/* The non-PIC jump is preferred, since it does not stall, and does not
+   invoke generation of a PLT.  These macros assume that $r0 is set up as
+   GOT register.  */
+# ifdef __PIC__
+#  define PLTJUMP(_x) \
+  add.d	C_SYMBOL_NAME (_x):PLT,$pc
+
+#  define PLTCALL(_x) \
+  move.d C_SYMBOL_NAME (_x):PLTG,$r9			@ \
+  add.d	$r0,$r9						@ \
+  jsr	$r9
+
+#  define SETUP_PIC \
+  push	$r0						@ \
+  move.d $pc,$r0					@ \
+  sub.d	.:GOTOFF,$r0
+
+#  define TEARDOWN_PIC pop $r0
+# else
+#  define PLTJUMP(_x) jump C_SYMBOL_NAME (_x)
+#  define PLTCALL(_x) jsr  C_SYMBOL_NAME (_x)
+#  define SETUP_PIC
+#  define TEARDOWN_PIC
+# endif
+
+/* Define an entry point visible from C.  */
+# define ENTRY(name) \
+  .text							@ \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) 		@ \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function)	@ \
+  .align ALIGNARG (2) 					@ \
+  C_LABEL(name)						@ \
+  CALL_MCOUNT
+
+# undef	END
+# define END(name) \
+  ASM_SIZE_DIRECTIVE (C_SYMBOL_NAME (name))
+
+/* If compiled for profiling, call `mcount' at the start of each function.
+   FIXME: Note that profiling is not actually implemented.  This is just
+   example code which might not even compile, though it is believed to be
+   correct.  */
+# ifdef	PROF
+#  define CALL_MCOUNT \
+  push	$srp						@ \
+  push	$r9						@ \
+  push	$r10						@ \
+  push	$r11						@ \
+  push	$r12						@ \
+  push	$r13						@ \
+  SETUP_PIC						@ \
+  PLTCALL (mcount)					@ \
+  TEARDOWN_PIC						@ \
+  pop	$r13						@ \
+  pop	$r12						@ \
+  pop	$r11						@ \
+  pop	$r10						@ \
+  pop	$r9						@ \
+  pop	$srp
+# else
+#  define CALL_MCOUNT		/* Do nothing.  */
+# endif
+
+/* Since C identifiers are not normally prefixed with an underscore
+   on this system, the asm identifier `syscall_error' intrudes on the
+   C name space.  Make sure we use an innocuous name.  */
+# define syscall_error	__syscall_error
+# define mcount		_mcount
+
+#endif	/* __ASSEMBLER__ */