diff options
Diffstat (limited to 'libc/sysdeps/linux/sh/bits')
-rw-r--r-- | libc/sysdeps/linux/sh/bits/machine-gmon.h | 101 |
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;"); |