summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/sh/bits/machine-gmon.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/sh/bits/machine-gmon.h')
-rw-r--r--libc/sysdeps/linux/sh/bits/machine-gmon.h101
1 files changed, 76 insertions, 25 deletions
diff --git a/libc/sysdeps/linux/sh/bits/machine-gmon.h b/libc/sysdeps/linux/sh/bits/machine-gmon.h
index 46c7b191a..6497859ad 100644
--- a/libc/sysdeps/linux/sh/bits/machine-gmon.h
+++ b/libc/sysdeps/linux/sh/bits/machine-gmon.h
@@ -1,32 +1,83 @@
/* Machine-dependent definitions for profiling support. SH version.
- Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
+ *
+ * Copyright (C) 2003 Stefan Allius <allius@atecom.com>
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, write to the Free
+ * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ * 02111-1307 USA
+ */
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
-
-/* We must not pollute the global namespace. */
#define mcount_internal __mcount_internal
-void mcount_internal (u_long frompc, u_long selfpc);
-
#define _MCOUNT_DECL(frompc, selfpc) \
-void mcount_internal (u_long frompc, u_long selfpc)
-
+static void __attribute__((unused)) mcount_internal (u_long frompc, u_long selfpc)
-/* Define MCOUNT as empty since we have the implementation in another
- file. */
-#define MCOUNT
+/*
+ * This mcount implementation expect the 'frompc' return address on
+ * the stack and the 'selfpc' return address in register pr.
+ *
+ * Your compiler should include some stuff like this at each function
+ * entry:
+ *
+ * mov.l 1f,r1
+ * sts.l pr,@-r15
+ * mova 2f,r0
+ * jmp @r1
+ * lds r0,pr
+ * .align 2
+ * 1: .long mcount
+ * 2: lds.l @r15+,pr
+ *
+ * or for PIC:
+ *
+ * mov.l 3f,r1
+ * mova 3f,r0
+ * add r1,r0
+ * mov.l 1f,r1
+ * mov.l @(r0,r1),r1
+ * sts.l pr,@-r15
+ * mova 2f,r0
+ * jmp @r1
+ * lds r0,pr
+ * .align 2
+ * 1: .long mcount@GOT
+ * 3: .long _GLOBAL_OFFSET_TABLE_
+ * 2: lds.l @r15+,pr
+ *
+ *
+ * This ABI will be supported by GCC version 3.3 or newer!
+ */
+#define MCOUNT asm(\
+ ".align 4\n\t" \
+ ".globl _mcount\n\t" \
+ ".type _mcount,@function\n" \
+ "_mcount:\n\t" \
+ "mov.l r4, @-r15\n\t" \
+ "mov.l r5, @-r15\n\t" \
+ "mov.l r6, @-r15\n\t" \
+ "mov.l r7, @-r15\n\t" \
+ "sts.l pr, @-r15\n\t" \
+ "sts pr, r5\n\t" \
+ "bsr __mcount_internal\n\t" \
+ " mov.l @(5*4,r15), r4\n\t" \
+ "lds.l @r15+, pr\n\t" \
+ "mov.l @r15+, r7\n\t" \
+ "mov.l @r15+, r6\n\t" \
+ "mov.l @r15+, r5\n\t" \
+ "rts\n\t" \
+ " mov.l @r15+, r4\n\t" \
+ ".size _mcount,.-_mcount;\n\t" \
+ ".weak mcount;\n\t" \
+ " mcount = _mcount;");