diff options
author | Stafford Horne <shorne@gmail.com> | 2021-10-20 06:47:26 +0900 |
---|---|---|
committer | Stafford Horne <shorne@gmail.com> | 2022-01-05 06:40:05 +0900 |
commit | 6e5964311d57c017ed0af3d87095e54805f2541e (patch) | |
tree | 4051701820df33ddd05c3451f88b475b8f5dbdfc /sysdeps/or1k/sysdep.h | |
parent | 9dde3a24f132090fa8f88d6eaa2bc4c48f2e942f (diff) | |
download | glibc-6e5964311d57c017ed0af3d87095e54805f2541e.zip glibc-6e5964311d57c017ed0af3d87095e54805f2541e.tar.gz glibc-6e5964311d57c017ed0af3d87095e54805f2541e.tar.bz2 |
or1k: ABI Implementation
This code deals with the OpenRISC ABI.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/or1k/sysdep.h')
-rw-r--r-- | sysdeps/or1k/sysdep.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/sysdeps/or1k/sysdep.h b/sysdeps/or1k/sysdep.h new file mode 100644 index 0000000..14e5dce --- /dev/null +++ b/sysdeps/or1k/sysdep.h @@ -0,0 +1,80 @@ +/* Assembler macro definitions. OpenRISC version. + Copyright (C) 2022 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 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, see + <https://www.gnu.org/licenses/>. */ + +#include <sysdeps/generic/sysdep.h> +#include <features.h> + +#if defined __ASSEMBLER__ || defined REQUEST_ASSEMBLER_MACROS + +/* Make use of .size directive. */ +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name; + +/* Define an entry point visible from C. */ +#define ENTRY(name) \ + .globl C_SYMBOL_NAME(name); \ + .type C_SYMBOL_NAME(name),@function; \ + .align 4; \ + C_LABEL(name) \ + cfi_startproc; \ + CALL_MCOUNT + +#undef END +#define END(name) \ + cfi_endproc; \ + ASM_SIZE_DIRECTIVE(name) + +/* 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 + +/* If compiled for profiling, call `mcount' at the start of each function. */ +#ifdef PROF +# ifdef __PIC__ +# define CALL_MCOUNT \ + l.addi r1, r1, -8; \ + l.sw 0(r1), r9; \ + l.sw 4(r1), r3; \ + l.ori r3, r9, 0; \ + l.j plt(_mcount); \ + l.nop; \ + l.lwz r9, 0(r1); \ + l.lwz r3, 4(r1); \ + l.addi r1, r1, 8; +# else +# define CALL_MCOUNT \ + l.addi r1, r1, -8; \ + l.sw 0(r1), r9; \ + l.sw 4(r1), r3; \ + l.ori r3, r9, 0; \ + l.movhi r15, hi(_mcount); \ + l.ori r15, r15, lo(_mcount); \ + l.jr r15; \ + l.nop; \ + l.lwz r9, 0(r1); \ + l.lwz r3, 4(r1); \ + l.addi r1, r1, 8; +# endif +#else +# define CALL_MCOUNT /* Do nothing. */ +#endif + +/* Local label name for asm code. */ +#define L(name) .L##name + +#endif /* __ASSEMBLER__ */ |