diff options
Diffstat (limited to 'REORG.TODO/sysdeps/sh')
81 files changed, 4710 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/sh/Implies b/REORG.TODO/sysdeps/sh/Implies new file mode 100644 index 0000000000..1fdc53d034 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/Implies @@ -0,0 +1,4 @@ +sh/soft-fp +wordsize-32 +ieee754/flt-32 +ieee754/dbl-64 diff --git a/REORG.TODO/sysdeps/sh/Makefile b/REORG.TODO/sysdeps/sh/Makefile new file mode 100644 index 0000000000..0c6db9a9d4 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/Makefile @@ -0,0 +1,11 @@ +ifeq ($(subdir),csu) +gen-as-const-headers += tcb-offsets.sym +endif + +ifeq ($(subdir),gmon) +sysdep_routines += _mcount +endif + +ifeq ($(subdir),debug) +CFLAGS-backtrace.c += -funwind-tables +endif diff --git a/REORG.TODO/sysdeps/sh/____longjmp_chk.S b/REORG.TODO/sysdeps/sh/____longjmp_chk.S new file mode 100644 index 0000000000..e49c08f027 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/____longjmp_chk.S @@ -0,0 +1,78 @@ +/* Copyright (C) 2009-2017 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 + <http://www.gnu.org/licenses/>. */ + + .section .rodata.str1.1,"aMS",@progbits,1 + .type longjmp_msg,@object +longjmp_msg: + .string "longjmp causes uninitialized stack frame" + .size longjmp_msg, .-longjmp_msg + .text + +#define __longjmp ____longjmp_chk + +#ifdef PIC +# define CALL_FAIL \ + mov.l .Lfail, r1; \ + mov.l .Lstr, r4; \ + mov.l r12, @-r15; \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (r12, 0); \ + mova .Lgot, r0; \ + mov.l .Lgot, r12; \ + add r0, r12; \ + sts.l pr, @-r15; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (pr, 0); \ + bsrf r1; \ + add r12, r4; \ + /* Unreachable. */ \ +.Lfail0: \ + .align 2; \ +.Lgot: \ + .long _GLOBAL_OFFSET_TABLE_; \ +.Lstr: \ + .long longjmp_msg@GOTOFF; \ +.Lfail: \ + .long __GI___fortify_fail@PLT-(.Lfail0-.); \ + cfi_restore_state; +#else +# define CALL_FAIL \ + mov.l .Lfail, r1; \ + mov.l .Lstr, r4; \ + sts.l pr, @-r15; \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (pr, 0); \ + jsr @r1; \ + nop; \ + /* Unreachable. */ \ + .align 2; \ +.Lstr: \ + .long longjmp_msg; \ +.Lfail: \ + .long __fortify_fail; \ + cfi_restore_state; +#endif + +#define CHECK_SP(reg) \ + cmp/hs r15, reg; \ + bt .Lok; \ + CALL_FAIL \ +.Lok: + +#include <__longjmp.S> diff --git a/REORG.TODO/sysdeps/sh/_mcount.S b/REORG.TODO/sysdeps/sh/_mcount.S new file mode 100644 index 0000000000..1deee2ddad --- /dev/null +++ b/REORG.TODO/sysdeps/sh/_mcount.S @@ -0,0 +1,87 @@ +/* Machine-specific calling sequence for `mcount' profiling function. SuperH + Copyright (C) 2001-2017 Free Software Foundation, Inc. + Contributed by NIIBE Yutaka <gniibe@m17n.org> + 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + + .globl C_SYMBOL_NAME(_mcount) + .type C_SYMBOL_NAME(_mcount),@function + cfi_startproc + .align 5 +C_LABEL(_mcount) + /* Save registers. */ + mov.l r4,@-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (r4, 0) + mov.l r5,@-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (r5, 0) + mov.l r6,@-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (r6, 0) + mov.l r7,@-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (r7, 0) + sts.l pr,@-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (pr, 0) + + mov.l @(20,r15),r4 + sts pr,r5 + +#ifdef SHARED + mov.l 0f,r1 + mova 0f,r0 + add r1,r0 + mov.l 1f,r1 + mov.l @(r0,r1),r1 +#else + mov.l 1f,r1 +#endif + jsr @r1 + nop + + /* Pop the saved registers. */ + lds.l @r15+,pr + cfi_adjust_cfa_offset (-4) + cfi_restore (pr) + mov.l @r15+,r7 + cfi_adjust_cfa_offset (-4) + cfi_restore (r7) + mov.l @r15+,r6 + cfi_adjust_cfa_offset (-4) + cfi_restore (r6) + mov.l @r15+,r5 + cfi_adjust_cfa_offset (-4) + cfi_restore (r5) + rts + mov.l @r15+,r4 + /* Omit CFI for restore in delay slot. */ + + .align 2 +#ifdef SHARED +0: .long _GLOBAL_OFFSET_TABLE_ +1: .long C_SYMBOL_NAME(__mcount_internal)@GOT +#else +1: .long C_SYMBOL_NAME(__mcount_internal) +#endif + cfi_endproc +ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount)) + +#undef mcount +weak_alias (_mcount, mcount) diff --git a/REORG.TODO/sysdeps/sh/abort-instr.h b/REORG.TODO/sysdeps/sh/abort-instr.h new file mode 100644 index 0000000000..69381aec8e --- /dev/null +++ b/REORG.TODO/sysdeps/sh/abort-instr.h @@ -0,0 +1,3 @@ +/* An instruction which should crash any program is `sleep'. */ +#define ABORT_INSTRUCTION_ASM sleep +#define ABORT_INSTRUCTION asm ("sleep") diff --git a/REORG.TODO/sysdeps/sh/backtrace.c b/REORG.TODO/sysdeps/sh/backtrace.c new file mode 100644 index 0000000000..4f3eafb09c --- /dev/null +++ b/REORG.TODO/sysdeps/sh/backtrace.c @@ -0,0 +1 @@ +#include "../x86_64/backtrace.c" diff --git a/REORG.TODO/sysdeps/sh/bits/endian.h b/REORG.TODO/sysdeps/sh/bits/endian.h new file mode 100644 index 0000000000..1fef1ff938 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bits/endian.h @@ -0,0 +1,13 @@ +/* SH is bi-endian but with a big-endian FPU. */ + +#ifndef _ENDIAN_H +# error "Never use <bits/endian.h> directly; include <endian.h> instead." +#endif + +#ifdef __LITTLE_ENDIAN__ +#define __BYTE_ORDER __LITTLE_ENDIAN +#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN +#else +#define __BYTE_ORDER __BIG_ENDIAN +#define __FLOAT_WORD_ORDER __BIG_ENDIAN +#endif diff --git a/REORG.TODO/sysdeps/sh/bits/fenv.h b/REORG.TODO/sysdeps/sh/bits/fenv.h new file mode 100644 index 0000000000..a121efb101 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bits/fenv.h @@ -0,0 +1,84 @@ +/* Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _FENV_H +# error "Never use <bits/fenv.h> directly; include <fenv.h> instead." +#endif + + +/* Define bits representing the exception. We use the bit positions + of the appropriate bits in the FPU control word. */ +enum + { + FE_INEXACT = +#define FE_INEXACT 0x04 + FE_INEXACT, + FE_UNDERFLOW = +#define FE_UNDERFLOW 0x08 + FE_UNDERFLOW, + FE_OVERFLOW = +#define FE_OVERFLOW 0x10 + FE_OVERFLOW, + FE_DIVBYZERO = +#define FE_DIVBYZERO 0x20 + FE_DIVBYZERO, + FE_INVALID = +#define FE_INVALID 0x40 + FE_INVALID, + }; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The SH FPU supports two of the four defined rounding modes: round to nearest + and round to zero. We use again the bit positions in the FPU control word + as the values for the appropriate macros. */ +enum + { + __FE_UNDEFINED = -1, + + FE_TONEAREST = +#define FE_TONEAREST 0x0 + FE_TONEAREST, + FE_TOWARDZERO = +#define FE_TOWARDZERO 0x1 + FE_TOWARDZERO, + }; + + +/* Type representing exception flags. */ +typedef unsigned short int fexcept_t; + + +/* Type representing floating-point environment. This function corresponds + to the layout of the block written by the `fstenv'. */ +typedef struct + { + unsigned int __fpscr; + } +fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((const fenv_t *) -1) + +#if __GLIBC_USE (IEC_60559_BFP_EXT) +/* Type representing floating-point control modes. */ +typedef unsigned int femode_t; + +/* Default floating-point control modes. */ +# define FE_DFL_MODE ((const femode_t *) -1L) +#endif diff --git a/REORG.TODO/sysdeps/sh/bits/huge_val.h b/REORG.TODO/sysdeps/sh/bits/huge_val.h new file mode 100644 index 0000000000..aab7a23b17 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bits/huge_val.h @@ -0,0 +1,54 @@ +/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity). + Used by <stdlib.h> and <math.h> functions for overflow. + SH version. + Copyright (C) 1992-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _MATH_H +# error "Never use <bits/huge_val.h> directly; include <math.h> instead." +#endif + +/* IEEE positive infinity (-HUGE_VAL is negative infinity). */ + +#if __GNUC_PREREQ(3,3) +# define HUGE_VAL (__builtin_huge_val()) +#elif __GNUC_PREREQ(2,96) +# define HUGE_VAL (__extension__ 0x1.0p2047) +#elif defined __GNUC__ + +# define HUGE_VAL \ + (__extension__ \ + ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \ + { __l: 0x000000007ff00000ULL }).__d) + +#else /* not GCC */ + +# include <endian.h> + +typedef union { unsigned char __c[8]; double __d; } __huge_val_t; + +# if __BYTE_ORDER == __BIG_ENDIAN +# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 } +# endif +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 } +# endif + +static __huge_val_t __huge_val = { __HUGE_VAL_bytes }; +# define HUGE_VAL (__huge_val.__d) + +#endif /* GCC. */ diff --git a/REORG.TODO/sysdeps/sh/bits/link.h b/REORG.TODO/sysdeps/sh/bits/link.h new file mode 100644 index 0000000000..0427ebc961 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bits/link.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2005-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _LINK_H +# error "Never include <bits/link.h> directly; use <link.h> instead." +#endif + + +/* Registers for entry into PLT on SH. */ +typedef struct La_sh_regs +{ + uint32_t lr_r2; + uint32_t lr_r3; + uint32_t lr_r4; + uint32_t lr_r5; + uint32_t lr_r6; + uint32_t lr_r7; + uint32_t lr_fpscr; + float lr_fr4; + float lr_fr5; + float lr_fr6; + float lr_fr7; + float lr_fr8; + float lr_fr9; + float lr_fr10; + float lr_fr11; +} La_sh_regs; + +/* Return values for calls from PLT on SH. */ +typedef struct La_sh_retval +{ + uint32_t lrv_r0; + uint32_t lrv_r1; + float lrv_fr0; + float lrv_fr1; +} La_sh_retval; + + +__BEGIN_DECLS + +extern Elf32_Addr la_sh_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + La_sh_regs *__regs, + unsigned int *__flags, + const char *__symname, + long int *__framesizep); +extern unsigned int la_sh_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx, + uintptr_t *__refcook, + uintptr_t *__defcook, + const La_sh_regs *__inregs, + La_sh_retval *__outregs, + const char *__symname); + +__END_DECLS diff --git a/REORG.TODO/sysdeps/sh/bits/setjmp.h b/REORG.TODO/sysdeps/sh/bits/setjmp.h new file mode 100644 index 0000000000..11617d7c8a --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bits/setjmp.h @@ -0,0 +1,46 @@ +/* Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +/* Define the machine-dependent type `jmp_buf'. SH version. */ +#ifndef _BITS_SETJMP_H +#define _BITS_SETJMP_H 1 + +#if !defined _SETJMP_H && !defined _PTHREAD_H +# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +#endif + +#ifndef _ASM +typedef struct __jmp_buf_internal_tag + { + /* Callee-saved registers r8 through r15. */ + int __regs[8]; + + /* Program counter. */ + void * __pc; + + /* The global pointer. */ + void * __gbr; + + /* Floating point status register. */ + int __fpscr; + + /* Callee-saved floating point registers fr12 through fr15. */ + int __fpregs[4]; + } __jmp_buf[1]; +#endif + +#endif /* bits/setjmp.h */ diff --git a/REORG.TODO/sysdeps/sh/bsd-_setjmp.S b/REORG.TODO/sysdeps/sh/bsd-_setjmp.S new file mode 100644 index 0000000000..d5d011ec6c --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bsd-_setjmp.S @@ -0,0 +1,51 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. SH version. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 0)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (_setjmp) +#ifdef SHARED + mova 1f, r0 + mov.l 1f, r1 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l 3f, r1 + mov.l @(r0,r1), r1 + jmp @r1 + mov #0, r5 + .align 2 +3: + .long C_SYMBOL_NAME(__sigsetjmp@GOT) +#else + mov.l 1f, r1 + jmp @r1 + mov #0, r5 + .align 2 +1: + .long C_SYMBOL_NAME(__sigsetjmp) +#endif +END (_setjmp) +libc_hidden_def (_setjmp) diff --git a/REORG.TODO/sysdeps/sh/bsd-setjmp.S b/REORG.TODO/sysdeps/sh/bsd-setjmp.S new file mode 100644 index 0000000000..73e4209e73 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/bsd-setjmp.S @@ -0,0 +1,50 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. SH version. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +/* This just does a tail-call to `__sigsetjmp (ARG, 1)'. + We cannot do it in C because it must be a tail-call, so frame-unwinding + in setjmp doesn't clobber the state restored by longjmp. */ + +#include <sysdep.h> + +ENTRY (setjmp) +#ifdef SHARED + mova 1f, r0 + mov.l 1f, r1 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l 3f, r1 + mov.l @(r0,r1), r1 + jmp @r1 + mov #1, r5 + .align 2 +3: + .long C_SYMBOL_NAME(__sigsetjmp@GOT) +#else + mov.l 1f, r1 + jmp @r1 + mov #1, r5 + .align 2 +1: + .long C_SYMBOL_NAME(__sigsetjmp) +#endif +END (setjmp) diff --git a/REORG.TODO/sysdeps/sh/configure b/REORG.TODO/sysdeps/sh/configure new file mode 100644 index 0000000000..110eb65b06 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/configure @@ -0,0 +1,5 @@ +# This file is generated from configure.ac by Autoconf. DO NOT EDIT! + # Local configure fragment for sysdeps/sh. + +$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h + diff --git a/REORG.TODO/sysdeps/sh/configure.ac b/REORG.TODO/sysdeps/sh/configure.ac new file mode 100644 index 0000000000..21400c447d --- /dev/null +++ b/REORG.TODO/sysdeps/sh/configure.ac @@ -0,0 +1,6 @@ +GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. +# Local configure fragment for sysdeps/sh. + +dnl It is always possible to access static and hidden symbols in an +dnl position independent way. +AC_DEFINE(PI_STATIC_AND_HIDDEN) diff --git a/REORG.TODO/sysdeps/sh/crti.S b/REORG.TODO/sysdeps/sh/crti.S new file mode 100644 index 0000000000..d19de956a6 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/crti.S @@ -0,0 +1,120 @@ +/* Special .init and .fini section support for SH. + Copyright (C) 2000-2017 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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 + <http://www.gnu.org/licenses/>. */ + +/* crti.S puts a function prologue at the beginning of the .init and + .fini sections and defines global symbols for those addresses, so + they can be called as functions. The symbols _init and _fini are + magic and cause the linker to emit DT_INIT and DT_FINI. */ + +#include <libc-symbols.h> +#include <sysdep.h> + +#ifndef PREINIT_FUNCTION +# define PREINIT_FUNCTION __gmon_start__ +#endif + +#ifndef PREINIT_FUNCTION_WEAK +# define PREINIT_FUNCTION_WEAK 1 +#endif + +#if PREINIT_FUNCTION_WEAK + weak_extern (PREINIT_FUNCTION) +#else + .hidden PREINIT_FUNCTION +#endif + + .section .init,"ax",@progbits + .align 5 + .global _init + .type _init, @function +_init: + mov.l r12,@-r15 + mova .L12,r0 + mov.l .L12,r12 + mov.l r14,@-r15 + add r0,r12 + sts.l pr,@-r15 +#if PREINIT_FUNCTION_WEAK + mov.l .L13,r0 + mov.l @(r0,r12),r1 + tst r1,r1 + bt/s .L8 + mov r15,r14 + mov.l .L14,r1 + bsrf r1 +.LPCS0: + nop +.L8: +#else + mova .L13,r0 + mov.l .L13,r1 + add r0,r1 + jsr @r1 + mov r15,r14 +#endif + bra 1f + nop + .align 2 +.L12: + .long _GLOBAL_OFFSET_TABLE_ +#if PREINIT_FUNCTION_WEAK +.L13: + .long PREINIT_FUNCTION@GOT +.L14: + .long PREINIT_FUNCTION@PLT-(.LPCS0+2-(.)) +#else +.L13: + .long PREINIT_FUNCTION@PLT +#endif +1: + + .section .fini,"ax",@progbits + .align 5 + .global _fini + .type _fini, @function +_fini: + mov.l r12,@-r15 + mova .L19,r0 + mov.l r14,@-r15 + sts.l pr,@-r15 + mov.l .L19,r12 + mov r15,r14 + add r0,r12 + bra 0f + nop + .align 2 +.L19: + .long _GLOBAL_OFFSET_TABLE_ +0: diff --git a/REORG.TODO/sysdeps/sh/crtn.S b/REORG.TODO/sysdeps/sh/crtn.S new file mode 100644 index 0000000000..128f951e90 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/crtn.S @@ -0,0 +1,53 @@ +/* Special .init and .fini section support for SH. + Copyright (C) 2000-2017 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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 + <http://www.gnu.org/licenses/>. */ + +/* crtn.S puts function epilogues in the .init and .fini sections + corresponding to the prologues in crti.S. */ + + .section .init,"ax",@progbits + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + mov.l @r15+,r12 + rts + nop + + .section .fini,"ax",@progbits + mov r14,r15 + lds.l @r15+,pr + mov.l @r15+,r14 + mov.l @r15+,r12 + rts + nop diff --git a/REORG.TODO/sysdeps/sh/dl-machine.h b/REORG.TODO/sysdeps/sh/dl-machine.h new file mode 100644 index 0000000000..2b468af6fa --- /dev/null +++ b/REORG.TODO/sysdeps/sh/dl-machine.h @@ -0,0 +1,466 @@ +/* Machine-dependent ELF dynamic relocation inline functions. SH version. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef dl_machine_h +#define dl_machine_h + +#define ELF_MACHINE_NAME "SH" + +#include <sys/param.h> +#include <sysdep.h> +#include <assert.h> + +/* Return nonzero iff ELF header is compatible with the running host. */ +static inline int __attribute__ ((unused)) +elf_machine_matches_host (const Elf32_Ehdr *ehdr) +{ + return ehdr->e_machine == EM_SH; +} + + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. */ +static inline Elf32_Addr __attribute__ ((unused)) +elf_machine_dynamic (void) +{ + register Elf32_Addr *got; + asm ("mov r12,%0" :"=r" (got)); + return *got; +} + + +/* Return the run-time load address of the shared object. */ +static inline Elf32_Addr __attribute__ ((unused)) +elf_machine_load_address (void) +{ + Elf32_Addr addr; + asm ("mov.l 1f,r0\n\ + mov.l 3f,r2\n\ + add r12,r2\n\ + mov.l @(r0,r12),r0\n\ + bra 2f\n\ + sub r0,r2\n\ + .align 2\n\ + 1: .long _dl_start@GOT\n\ + 3: .long _dl_start@GOTOFF\n\ + 2: mov r2,%0" + : "=r" (addr) : : "r0", "r1", "r2"); + return addr; +} + + +/* Set up the loaded object described by L so its unrelocated PLT + entries will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int __attribute__ ((unused, always_inline)) +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf32_Addr *got; + extern void _dl_runtime_resolve (Elf32_Word); + extern void _dl_runtime_profile (Elf32_Word); + + if (l->l_info[DT_JMPREL] && lazy) + { + /* The GOT entries for functions in the PLT have not yet been filled + in. Their initial contents will arrange when called to load an + offset into the .rela.plt section and _GLOBAL_OFFSET_TABLE_[1], + and then jump to _GLOBAL_OFFSET_TABLE[2]. */ + got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]); + /* If a library is prelinked but we have to relocate anyway, + we have to be able to undo the prelinking of .got.plt. + The prelinker saved us here address of .plt + 36. */ + if (got[1]) + { + l->l_mach.plt = got[1] + l->l_addr; + l->l_mach.gotplt = (Elf32_Addr) &got[3]; + } + got[1] = (Elf32_Addr) l; /* Identify this shared object. */ + + /* The got[2] entry contains the address of a function which gets + called to get the address of a so far unresolved function and + jump to it. The profiling extension of the dynamic linker allows + to intercept the calls to collect information. In this case we + don't store the address in the GOT so that all future calls also + end in this function. */ + if (profile) + { + got[2] = (Elf32_Addr) &_dl_runtime_profile; + /* Say that we really want profiling and the timers are started. */ + if (GLRO(dl_profile) != NULL + && _dl_name_match_p (GLRO(dl_profile), l)) + GL(dl_profile_map) = l; + } + else + /* This function will get called to fix up the GOT entry indicated by + the offset on the stack, and then jump to the resolved address. */ + got[2] = (Elf32_Addr) &_dl_runtime_resolve; + } + return lazy; +} + +#define ELF_MACHINE_RUNTIME_FIXUP_ARGS int plt_type +#define ELF_MACHINE_RUNTIME_FIXUP_PARAMS plt_type + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ + +#define RTLD_START asm ("\ +.text\n\ +.globl _start\n\ +.globl _dl_start_user\n\ +_start:\n\ + mov r15,r4\n\ + mov.l .L_dl_start,r1\n\ + mova .L_dl_start,r0\n\ + add r1,r0\n\ + jsr @r0\n\ + nop\n\ +_dl_start_user:\n\ + ! Save the user entry point address in r8.\n\ + mov r0,r8\n\ + ! Point r12 at the GOT.\n\ + mov.l 1f,r12\n\ + mova 1f,r0\n\ + bra 2f\n\ + add r0,r12\n\ + .align 2\n\ +1: .long _GLOBAL_OFFSET_TABLE_\n\ +2: ! See if we were run as a command with the executable file\n\ + ! name as an extra leading argument.\n\ + mov.l .L_dl_skip_args,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l @r0,r0\n\ + ! Get the original argument count.\n\ + mov.l @r15,r5\n\ + ! Subtract _dl_skip_args from it.\n\ + sub r0,r5\n\ + ! Adjust the stack pointer to skip _dl_skip_args words.\n\ + shll2 r0\n\ + add r0,r15\n\ + ! Store back the modified argument count.\n\ + mov.l r5,@r15\n\ + ! Compute argv address and envp.\n\ + mov r15,r6\n\ + add #4,r6\n\ + mov r5,r7\n\ + shll2 r7\n\ + add r15,r7\n\ + add #8,r7\n\ + mov.l .L_dl_loaded,r0\n\ + mov.l @(r0,r12),r0\n\ + mov.l @r0,r4\n\ + ! Call _dl_init.\n\ + mov.l .L_dl_init,r1\n\ + mova .L_dl_init,r0\n\ + add r1,r0\n\ + jsr @r0\n\ + nop\n\ +1: ! Pass our finalizer function to the user in r4, as per ELF ABI.\n\ + mov.l .L_dl_fini,r0\n\ + mov.l @(r0,r12),r4\n\ + ! Jump to the user's entry point.\n\ + jmp @r8\n\ + nop\n\ + .align 2\n\ +.L_dl_start:\n\ + .long _dl_start@PLT\n\ +.L_dl_skip_args:\n\ + .long _dl_skip_args@GOT\n\ +.L_dl_init:\n\ + .long _dl_init@PLT\n\ +.L_dl_loaded:\n\ + .long _rtld_local@GOT\n\ +.L_dl_fini:\n\ + .long _dl_fini@GOT\n\ + .type __fpscr_values,@object\n\ + .global __fpscr_values\n\ +__fpscr_values:\n\ + .long 0\n\ + .long 0x80000\n\ + .weak __fpscr_values\n\ +.previous\n\ +"); + +/* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry or + TLS variable, so undefined references should not be allowed to + define the value. + ELF_RTYPE_CLASS_COPY iff TYPE should not be allowed to resolve to one + of the main executable's symbols, as for a COPY reloc. */ +#define elf_machine_type_class(type) \ + ((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \ + || (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \ + * ELF_RTYPE_CLASS_PLT) \ + | (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY)) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT + +/* We define an initialization functions. This is called very early in + _dl_sysdep_start. */ +#define DL_PLATFORM_INIT dl_platform_init () + +static inline void __attribute__ ((unused)) +dl_platform_init (void) +{ + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0') + /* Avoid an empty string which would disturb us. */ + GLRO(dl_platform) = NULL; +} + +static inline Elf32_Addr +elf_machine_fixup_plt (struct link_map *map, lookup_t t, + const Elf32_Rela *reloc, + Elf32_Addr *reloc_addr, Elf32_Addr value) +{ + return *reloc_addr = value; +} + +/* Return the final value of a plt relocation. */ +static inline Elf32_Addr +elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc, + Elf32_Addr value) +{ + return value + reloc->r_addend; +} + +#define ARCH_LA_PLTENTER sh_gnu_pltenter +#define ARCH_LA_PLTEXIT sh_gnu_pltexit + +#endif /* !dl_machine_h */ + +/* SH never uses Elf32_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 +#define ELF_MACHINE_NO_RELA 0 + +#ifdef RESOLVE_MAP + +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +auto inline void +__attribute ((always_inline)) +elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg, int skip_ifunc) +{ + Elf32_Addr *const reloc_addr = reloc_addr_arg; + const unsigned int r_type = ELF32_R_TYPE (reloc->r_info); + Elf32_Addr value; + +#define COPY_UNALIGNED_WORD(swp, twp, align) \ + { \ + void *__s = (swp), *__t = (twp); \ + unsigned char *__s1 = __s, *__t1 = __t; \ + unsigned short *__s2 = __s, *__t2 = __t; \ + unsigned long *__s4 = __s, *__t4 = __t; \ + switch ((align)) \ + { \ + case 0: \ + *__t4 = *__s4; \ + break; \ + case 2: \ + *__t2++ = *__s2++; \ + *__t2 = *__s2; \ + break; \ + default: \ + *__t1++ = *__s1++; \ + *__t1++ = *__s1++; \ + *__t1++ = *__s1++; \ + *__t1 = *__s1; \ + break; \ + } \ + } + + if (__glibc_unlikely (r_type == R_SH_RELATIVE)) + { +#ifndef RTLD_BOOTSTRAP + if (map != &GL(dl_rtld_map)) /* Already done in rtld itself. */ +#endif + { + if (reloc->r_addend) + value = map->l_addr + reloc->r_addend; + else + { + COPY_UNALIGNED_WORD (reloc_addr_arg, &value, + (int) reloc_addr_arg & 3); + value += map->l_addr; + } + COPY_UNALIGNED_WORD (&value, reloc_addr_arg, + (int) reloc_addr_arg & 3); + } + } +#ifndef RTLD_BOOTSTRAP + else if (__glibc_unlikely (r_type == R_SH_NONE)) + return; +#endif + else + { + const Elf32_Sym *const refsym = sym; + struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); + + value = sym_map == NULL ? 0 : sym_map->l_addr + sym->st_value; + value += reloc->r_addend; + + switch (r_type) + { + case R_SH_COPY: + if (sym == NULL) + /* This can happen in trace mode if an object could not be + found. */ + break; + if (sym->st_size > refsym->st_size + || (sym->st_size < refsym->st_size && GLRO(dl_verbose))) + { + const char *strtab; + + strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("\ +%s: Symbol `%s' has different size in shared object, consider re-linking\n", + RTLD_PROGNAME, strtab + refsym->st_name); + } + memcpy (reloc_addr_arg, (void *) value, + MIN (sym->st_size, refsym->st_size)); + break; + case R_SH_GLOB_DAT: + case R_SH_JMP_SLOT: + /* These addresses are always aligned. */ + *reloc_addr = value; + break; + /* XXX Remove TLS relocations which are not needed. */ + case R_SH_TLS_DTPMOD32: +#ifdef RTLD_BOOTSTRAP + /* During startup the dynamic linker is always the module + with index 1. + XXX If this relocation is necessary move before RESOLVE + call. */ + *reloc_addr = 1; +#else + /* Get the information from the link map returned by the + resolv function. */ + if (sym_map != NULL) + *reloc_addr = sym_map->l_tls_modid; +#endif + break; + case R_SH_TLS_DTPOFF32: +#ifndef RTLD_BOOTSTRAP + /* During relocation all TLS symbols are defined and used. + Therefore the offset is already correct. */ + if (sym != NULL) + *reloc_addr = sym->st_value; +#endif + break; + case R_SH_TLS_TPOFF32: + /* The offset is positive, afterward from the thread pointer. */ +#ifdef RTLD_BOOTSTRAP + *reloc_addr = map->l_tls_offset + sym->st_value + reloc->r_addend; +#else + /* We know the offset of object the symbol is contained in. + It is a positive value which will be added to the thread + pointer. To get the variable position in the TLS block + we add the offset from that of the TLS block. */ + if (sym != NULL) + { + CHECK_STATIC_TLS (map, sym_map); + *reloc_addr = sym_map->l_tls_offset + sym->st_value + + reloc->r_addend; + } +#endif + break; + case R_SH_DIR32: + { +#if !defined RTLD_BOOTSTRAP && !defined RESOLVE_CONFLICT_FIND_MAP + /* This is defined in rtld.c, but nowhere in the static + libc.a; make the reference weak so static programs can + still link. This declaration cannot be done when + compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP) because + rtld.c contains the common defn for _dl_rtld_map, which + is incompatible with a weak decl in the same file. */ +# ifndef SHARED + weak_extern (_dl_rtld_map); +# endif + if (map == &GL(dl_rtld_map)) + /* Undo the relocation done here during bootstrapping. + Now we will relocate it anew, possibly using a + binding found in the user program or a loaded library + rather than the dynamic linker's built-in definitions + used while loading those libraries. */ + value -= map->l_addr + refsym->st_value + reloc->r_addend; +#endif + COPY_UNALIGNED_WORD (&value, reloc_addr_arg, + (int) reloc_addr_arg & 3); + break; + } + case R_SH_REL32: + value = (value - (Elf32_Addr) reloc_addr); + COPY_UNALIGNED_WORD (&value, reloc_addr_arg, + (int) reloc_addr_arg & 3); + break; + default: + _dl_reloc_bad_type (map, r_type, 0); + break; + } + } +} + +auto inline void +__attribute__ ((always_inline)) +elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) +{ + Elf32_Addr value; + + if (reloc->r_addend) + value = l_addr + reloc->r_addend; + else + { + COPY_UNALIGNED_WORD (reloc_addr_arg, &value, (int) reloc_addr_arg & 3); + value += l_addr; + } + COPY_UNALIGNED_WORD (&value, reloc_addr_arg, (int) reloc_addr_arg & 3); + +#undef COPY_UNALIGNED_WORD +} + +auto inline void +__attribute__ ((always_inline)) +elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc, + int skip_ifunc) +{ + Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset); + /* Check for unexpected PLT reloc type. */ + if (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT) + { + if (__builtin_expect (map->l_mach.plt, 0) == 0) + *reloc_addr += l_addr; + else + *reloc_addr = + map->l_mach.plt + + (((Elf32_Addr) reloc_addr) - map->l_mach.gotplt) * 7; + } + else + _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1); +} + +#endif /* RESOLVE_MAP */ diff --git a/REORG.TODO/sysdeps/sh/dl-tls.h b/REORG.TODO/sysdeps/sh/dl-tls.h new file mode 100644 index 0000000000..3f094a77a0 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/dl-tls.h @@ -0,0 +1,28 @@ +/* Thread-local storage handling in the ELF dynamic linker. SH version. + Copyright (C) 2002-2017 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 + <http://www.gnu.org/licenses/>. */ + + +/* Type used for the representation of TLS information in the GOT. */ +typedef struct +{ + unsigned long int ti_module; + unsigned long int ti_offset; +} tls_index; + + +extern void *__tls_get_addr (tls_index *ti); diff --git a/REORG.TODO/sysdeps/sh/dl-trampoline.S b/REORG.TODO/sysdeps/sh/dl-trampoline.S new file mode 100644 index 0000000000..3dfed100b2 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/dl-trampoline.S @@ -0,0 +1,430 @@ +/* PLT trampolines. SH version. + Copyright (C) 2005-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + + .text + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function + cfi_startproc + .align 5 +_dl_runtime_resolve: + mov.l r2,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r3,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r4,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r5,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r6,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r7,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r12,@-r15 + cfi_adjust_cfa_offset (4) + sts.l macl,@-r15 + cfi_adjust_cfa_offset (4) + sts.l mach,@-r15 + cfi_adjust_cfa_offset (4) + movt r3 ! Save T flag. + mov.l r3,@-r15 + cfi_adjust_cfa_offset (4) +#ifdef HAVE_FPU + sts.l fpscr,@-r15 + cfi_adjust_cfa_offset (4) + mov #8,r3 + swap.w r3,r3 + lds r3,fpscr + fmov.s fr11,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr10,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr9,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr8,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr7,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr6,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr5,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr4,@-r15 + cfi_adjust_cfa_offset (4) +#endif + sts.l pr,@-r15 + cfi_adjust_cfa_offset (4) + tst r0,r0 + bt 1f + mov r0,r2 +1: + mov r0,r4 ! PLT type + mov r2,r5 ! link map address +#ifdef SHARED + mov.l 2f,r2 + mova 2f,r0 + add r0,r2 ! Get GOT address in r2 + mov.l 3f,r0 + add r2,r0 +#else + mov.l 3f,r0 +#endif + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + lds.l @r15+,pr ! Get register content back. + cfi_adjust_cfa_offset (-4) +#ifdef HAVE_FPU + fmov.s @r15+,fr4 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr5 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr6 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr7 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr8 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr9 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr10 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr11 + cfi_adjust_cfa_offset (-4) + lds.l @r15+,fpscr + cfi_adjust_cfa_offset (-4) +#endif + mov.l @r15+,r3 + cfi_adjust_cfa_offset (-4) + shal r3 ! Lode T flag. + lds.l @r15+,mach + cfi_adjust_cfa_offset (-4) + lds.l @r15+,macl + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r12 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r7 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r6 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r5 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r4 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r3 + cfi_adjust_cfa_offset (-4) + jmp @r0 ! Jump to function address. + mov.l @r15+,r2 + cfi_adjust_cfa_offset (-4) + .align 2 +#ifdef SHARED +2: .long _GLOBAL_OFFSET_TABLE_ +3: .long _dl_fixup@GOTOFF +#else +3: .long _dl_fixup +#endif + cfi_endproc + .size _dl_runtime_resolve, .-_dl_runtime_resolve + + + .globl _dl_runtime_profile + .type _dl_runtime_profile,@function + cfi_startproc + .align 5 +_dl_runtime_profile: + mov.l r12,@-r15 + cfi_adjust_cfa_offset (4) +#ifdef HAVE_FPU + sts.l fpscr,@-r15 + cfi_adjust_cfa_offset (4) + mov #8,r12 + swap.w r12,r12 + lds r12,fpscr + fmov.s fr11,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr10,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr9,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr8,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr7,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr6,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr5,@-r15 + cfi_adjust_cfa_offset (4) + fmov.s fr4,@-r15 + cfi_adjust_cfa_offset (4) +#else + add #-36,r15 + cfi_adjust_cfa_offset (36) +#endif + mov.l r7,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r6,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r5,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r4,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r3,@-r15 + cfi_adjust_cfa_offset (4) + mov.l r2,@-r15 + cfi_adjust_cfa_offset (4) + sts.l macl,@-r15 + cfi_adjust_cfa_offset (4) + sts.l mach,@-r15 + cfi_adjust_cfa_offset (4) + movt r3 ! Save T flag. + mov.l r3,@-r15 + cfi_adjust_cfa_offset (4) + sts.l pr,@-r15 + cfi_adjust_cfa_offset (4) + tst r0,r0 + bt 1f + mov r0,r2 +1: + mov r0,r4 ! PLT type + mov r2,r5 ! link map address + sts pr,r7 ! return address + add #-24,r15 + cfi_adjust_cfa_offset (24) + mov #40,r0 + add r15,r0 + mov.l r0,@r15 ! Address of the register structure + mov #-1,r0 + mov.l r0,@(8,r15) + mov #8,r0 + add r15,r0 + mov.l r0,@(4,r15) + mov.l r5,@(12,r15) + mov.l r1,@(16,r15) +#ifdef SHARED + mov.l 2f,r12 + mova 2f,r0 + add r0,r12 ! Get GOT address in r12 + mov.l 3f,r0 + add r12,r0 +#else + mov.l 3f,r0 +#endif + jsr @r0 ! Call resolver. + mov r1,r6 ! reloc offset + mov.l @(8,r15),r1 + cmp/pz r1 + bt 4f + add #24,r15 + cfi_adjust_cfa_offset (-24) + lds.l @r15+,pr ! Get register content back. + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r3 + cfi_adjust_cfa_offset (-4) + shal r3 ! Lode T flag. + lds.l @r15+,mach + cfi_adjust_cfa_offset (-4) + lds.l @r15+,macl + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r2 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r3 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r4 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r5 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r6 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r7 + cfi_adjust_cfa_offset (-4) +#ifdef HAVE_FPU + fmov.s @r15+,fr4 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr5 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr6 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr7 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr8 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr9 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr10 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr11 + cfi_adjust_cfa_offset (-4) + lds.l @r15+,fpscr + cfi_adjust_cfa_offset (-4) +#else + add #36,r15 + cfi_adjust_cfa_offset (-36) +#endif + jmp @r0 ! Jump to function address. + mov.l @r15+,r12 + cfi_adjust_cfa_offset (-4) + .align 2 +#ifdef SHARED +2: .long _GLOBAL_OFFSET_TABLE_ +3: .long _dl_profile_fixup@GOTOFF +#else +3: .long _dl_profile_fixup +#endif + + cfi_adjust_cfa_offset (104) +4: + mov #104,r3 + add r15,r3 ! Original stack + mov.l r8,@(20,r15) + cfi_rel_offset (r8, 20) + mov r15,r8 + sub r1,r15 + shlr2 r15 + shll2 r15 + mov r15,r4 + shlr2 r1 + tst r1,r1 +5: + bt/s 6f + dt r1 + mov.l @r3+,r2 + mov.l r2,@r4 + bra 5b + add #4,r4 +6: + mov.l @r8,r12 + mov.l @r12+,r2 + mov.l @r12+,r3 + mov.l @r12+,r4 + mov.l @r12+,r5 + mov.l @r12+,r6 + mov.l @r12+,r7 +#ifdef HAVE_FPU + fmov.s @r12+,fr4 + fmov.s @r12+,fr5 + fmov.s @r12+,fr6 + fmov.s @r12+,fr7 + fmov.s @r12+,fr8 + fmov.s @r12+,fr9 + fmov.s @r12+,fr10 + fmov.s @r12+,fr11 + lds.l @r12+,fpscr +#else + add #36,r2 +#endif + jsr @r0 ! Call function. + nop + mov r8,r15 + mov.l @(12,r15),r4 ! link map address + mov.l @(16,r15),r5 ! reloc offset + mov.l @r15,r6 ! input registers +#ifdef HAVE_FPU + mov #16,r8 + add r15,r8 + fmov.s fr1,@-r8 + fmov.s fr0,@-r8 +#else + mov #8,r8 + add r15,r8 +#endif + mov.l r1,@-r8 + mov.l r0,@-r8 + mov.l @(20,r15),r8 + cfi_restore (r8) +#ifdef SHARED + mov.l 7f,r12 + mova 7f,r0 + add r0,r12 ! Get GOT address in r12 + mov.l 8f,r0 + add r12,r0 +#else + mov.l 8f,r0 +#endif + jsr @r0 + mov r15,r7 ! output registers + mov.l @r15+,r0 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r1 + cfi_adjust_cfa_offset (-4) +#ifdef HAVE_FPU + fmov.s @r15+,fr0 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr1 + cfi_adjust_cfa_offset (-4) + add #8,r15 + cfi_adjust_cfa_offset (-8) +#else + add #16,r15 + cfi_adjust_cfa_offset (-16) +#endif + lds.l @r15+,pr ! Get register content back. + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r3 + cfi_adjust_cfa_offset (-4) + shal r3 ! Lode T flag. + lds.l @r15+,mach + cfi_adjust_cfa_offset (-4) + lds.l @r15+,macl + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r2 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r3 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r4 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r5 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r6 + cfi_adjust_cfa_offset (-4) + mov.l @r15+,r7 + cfi_adjust_cfa_offset (-4) +#ifdef HAVE_FPU + fmov.s @r15+,fr4 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr5 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr6 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr7 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr8 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr9 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr10 + cfi_adjust_cfa_offset (-4) + fmov.s @r15+,fr11 + cfi_adjust_cfa_offset (-4) + lds.l @r15+,fpscr + cfi_adjust_cfa_offset (-4) +#else + add #36,r15 + cfi_adjust_cfa_offset (-36) +#endif + rts ! Jump to function address. + mov.l @r15+,r12 + cfi_adjust_cfa_offset (-4) + cfi_endproc + .align 2 +#ifdef SHARED +7: .long _GLOBAL_OFFSET_TABLE_ +8: .long _dl_call_pltexit@GOTOFF +#else +8: .long _dl_call_pltexit +#endif + .size _dl_runtime_profile, .-_dl_runtime_profile diff --git a/REORG.TODO/sysdeps/sh/fpu_control.h b/REORG.TODO/sysdeps/sh/fpu_control.h new file mode 100644 index 0000000000..df2627ad1e --- /dev/null +++ b/REORG.TODO/sysdeps/sh/fpu_control.h @@ -0,0 +1,76 @@ +/* FPU control word definitions. SH version. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _FPU_CONTROL_H +#define _FPU_CONTROL_H + +#if !defined(__SH_FPU_ANY__) + +#define _FPU_RESERVED 0xffffffff +#define _FPU_DEFAULT 0x00000000 +typedef unsigned int fpu_control_t; +#define _FPU_GETCW(cw) (cw) = 0 +#define _FPU_SETCW(cw) (void) (cw) +extern fpu_control_t __fpu_control; + +#else + +#include <features.h> + +/* masking of interrupts */ +#define _FPU_MASK_VM 0x0800 /* Invalid operation */ +#define _FPU_MASK_ZM 0x0400 /* Division by zero */ +#define _FPU_MASK_OM 0x0200 /* Overflow */ +#define _FPU_MASK_UM 0x0100 /* Underflow */ +#define _FPU_MASK_IM 0x0080 /* Inexact operation */ + +/* rounding control */ +#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ +#define _FPU_RC_ZERO 0x1 + +#define _FPU_RESERVED 0xffc00000 /* These bits are reserved. */ + +/* The fdlibm code requires strict IEEE double precision arithmetic, + and no interrupts for exceptions, rounding to nearest. */ +#define _FPU_DEFAULT 0x00080000 /* Default value. */ +#define _FPU_IEEE 0x00080f80 /* Default + exceptions enabled. */ + +/* Type of the control word. */ +typedef unsigned int fpu_control_t; + +/* Macros for accessing the hardware control word. */ +#define _FPU_GETCW(cw) __asm__ ("sts fpscr,%0" : "=r" (cw)) + +#if defined __GNUC__ +__BEGIN_DECLS + +/* GCC provides this function. */ +extern void __set_fpscr (unsigned long); +#define _FPU_SETCW(cw) __set_fpscr ((cw)) +#else +#define _FPU_SETCW(cw) __asm__ ("lds %0,fpscr" : : "r" (cw)) +#endif + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +__END_DECLS + +#endif /* __SH_FPU_ANY__ */ + +#endif /* _FPU_CONTROL_H */ diff --git a/REORG.TODO/sysdeps/sh/gccframe.h b/REORG.TODO/sysdeps/sh/gccframe.h new file mode 100644 index 0000000000..e12a845e22 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/gccframe.h @@ -0,0 +1,21 @@ +/* Definition of object in frame unwind info. sh version. + Copyright (C) 2001-2017 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 + <http://www.gnu.org/licenses/>. */ + +#define DWARF_FRAME_REGISTERS 49 + +#include <sysdeps/generic/gccframe.h> diff --git a/REORG.TODO/sysdeps/sh/gmp-mparam.h b/REORG.TODO/sysdeps/sh/gmp-mparam.h new file mode 100644 index 0000000000..a579b48787 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/gmp-mparam.h @@ -0,0 +1,29 @@ +/* gmp-mparam.h -- Compiler/machine parameter header file. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#define BITS_PER_MP_LIMB 32 +#define BYTES_PER_MP_LIMB 4 +#define BITS_PER_LONGINT 32 +#define BITS_PER_INT 32 +#define BITS_PER_SHORTINT 16 +#define BITS_PER_CHAR 8 + +#define IEEE_DOUBLE_BIG_ENDIAN 0 +#define IEEE_DOUBLE_MIXED_ENDIAN 1 diff --git a/REORG.TODO/sysdeps/sh/jmpbuf-offsets.h b/REORG.TODO/sysdeps/sh/jmpbuf-offsets.h new file mode 100644 index 0000000000..fc5fae92c1 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/jmpbuf-offsets.h @@ -0,0 +1,19 @@ +/* Private macros for accessing __jmp_buf contents. SH version. + Copyright (C) 2006-2017 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 + <http://www.gnu.org/licenses/>. */ + +#define JB_SIZE (4 * 15) diff --git a/REORG.TODO/sysdeps/sh/jmpbuf-unwind.h b/REORG.TODO/sysdeps/sh/jmpbuf-unwind.h new file mode 100644 index 0000000000..8af8d0d44f --- /dev/null +++ b/REORG.TODO/sysdeps/sh/jmpbuf-unwind.h @@ -0,0 +1,46 @@ +/* Copyright (C) 2003-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <setjmp.h> +#include <stdint.h> +#include <unwind.h> +#include <sysdep.h> + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ + ((void *) (address) < (void *) demangle ((jmpbuf)[0].__regs[7])) + +#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ + _JMPBUF_UNWINDS_ADJ (_jmpbuf, (void *) _Unwind_GetCFA (_context), _adj) + +static inline uintptr_t __attribute__ ((unused)) +_jmpbuf_sp (__jmp_buf regs) +{ + void *sp = (void *) regs[0].__regs[7]; +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (sp); +#endif + return (uintptr_t) sp; +} + +#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ + ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) + +/* We use the normal longjmp for unwinding. */ +#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) diff --git a/REORG.TODO/sysdeps/sh/ldsodefs.h b/REORG.TODO/sysdeps/sh/ldsodefs.h new file mode 100644 index 0000000000..68fd828aed --- /dev/null +++ b/REORG.TODO/sysdeps/sh/ldsodefs.h @@ -0,0 +1,40 @@ +/* Run-time dynamic linker data structures for loaded ELF shared objects. + Copyright (C) 1995-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _SH_LDSODEFS_H +#define _SH_LDSODEFS_H 1 + +#include <elf.h> + +struct La_sh_regs; +struct La_sh_retval; + +#define ARCH_PLTENTER_MEMBERS \ + uintptr_t (*sh_gnu_pltenter) (Elf32_Sym *, unsigned int, uintptr_t *, \ + uintptr_t *, struct La_sh_regs *, \ + unsigned int *, const char *name, \ + long int *framesizep) + +#define ARCH_PLTEXIT_MEMBERS \ + unsigned int (*sh_gnu_pltexit) (Elf32_Sym *, unsigned int, uintptr_t *, \ + uintptr_t *, const struct La_sh_regs *, \ + struct La_sh_retval *, const char *) + +#include_next <ldsodefs.h> + +#endif diff --git a/REORG.TODO/sysdeps/sh/libc-tls.c b/REORG.TODO/sysdeps/sh/libc-tls.c new file mode 100644 index 0000000000..3fb6f057ee --- /dev/null +++ b/REORG.TODO/sysdeps/sh/libc-tls.c @@ -0,0 +1,32 @@ +/* Thread-local storage handling in the ELF dynamic linker. SH version. + Copyright (C) 2009-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <csu/libc-tls.c> +#include <dl-tls.h> + +/* On SH, linker optimizations are not required, so __tls_get_addr + can be called even in statically linked binaries. In this case module + must be always 1 and PT_TLS segment exist in the binary, otherwise it + would not link. */ + +void * +__tls_get_addr (tls_index *ti) +{ + dtv_t *dtv = THREAD_DTV (); + return (char *) dtv[1].pointer.val + ti->ti_offset; +} diff --git a/REORG.TODO/sysdeps/sh/libm-test-ulps b/REORG.TODO/sysdeps/sh/libm-test-ulps new file mode 100644 index 0000000000..a00f04e2a3 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/libm-test-ulps @@ -0,0 +1,417 @@ +# Begin of automatic generation + +# Maximal error of functions: +Function: "acos_towardzero": +float: 1 +ifloat: 1 + +Function: "acosh": +double: 1 +idouble: 1 + +Function: "asin_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "asinh": +double: 1 +float: 1 +ifloat: 1 + +Function: "atan2": +float: 1 +ifloat: 1 + +Function: "atanh": +float: 1 +ifloat: 1 + +Function: Real part of "cacos": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Imaginary part of "cacos": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Real part of "cacosh": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Imaginary part of "cacosh": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Real part of "casin": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "casin": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Real part of "casinh": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Imaginary part of "casinh": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "catan": +float: 1 +ifloat: 1 + +Function: Imaginary part of "catan": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "catanh": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "catanh": +float: 1 +ifloat: 1 + +Function: "cbrt": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "ccos": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "ccos": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "ccosh": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "ccosh": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "cexp": +double: 2 +float: 1 +idouble: 2 +ifloat: 1 + +Function: Imaginary part of "cexp": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: Real part of "clog": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "clog": +float: 1 +ifloat: 1 + +Function: Real part of "clog10": +double: 2 +float: 2 +idouble: 2 +ifloat: 2 + +Function: Imaginary part of "clog10": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "cos": +float: 1 +ifloat: 1 + +Function: "cos_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "cosh": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "cosh_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "cpow": +double: 2 +float: 4 +idouble: 2 +ifloat: 4 + +Function: Imaginary part of "cpow": +float: 2 +ifloat: 2 + +Function: Real part of "csin": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "csinh": +float: 1 +ifloat: 1 + +Function: Imaginary part of "csinh": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "csqrt": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "csqrt": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Real part of "ctan": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: Imaginary part of "ctan": +double: 2 +float: 1 +idouble: 2 +ifloat: 1 + +Function: Real part of "ctan_towardzero": +double: 5 +float: 3 +idouble: 5 +ifloat: 3 + +Function: Imaginary part of "ctan_towardzero": +double: 2 +float: 3 +idouble: 2 +ifloat: 3 + +Function: Real part of "ctanh": +double: 2 +float: 1 +idouble: 2 +ifloat: 1 + +Function: Imaginary part of "ctanh": +double: 2 +float: 2 +idouble: 2 +ifloat: 2 + +Function: Real part of "ctanh_towardzero": +double: 2 +float: 3 +idouble: 2 +ifloat: 3 + +Function: Imaginary part of "ctanh_towardzero": +double: 5 +float: 3 +idouble: 5 +ifloat: 3 + +Function: "erf": +double: 1 +idouble: 1 + +Function: "erfc": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "exp10": +double: 1 +idouble: 1 + +Function: "exp10_towardzero": +double: 1 +idouble: 1 + +Function: "exp_towardzero": +double: 1 +idouble: 1 + +Function: "expm1": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "expm1_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "fma_towardzero": +double: 1 +idouble: 1 + +Function: "gamma": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "hypot": +double: 1 +idouble: 1 + +Function: "j0": +double: 2 +float: 2 +idouble: 2 +ifloat: 2 + +Function: "j1": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: "jn": +double: 4 +float: 4 +idouble: 4 +ifloat: 4 + +Function: "lgamma": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "log": +float: 1 +ifloat: 1 + +Function: "log10": +double: 1 +float: 2 +idouble: 1 +ifloat: 2 + +Function: "log1p": +float: 1 +ifloat: 1 + +Function: "pow": +float: 1 +ifloat: 1 + +Function: "pow10": +double: 1 +idouble: 1 + +Function: "pow_towardzero": +float: 1 +ifloat: 1 + +Function: "sin": +float: 1 +ifloat: 1 + +Function: "sin_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "sincos": +float: 1 +ifloat: 1 + +Function: "sinh_towardzero": +double: 1 +idouble: 1 + +Function: "tan_towardzero": +double: 1 +float: 1 +idouble: 1 +ifloat: 1 + +Function: "tgamma": +double: 4 +float: 3 +idouble: 4 +ifloat: 3 + +Function: "y0": +double: 2 +float: 1 +idouble: 2 +ifloat: 1 + +Function: "y1": +double: 3 +float: 2 +idouble: 3 +ifloat: 2 + +Function: "yn": +double: 3 +float: 2 +idouble: 3 +ifloat: 2 + +# end of automatic generation diff --git a/REORG.TODO/sysdeps/sh/libm-test-ulps-name b/REORG.TODO/sysdeps/sh/libm-test-ulps-name new file mode 100644 index 0000000000..b6c67c9520 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/libm-test-ulps-name @@ -0,0 +1 @@ +SH diff --git a/REORG.TODO/sysdeps/sh/linkmap.h b/REORG.TODO/sysdeps/sh/linkmap.h new file mode 100644 index 0000000000..bb2fbb5f16 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/linkmap.h @@ -0,0 +1,5 @@ +struct link_map_machine + { + Elf32_Addr plt; /* Address of .plt + 36 */ + Elf32_Addr gotplt; /* Address of .got + 0x0c */ + }; diff --git a/REORG.TODO/sysdeps/sh/machine-gmon.h b/REORG.TODO/sysdeps/sh/machine-gmon.h new file mode 100644 index 0000000000..56e45bcdb4 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/machine-gmon.h @@ -0,0 +1,30 @@ +/* Machine-dependent definitions for profiling support. SH version. + Copyright (C) 1996-2017 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 + <http://www.gnu.org/licenses/>. */ + +/* 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) + + +/* Define MCOUNT as empty since we have the implementation in another + file. */ +#define MCOUNT diff --git a/REORG.TODO/sysdeps/sh/math_private.h b/REORG.TODO/sysdeps/sh/math_private.h new file mode 100644 index 0000000000..d13f2d49d3 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/math_private.h @@ -0,0 +1,10 @@ +#ifndef SH_MATH_PRIVATE_H +#define SH_MATH_PRIVATE_H 1 + +/* Enable __finitel, __isinfl, and __isnanl for binary compatibility + when built without long double support. */ +#define LDBL_CLASSIFY_COMPAT 1 + +#include_next <math_private.h> + +#endif diff --git a/REORG.TODO/sysdeps/sh/memcpy.S b/REORG.TODO/sysdeps/sh/memcpy.S new file mode 100644 index 0000000000..c13afeaf24 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/memcpy.S @@ -0,0 +1,198 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp> + Optimized by Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com> + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* void *memcpy(void *dst, const void *src, size_t n); + No overlap between the memory of DST and of SRC are assumed. */ + +ENTRY(memcpy) + mov r4,r3 /* Save destination. */ + + /* If less than 11 bytes, just do a byte copy. */ + mov #11,r0 + cmp/gt r6,r0 + bt L_byteloop_init + + /* Check if we need to word-align source. */ + mov r5,r0 + tst #1,r0 + bt L_wordalign + + mov.b @r0+,r1 /* Copy one byte. */ + add #-1,r6 + mov.b r1,@r4 + add #1,r4 + + .balignw 4,0x0009 +L_wordalign: + /* Check if we need to longword-align source. */ + tst #2,r0 + bt L_copy + + mov.w @r0+,r1 /* Copy one word. */ + add #-2,r6 +#ifdef __BIG_ENDIAN__ + add #1,r4 + mov.b r1,@r4 + shlr8 r1 + mov.b r1,@-r4 + add #2,r4 +#else + mov.b r1,@r4 + add #1,r4 + shlr8 r1 + mov.b r1,@r4 + add #1,r4 +#endif +L_copy: + mov r0,r5 + + /* Calculate the correct routine to handle the destination + alignment and simultaneously calculate the loop counts for + both the 2 word copy loop and byte copy loop. */ + mova L_jumptable,r0 + mov r0,r1 + mov r4,r0 + mov r6,r7 + and #3,r0 + shlr2 r7 + shll r0 + shlr r7 + mov.w @(r0,r1),r2 + mov #7,r0 + braf r2 + and r0,r6 +L_base: + + .balign 4 +L_jumptable: + .word L_copydest0 - L_base + .word L_copydest1_or_3 - L_base + .word L_copydest2 - L_base + .word L_copydest1_or_3 - L_base + + .balign 4 + /* Copy routine for (dest mod 4) == 1 or == 3. */ +L_copydest1_or_3: + add #-1,r4 + .balignw 4,0x0009 +L_copydest1_or_3_loop: + mov.l @r5+,r0 /* Read first longword. */ + dt r7 + mov.l @r5+,r1 /* Read second longword. */ +#ifdef __BIG_ENDIAN__ + /* Write first longword as byte, word, byte. */ + mov.b r0,@(4,r4) + shlr8 r0 + mov.w r0,@(2,r4) + shlr16 r0 + mov.b r0,@(1,r4) + mov r1,r0 + /* Write second longword as byte, word, byte. */ + mov.b r0,@(8,r4) + shlr8 r0 + mov.w r0,@(6,r4) + shlr16 r0 + mov.b r0,@(5,r4) +#else + /* Write first longword as byte, word, byte. */ + mov.b r0,@(1,r4) + shlr8 r0 + mov.w r0,@(2,r4) + shlr16 r0 + mov.b r0,@(4,r4) + mov r1,r0 + /* Write second longword as byte, word, byte. */ + mov.b r0,@(5,r4) + shlr8 r0 + mov.w r0,@(6,r4) + shlr16 r0 + mov.b r0,@(8,r4) +#endif + bf/s L_copydest1_or_3_loop + add #8,r4 + + bra L_byteloop_init + add #1,r4 + + .balign 4 + /* Copy routine for (dest mod 4) == 2. */ +L_copydest2: +L_copydest2_loop: + mov.l @r5+,r0 + dt r7 + mov.l @r5+,r1 +#ifdef __BIG_ENDIAN__ + mov.w r0,@(2,r4) + shlr16 r0 + mov.w r0,@r4 + mov r1,r0 + mov.w r0,@(6,r4) + shlr16 r0 + mov.w r0,@(4,r4) +#else + mov.w r0,@r4 + shlr16 r0 + mov.w r0,@(2,r4) + mov r1,r0 + mov.w r0,@(4,r4) + shlr16 r0 + mov.w r0,@(6,r4) +#endif + bf/s L_copydest2_loop + add #8,r4 + + bra L_byteloop_init + nop + + .balign 4 + /* Copy routine for (dest mod 4) == 0. */ +L_copydest0: + add #-8,r4 + .balignw 4,0x0009 +L_copydest0_loop: + mov.l @r5+,r0 + dt r7 + mov.l @r5+,r1 + add #8,r4 + mov.l r0,@r4 + bf/s L_copydest0_loop + mov.l r1,@(4,r4) + + add #8,r4 /* Fall through. */ + +L_byteloop_init: + tst r6,r6 + bt L_exit + + .balignw 4,0x0009 + /* Copy remaining bytes. */ +L_byteloop: + mov.b @r5+,r0 + dt r6 + mov.b r0,@r4 + bf/s L_byteloop + add #1,r4 + +L_exit: + rts + mov r3,r0 /* Return destination. */ +END(memcpy) +libc_hidden_builtin_def (memcpy) diff --git a/REORG.TODO/sysdeps/sh/memset.S b/REORG.TODO/sysdeps/sh/memset.S new file mode 100644 index 0000000000..cb47e0c709 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/memset.S @@ -0,0 +1,88 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp> + Optimized by Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com> + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* void *memset (t, c, len); */ + +ENTRY(memset) + mov #12,r0 + cmp/gt r6,r0 + bt.s L_byte_loop_init + mov r4,r7 + + extu.b r5,r5 + swap.b r5,r1 + or r1,r5 + swap.w r5,r1 + or r1,r5 + + mov r4,r0 + tst #1,r0 + bt L_wordalign + + mov.b r5,@r4 + add #-1,r6 + add #1,r4 + mov r4,r0 + + .balignw 4,0x0009 +L_wordalign: + tst #2,r0 + bt L_word_loop_init + + mov.w r5,@r4 + add #-2,r6 + add #2,r4 + mov r4,r0 + + .balignw 4,0x0009 +L_word_loop_init: + mov r6,r3 + shlr2 r3 + mov #7,r0 + shlr r3 + and r0,r6 + + .balignw 4,0x0009 +L_2word_loop: + mov.l r5,@r4 + dt r3 + mov.l r5,@(4,r4) + bf.s L_2word_loop + add #8,r4 + + .balignw 4,0x0009 +L_byte_loop_init: + tst r6,r6 + bt L_byte_exit + + .balignw 4,0x0009 +L_byte_loop: + mov.b r5,@r4 + dt r6 + bf.s L_byte_loop + add #1,r4 + + .balignw 4,0x0009 +L_byte_exit: + rts + mov r7,r0 +END(memset) +libc_hidden_builtin_def (memset) diff --git a/REORG.TODO/sysdeps/sh/memusage.h b/REORG.TODO/sysdeps/sh/memusage.h new file mode 100644 index 0000000000..1821c69485 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/memusage.h @@ -0,0 +1,20 @@ +/* Copyright (C) 2000-2017 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 + <http://www.gnu.org/licenses/>. */ + +#define GETSP() ({ register uintptr_t stack_ptr asm ("r15"); stack_ptr; }) + +#include <sysdeps/generic/memusage.h> diff --git a/REORG.TODO/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/REORG.TODO/sysdeps/sh/nptl/bits/pthreadtypes-arch.h new file mode 100644 index 0000000000..b2615fe314 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/bits/pthreadtypes-arch.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2002-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _BITS_PTHREADTYPES_ARCH_H +#define _BITS_PTHREADTYPES_ARCH_H 1 + +#include <endian.h> + +#define __SIZEOF_PTHREAD_ATTR_T 36 +#define __SIZEOF_PTHREAD_MUTEX_T 24 +#define __SIZEOF_PTHREAD_MUTEXATTR_T 4 +#define __SIZEOF_PTHREAD_COND_T 48 +#define __SIZEOF_PTHREAD_CONDATTR_T 4 +#define __SIZEOF_PTHREAD_RWLOCK_T 32 +#define __SIZEOF_PTHREAD_RWLOCKATTR_T 8 +#define __SIZEOF_PTHREAD_BARRIER_T 20 +#define __SIZEOF_PTHREAD_BARRIERATTR_T 4 + +/* Definitions for internal mutex struct. */ +#define __PTHREAD_COMPAT_PADDING_MID +#define __PTHREAD_COMPAT_PADDING_END +#define __PTHREAD_MUTEX_LOCK_ELISION 0 + +#define __LOCK_ALIGNMENT +#define __ONCE_ALIGNMENT + +struct __pthread_rwlock_arch_t +{ + unsigned int __readers; + unsigned int __writers; + unsigned int __wrphase_futex; + unsigned int __writers_futex; + unsigned int __pad3; + unsigned int __pad4; +#if __BYTE_ORDER == __BIG_ENDIAN + unsigned char __pad1; + unsigned char __pad2; + unsigned char __shared; + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; +#else + /* FLAGS must stay at this position in the structure to maintain + binary compatibility. */ + unsigned char __flags; + unsigned char __shared; + unsigned char __pad1; + unsigned char __pad2; +#endif + unsigned long int __cur_writer; +}; + +#define __PTHREAD_RWLOCK_ELISION_EXTRA 0 + +#endif /* bits/pthreadtypes.h */ diff --git a/REORG.TODO/sysdeps/sh/nptl/bits/semaphore.h b/REORG.TODO/sysdeps/sh/nptl/bits/semaphore.h new file mode 100644 index 0000000000..42a0836285 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/bits/semaphore.h @@ -0,0 +1,35 @@ +/* Copyright (C) 2002-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + + 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _SEMAPHORE_H +# error "Never use <bits/semaphore.h> directly; include <semaphore.h> instead." +#endif + + +#define __SIZEOF_SEM_T 16 + + +/* Value returned if `sem_open' failed. */ +#define SEM_FAILED ((sem_t *) 0) + + +typedef union +{ + char __size[__SIZEOF_SEM_T]; + long int __align; +} sem_t; diff --git a/REORG.TODO/sysdeps/sh/nptl/pthread_spin_init.c b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_init.c new file mode 100644 index 0000000000..a1205b9698 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_init.c @@ -0,0 +1,19 @@ +/* Copyright (C) 2002-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + + 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 + <http://www.gnu.org/licenses/>. */ + +/* Not needed. pthread_spin_init is an alias for pthread_spin_unlock. */ diff --git a/REORG.TODO/sysdeps/sh/nptl/pthread_spin_lock.c b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_lock.c new file mode 100644 index 0000000000..3daa19d3f9 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_lock.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2003-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include "pthreadP.h" + +int +pthread_spin_lock (pthread_spinlock_t *lock) +{ + unsigned int val; + + do + asm volatile ("tas.b @%1; movt %0" + : "=&r" (val) + : "r" (lock) + : "memory"); + while (val == 0); + + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/nptl/pthread_spin_trylock.S b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_trylock.S new file mode 100644 index 0000000000..524dbf9533 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_trylock.S @@ -0,0 +1,31 @@ +/* Copyright (C) 2003-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <pthread-errnos.h> + + .globl pthread_spin_trylock + .type pthread_spin_trylock,@function + .align 5 +pthread_spin_trylock: + tas.b @r4 + bf/s 1f + mov #EBUSY, r0 + mov #0, r0 +1: + rts + nop + .size pthread_spin_trylock,.-pthread_spin_trylock diff --git a/REORG.TODO/sysdeps/sh/nptl/pthread_spin_unlock.S b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_unlock.S new file mode 100644 index 0000000000..aabf1e463d --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/pthread_spin_unlock.S @@ -0,0 +1,29 @@ +/* Copyright (C) 2003-2017 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 + <http://www.gnu.org/licenses/>. */ + + .globl pthread_spin_unlock + .type pthread_spin_unlock,@function + .align 5 +pthread_spin_unlock: + mov #0,r0 + rts + mov.l r0,@r4 + .size pthread_spin_unlock,.-pthread_spin_unlock + + /* The implementation of pthread_spin_init is identical. */ + .globl pthread_spin_init +pthread_spin_init = pthread_spin_unlock diff --git a/REORG.TODO/sysdeps/sh/nptl/pthreaddef.h b/REORG.TODO/sysdeps/sh/nptl/pthreaddef.h new file mode 100644 index 0000000000..327f090788 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/pthreaddef.h @@ -0,0 +1,34 @@ +/* Copyright (C) 2003-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* Default stack size. */ +#define ARCH_STACK_DEFAULT_SIZE (2 * 1024 * 1024) + +/* Required stack pointer alignment at beginning. */ +#define STACK_ALIGN 8 + +/* Minimal stack size after allocating thread descriptor and guard size. */ +#define MINIMAL_REST_STACK 2048 + +/* Alignment requirement for TCB. */ +#define TCB_ALIGNMENT 8 + + +/* Location of current stack frame. */ +#define CURRENT_STACK_FRAME __builtin_frame_address (0) diff --git a/REORG.TODO/sysdeps/sh/nptl/tcb-offsets.sym b/REORG.TODO/sysdeps/sh/nptl/tcb-offsets.sym new file mode 100644 index 0000000000..4963e1506f --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/tcb-offsets.sym @@ -0,0 +1,15 @@ +#include <sysdep.h> +#include <tls.h> +#include <kernel-features.h> + +RESULT offsetof (struct pthread, result) +TID offsetof (struct pthread, tid) +CANCELHANDLING offsetof (struct pthread, cancelhandling) +CLEANUP_JMP_BUF offsetof (struct pthread, cleanup_jmp_buf) +MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) +TLS_PRE_TCB_SIZE sizeof (struct pthread) +MUTEX_FUTEX offsetof (pthread_mutex_t, __data.__lock) +POINTER_GUARD offsetof (tcbhead_t, pointer_guard) +#ifndef __ASSUME_PRIVATE_FUTEX +PRIVATE_FUTEX offsetof (struct pthread, header.private_futex) +#endif diff --git a/REORG.TODO/sysdeps/sh/nptl/tls.h b/REORG.TODO/sysdeps/sh/nptl/tls.h new file mode 100644 index 0000000000..547cff179f --- /dev/null +++ b/REORG.TODO/sysdeps/sh/nptl/tls.h @@ -0,0 +1,168 @@ +/* Definition for thread-local data handling. NPTL/SH version. + Copyright (C) 2003-2017 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef _TLS_H +#define _TLS_H + +# include <dl-sysdep.h> + +#ifndef __ASSEMBLER__ +# include <stdbool.h> +# include <stddef.h> +# include <stdint.h> +# include <stdlib.h> +# include <list.h> +# include <sysdep.h> +# include <dl-dtv.h> + +typedef struct +{ + dtv_t *dtv; + uintptr_t pointer_guard; +} tcbhead_t; + +# define TLS_MULTIPLE_THREADS_IN_TCB 1 + +#else /* __ASSEMBLER__ */ +# include <tcb-offsets.h> +#endif /* __ASSEMBLER__ */ + + +#ifndef __ASSEMBLER__ + +/* Get system call information. */ +# include <sysdep.h> + +/* This is the size of the initial TCB. */ +# define TLS_INIT_TCB_SIZE sizeof (tcbhead_t) + +/* Alignment requirements for the initial TCB. */ +# define TLS_INIT_TCB_ALIGN __alignof__ (tcbhead_t) + +/* This is the size of the TCB. */ +# define TLS_TCB_SIZE sizeof (tcbhead_t) + +/* This is the size we need before TCB. */ +# define TLS_PRE_TCB_SIZE sizeof (struct pthread) + +/* Alignment requirements for the TCB. */ +# define TLS_TCB_ALIGN __alignof__ (struct pthread) + +/* The TLS blocks start right after the TCB. */ +# define TLS_DTV_AT_TP 1 +# define TLS_TCB_AT_TP 0 + +/* Get the thread descriptor definition. */ +# include <nptl/descr.h> + +/* Install the dtv pointer. The pointer passed is to the element with + index -1 which contain the length. */ +# define INSTALL_DTV(tcbp, dtvp) \ + ((tcbhead_t *) (tcbp))->dtv = (dtvp) + 1 + +/* Install new dtv for current thread. */ +# define INSTALL_NEW_DTV(dtv) \ + ({ tcbhead_t *__tcbp; \ + __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ + __tcbp->dtv = (dtv);}) + +/* Return dtv of given thread descriptor. */ +# define GET_DTV(tcbp) \ + (((tcbhead_t *) (tcbp))->dtv) + +/* Code to initially initialize the thread pointer. This might need + special attention since 'errno' is not yet available and if the + operation can cause a failure 'errno' must not be touched. */ +# define TLS_INIT_TP(tcbp) \ + ({ __asm __volatile ("ldc %0,gbr" : : "r" (tcbp)); NULL; }) + +# define TLS_DEFINE_INIT_TP(tp, pd) void *tp = (pd) + 1 + +/* Return the address of the dtv for the current thread. */ +# define THREAD_DTV() \ + ({ tcbhead_t *__tcbp; \ + __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ + __tcbp->dtv;}) + +/* Return the thread descriptor for the current thread. + The contained asm must *not* be marked volatile since otherwise + assignments like + struct pthread *self = thread_self(); + do not get optimized away. */ +# define THREAD_SELF \ + ({ struct pthread *__self; \ + __asm ("stc gbr,%0" : "=r" (__self)); \ + __self - 1;}) + +/* Magic for libthread_db to know how to do THREAD_SELF. */ +# define DB_THREAD_SELF \ + REGISTER (32, 32, REG_GBR * 4, -sizeof (struct pthread)) + +/* Read member of the thread descriptor directly. */ +# define THREAD_GETMEM(descr, member) (descr->member) + +/* Same as THREAD_GETMEM, but the member offset can be non-constant. */ +# define THREAD_GETMEM_NC(descr, member, idx) (descr->member[idx]) + +/* Set member of the thread descriptor directly. */ +# define THREAD_SETMEM(descr, member, value) \ + descr->member = (value) + +/* Same as THREAD_SETMEM, but the member offset can be non-constant. */ +# define THREAD_SETMEM_NC(descr, member, idx, value) \ + descr->member[idx] = (value) + +#define THREAD_GET_POINTER_GUARD() \ + ({ tcbhead_t *__tcbp; \ + __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ + __tcbp->pointer_guard;}) + #define THREAD_SET_POINTER_GUARD(value) \ + ({ tcbhead_t *__tcbp; \ + __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ + __tcbp->pointer_guard = (value);}) +#define THREAD_COPY_POINTER_GUARD(descr) \ + ({ tcbhead_t *__tcbp; \ + __asm __volatile ("stc gbr,%0" : "=r" (__tcbp)); \ + ((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;}) + +/* Get and set the global scope generation counter in struct pthread. */ +#define THREAD_GSCOPE_FLAG_UNUSED 0 +#define THREAD_GSCOPE_FLAG_USED 1 +#define THREAD_GSCOPE_FLAG_WAIT 2 +#define THREAD_GSCOPE_RESET_FLAG() \ + do \ + { int __res \ + = atomic_exchange_rel (&THREAD_SELF->header.gscope_flag, \ + THREAD_GSCOPE_FLAG_UNUSED); \ + if (__res == THREAD_GSCOPE_FLAG_WAIT) \ + lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE); \ + } \ + while (0) +#define THREAD_GSCOPE_SET_FLAG() \ + do \ + { \ + THREAD_SELF->header.gscope_flag = THREAD_GSCOPE_FLAG_USED; \ + atomic_write_barrier (); \ + } \ + while (0) +#define THREAD_GSCOPE_WAIT() \ + GL(dl_wait_lookup_done) () + +#endif /* __ASSEMBLER__ */ + +#endif /* tls.h */ diff --git a/REORG.TODO/sysdeps/sh/preconfigure b/REORG.TODO/sysdeps/sh/preconfigure new file mode 100644 index 0000000000..c1f6537797 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/preconfigure @@ -0,0 +1,6 @@ +# preconfigure fragment for sh. + +case "$machine" in +sh3*) base_machine=sh machine=sh/sh3 ;; +sh4*) base_machine=sh machine=sh/sh4 ;; +esac diff --git a/REORG.TODO/sysdeps/sh/s_fma.c b/REORG.TODO/sysdeps/sh/s_fma.c new file mode 100644 index 0000000000..d92438d448 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/s_fma.c @@ -0,0 +1,5 @@ +#ifdef __SH_FPU_ANY__ +# include <sysdeps/ieee754/dbl-64/s_fma.c> +#else +# include <soft-fp/fmadf4.c> +#endif diff --git a/REORG.TODO/sysdeps/sh/s_fmaf.c b/REORG.TODO/sysdeps/sh/s_fmaf.c new file mode 100644 index 0000000000..3b811ae6da --- /dev/null +++ b/REORG.TODO/sysdeps/sh/s_fmaf.c @@ -0,0 +1,5 @@ +#ifdef __SH_FPU_ANY__ +# include <sysdeps/ieee754/dbl-64/s_fmaf.c> +#else +# include <soft-fp/fmasf4.c> +#endif diff --git a/REORG.TODO/sysdeps/sh/sh3/__longjmp.S b/REORG.TODO/sysdeps/sh/sh3/__longjmp.S new file mode 100644 index 0000000000..27d6141a98 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh3/__longjmp.S @@ -0,0 +1,63 @@ +/* longjmp for SH. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + +/* __longjmp(jmpbuf, val) */ + +ENTRY (__longjmp) + mov.l @r4+, r8 + mov.l @r4+, r9 + mov.l @r4+, r10 + mov.l @r4+, r11 + mov.l @r4+, r12 + mov r5, r0 /* get the return value in place */ + tst r0, r0 + bf.s 1f + mov.l @r4+, r13 + mov #1,r0 /* can't let setjmp() return zero! */ +1: +#ifdef PTR_DEMANGLE + mov.l @r4+, r2 + PTR_DEMANGLE (r2, r1) + mov r2, r14 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) +# ifdef CHECK_SP + CHECK_SP (r2) +# endif + mov r2, r15 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) + lds r2, pr + mov #0, r1 +#else + mov.l @r4+, r14 +# ifdef CHECK_SP + mov.l @r4, r2 + CHECK_SP (r2) +# endif + mov.l @r4+, r15 + lds.l @r4+, pr +#endif + rts + ldc.l @r4+, gbr +END (__longjmp) diff --git a/REORG.TODO/sysdeps/sh/sh3/setjmp.S b/REORG.TODO/sysdeps/sh/sh3/setjmp.S new file mode 100644 index 0000000000..ef039a2114 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh3/setjmp.S @@ -0,0 +1,81 @@ +/* setjmp for SH3. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> +#include <jmpbuf-offsets.h> + +ENTRY (__sigsetjmp) + /* Save registers */ + add #(JB_SIZE - 4 * 5), r4 + stc.l gbr, @-r4 +#ifdef PTR_MANGLE + sts pr, r2 + PTR_MANGLE (r2, r1) + mov.l r2, @-r4 + mov r15, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov r14, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov #0, r1 +#else + sts.l pr, @-r4 + mov.l r15, @-r4 + mov.l r14, @-r4 +#endif + mov.l r13, @-r4 + mov.l r12, @-r4 + mov.l r11, @-r4 + mov.l r10, @-r4 + mov.l r9, @-r4 + mov.l r8, @-r4 + +#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + rts + mov #0, r0 +#else + /* Make a tail call to __sigjmp_save; it takes the same args. */ +# ifdef SHARED + mov.l 1f, r1 + mova 1f, r0 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l .L1, r1 + mov.l @(r0,r1), r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save@GOT) +# else + mov.l .L1, r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save) +# endif +#endif +END (__sigsetjmp) +hidden_def (__sigsetjmp) diff --git a/REORG.TODO/sysdeps/sh/sh4/Makefile b/REORG.TODO/sysdeps/sh/sh4/Makefile new file mode 100644 index 0000000000..ccac91432a --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/Makefile @@ -0,0 +1,3 @@ +# Build everything with full IEEE math support. -mieee isn't +# default for the older SH compilers. +sysdep-CFLAGS += -mieee diff --git a/REORG.TODO/sysdeps/sh/sh4/Versions b/REORG.TODO/sysdeps/sh/sh4/Versions new file mode 100644 index 0000000000..8cc1c7b7d4 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/Versions @@ -0,0 +1,5 @@ +ld { + GLIBC_PRIVATE { + __fpscr_values; + } +} diff --git a/REORG.TODO/sysdeps/sh/sh4/__longjmp.S b/REORG.TODO/sysdeps/sh/sh4/__longjmp.S new file mode 100644 index 0000000000..2a5c25da32 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/__longjmp.S @@ -0,0 +1,73 @@ +/* longjmp for SH. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> +#define _SETJMP_H +#define _ASM +#include <bits/setjmp.h> + +/* __longjmp(jmpbuf, val) */ + +ENTRY (__longjmp) + mov.l @r4+, r8 + mov.l @r4+, r9 + mov.l @r4+, r10 + mov.l @r4+, r11 + mov.l @r4+, r12 + mov r5, r0 /* get the return value in place */ + tst r0, r0 + bf.s 1f + mov.l @r4+, r13 + mov #1,r0 /* can't let setjmp() return zero! */ +1: +#ifdef PTR_DEMANGLE + mov.l @r4+, r2 + PTR_DEMANGLE (r2, r1) + mov r2, r14 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) +# ifdef CHECK_SP + CHECK_SP (r2) +# endif + mov r2, r15 + mov.l @r4+, r2 + PTR_DEMANGLE2 (r2, r1) + lds r2, pr + mov #0, r1 +#else + mov.l @r4+, r14 +# ifdef CHECK_SP + mov.l @r4, r2 + CHECK_SP (r2) +# endif + mov.l @r4+, r15 + lds.l @r4+, pr +#endif +#ifdef __SH_FPU_ANY__ + ldc.l @r4+, gbr + lds.l @r4+, fpscr + fmov.s @r4+, fr12 + fmov.s @r4+, fr13 + fmov.s @r4+, fr14 + rts + fmov.s @r4+, fr15 +#else + rts + ldc.l @r4+, gbr +#endif /* !__SH_FPU_ANY__ */ +END (__longjmp) diff --git a/REORG.TODO/sysdeps/sh/sh4/dl-trampoline.S b/REORG.TODO/sysdeps/sh/sh4/dl-trampoline.S new file mode 100644 index 0000000000..bd9bb7e5bd --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/dl-trampoline.S @@ -0,0 +1,4 @@ +#ifdef __SH_FPU_ANY__ +# define HAVE_FPU +#endif +#include <sysdeps/sh/dl-trampoline.S> diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fclrexcpt.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fclrexcpt.c new file mode 100644 index 0000000000..5a430f6655 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fclrexcpt.c @@ -0,0 +1,42 @@ +/* Clear given exceptions in current floating-point environment. + Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +feclearexcept (int excepts) +{ + fpu_control_t cw; + + /* Mask out unsupported bits/exceptions. */ + excepts &= FE_ALL_EXCEPT; + + /* Read the complete control word. */ + _FPU_GETCW (cw); + + /* Clear exception bits. */ + cw &= ~excepts; + + /* Put the new data in effect. */ + _FPU_SETCW (cw); + + return 0; +} +libm_hidden_def (feclearexcept) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fedisblxcpt.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fedisblxcpt.c new file mode 100644 index 0000000000..718ae70899 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fedisblxcpt.c @@ -0,0 +1,39 @@ +/* Disable floating-point exceptions. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2012. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fedisableexcept (int excepts) +{ + fpu_control_t temp, old_exc; + + /* Get the current control register contents. */ + _FPU_GETCW (temp); + + old_exc = (temp >> 5) & FE_ALL_EXCEPT; + + excepts &= FE_ALL_EXCEPT; + + temp &= ~(excepts << 5); + _FPU_SETCW (temp); + + return old_exc; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/feenablxcpt.c b/REORG.TODO/sysdeps/sh/sh4/fpu/feenablxcpt.c new file mode 100644 index 0000000000..d638714149 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/feenablxcpt.c @@ -0,0 +1,38 @@ +/* Enable floating-point exceptions. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2012. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +feenableexcept (int excepts) +{ + fpu_control_t temp, old_flag; + + /* Get current exceptions. */ + _FPU_GETCW (temp); + + old_flag = (temp >> 5) & FE_ALL_EXCEPT; + excepts &= FE_ALL_EXCEPT; + + temp |= excepts << 5; + _FPU_SETCW (temp); + + return old_flag; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fegetenv.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetenv.c new file mode 100644 index 0000000000..00945f1072 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetenv.c @@ -0,0 +1,34 @@ +/* Store current floating-point environment. + Copyright (C) 1997-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +__fegetenv (fenv_t *envp) +{ + fpu_control_t temp; + _FPU_GETCW (temp); + + envp->__fpscr = temp; + + return 0; +} +libm_hidden_def (__fegetenv) +weak_alias (__fegetenv, fegetenv) +libm_hidden_weak (fegetenv) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fegetexcept.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetexcept.c new file mode 100644 index 0000000000..4d1299e310 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetexcept.c @@ -0,0 +1,32 @@ +/* Get enabled floating-point exceptions. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2012. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetexcept (void) +{ + fpu_control_t temp; + + /* Get current exceptions. */ + _FPU_GETCW (temp); + + return (temp >> 5) & FE_ALL_EXCEPT; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fegetmode.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetmode.c new file mode 100644 index 0000000000..e839a9b25f --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetmode.c @@ -0,0 +1,27 @@ +/* Store current floating-point control modes. SH4 version. + Copyright (C) 2016-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetmode (femode_t *modep) +{ + _FPU_GETCW (*modep); + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fegetround.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetround.c new file mode 100644 index 0000000000..4c97d23e12 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fegetround.c @@ -0,0 +1,35 @@ +/* Return current rounding direction. + Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +__fegetround (void) +{ + fpu_control_t cw; + + /* Get control word. */ + _FPU_GETCW (cw); + + return cw & 0x1; +} +libm_hidden_def (__fegetround) +weak_alias (__fegetround, fegetround) +libm_hidden_weak (fegetround) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/feholdexcpt.c b/REORG.TODO/sysdeps/sh/sh4/fpu/feholdexcpt.c new file mode 100644 index 0000000000..b905e594cd --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/feholdexcpt.c @@ -0,0 +1,44 @@ +/* Store current floating-point environment and clear exceptions. + Copyright (C) 1997-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +__feholdexcept (fenv_t *envp) +{ + fpu_control_t temp; + + /* Store the environment. */ + _FPU_GETCW (temp); + envp->__fpscr = temp; + + /* Clear the status flags. */ + temp &= ~FE_ALL_EXCEPT; + + /* Now set all exceptions to non-stop. */ + temp &= ~(FE_ALL_EXCEPT << 5); + + _FPU_SETCW (temp); + + /* Success. */ + return 0; +} +libm_hidden_def (__feholdexcept) +weak_alias (__feholdexcept, feholdexcept) +libm_hidden_weak (feholdexcept) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fesetenv.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetenv.c new file mode 100644 index 0000000000..8628c508e5 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetenv.c @@ -0,0 +1,36 @@ +/* Install given floating-point environment. + Copyright (C) 1997-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +__fesetenv (const fenv_t *envp) +{ + if (envp == FE_DFL_ENV) + _FPU_SETCW (_FPU_DEFAULT); + else + { + fpu_control_t temp = envp->__fpscr; + _FPU_SETCW (temp); + } + return 0; +} +libm_hidden_def (__fesetenv) +weak_alias (__fesetenv, fesetenv) +libm_hidden_weak (fesetenv) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fesetexcept.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetexcept.c new file mode 100644 index 0000000000..ecfad75fff --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetexcept.c @@ -0,0 +1,32 @@ +/* Set given exception flags. SH4 version. + Copyright (C) 2016-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fesetexcept (int excepts) +{ + fpu_control_t temp; + + _FPU_GETCW (temp); + temp |= (excepts & FE_ALL_EXCEPT); + _FPU_SETCW (temp); + + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fesetmode.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetmode.c new file mode 100644 index 0000000000..d2b9e05128 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetmode.c @@ -0,0 +1,38 @@ +/* Install given floating-point control modes. SH4 version. + Copyright (C) 2016-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +#define FPU_STATUS 0x3f07c + +int +fesetmode (const femode_t *modep) +{ + fpu_control_t fpscr; + + _FPU_GETCW (fpscr); + fpscr &= FPU_STATUS; + if (modep == FE_DFL_MODE) + fpscr |= _FPU_DEFAULT; + else + fpscr |= *modep & ~FPU_STATUS; + _FPU_SETCW (fpscr); + + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fesetround.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetround.c new file mode 100644 index 0000000000..20acb7c5e9 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fesetround.c @@ -0,0 +1,45 @@ +/* Set current rounding direction. + Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +__fesetround (int round) +{ + fpu_control_t cw; + + if ((round & ~0x1) != 0) + /* ROUND is no valid rounding mode. */ + return 1; + + /* Get current state. */ + _FPU_GETCW (cw); + + /* Set rounding bits. */ + cw &= ~0x1; + cw |= round; + /* Set new state. */ + _FPU_SETCW (cw); + + return 0; +} +libm_hidden_def (__fesetround) +weak_alias (__fesetround, fesetround) +libm_hidden_weak (fesetround) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/feupdateenv.c b/REORG.TODO/sysdeps/sh/sh4/fpu/feupdateenv.c new file mode 100644 index 0000000000..3b886a2235 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/feupdateenv.c @@ -0,0 +1,41 @@ +/* Install given floating-point environment and raise exceptions. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2012. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +__feupdateenv (const fenv_t *envp) +{ + fpu_control_t temp; + + _FPU_GETCW (temp); + temp = (temp & FE_ALL_EXCEPT); + + /* Raise the saved exception. Incidently for us the implementation + defined format of the values in objects of type fexcept_t is the + same as the ones specified using the FE_* constants. */ + __fesetenv (envp); + __feraiseexcept ((int) temp); + + return 0; +} +libm_hidden_def (__feupdateenv) +weak_alias (__feupdateenv, feupdateenv) +libm_hidden_weak (feupdateenv) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fgetexcptflg.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fgetexcptflg.c new file mode 100644 index 0000000000..02fc3948bc --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fgetexcptflg.c @@ -0,0 +1,38 @@ +/* Store current representation for exceptions. + Copyright (C) 2013-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fegetexceptflag (fexcept_t *flagp, int excepts) +{ + fpu_control_t temp; + + /* Get the current exceptions. */ + _FPU_GETCW (temp); + + /* We only save the relevant bits here. In particular, care has to be + taken with the CAUSE bits, as an inadvertent restore later on could + generate unexpected exceptions. */ + + *flagp = temp & excepts & FE_ALL_EXCEPT; + + /* Success. */ + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fraiseexcpt.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fraiseexcpt.c new file mode 100644 index 0000000000..4bd0eb9ef5 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fraiseexcpt.c @@ -0,0 +1,75 @@ +/* Raise given exceptions. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Nobuhiro Iwamatsu <iwamatsu@nigauri.org>, 2012. + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <float.h> +#include <fpu_control.h> +#include <math.h> + +int +__feraiseexcept (int excepts) +{ + if (excepts == 0) + return 0; + + /* Raise exceptions represented by EXPECTS. */ + + if (excepts & FE_INEXACT) + { + double d = 1.0, x = 3.0; + __asm__ __volatile__ ("fdiv %1, %0" : "+d" (d) : "d" (x)); + } + + if (excepts & FE_UNDERFLOW) + { + long double d = LDBL_MIN, x = 10; + __asm__ __volatile__ ("fdiv %1, %0" : "+d" (d) : "d" (x)); + } + + if (excepts & FE_OVERFLOW) + { + long double d = LDBL_MAX; + __asm__ __volatile__ ("fmul %0, %0" : "+d" (d) : "d" (d)); + } + + if (excepts & FE_DIVBYZERO) + { + double d = 1.0, x = 0.0; + __asm__ __volatile__ ("fdiv %1, %0" : "+d" (d) : "d" (x)); + } + + if (excepts & FE_INVALID) + { + double d = HUGE_VAL, x = 0.0; + __asm__ __volatile__ ("fmul %1, %0" : "+d" (d) : "d" (x)); + } + + { + /* Restore flag fields. */ + fpu_control_t cw; + _FPU_GETCW (cw); + cw |= (excepts & FE_ALL_EXCEPT); + _FPU_SETCW (cw); + } + + return 0; +} +libm_hidden_def (__feraiseexcept) +weak_alias (__feraiseexcept, feraiseexcept) +libm_hidden_weak (feraiseexcept) diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/fsetexcptflg.c b/REORG.TODO/sysdeps/sh/sh4/fpu/fsetexcptflg.c new file mode 100644 index 0000000000..3a6ea33c26 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/fsetexcptflg.c @@ -0,0 +1,39 @@ +/* Set floating-point environment exception handling. + Copyright (C) 1997-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <math.h> +#include <fpu_control.h> + +int +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ + fpu_control_t temp; + + /* Get the current environment. */ + _FPU_GETCW (temp); + + /* Set the desired exception mask. */ + temp &= ~(excepts & FE_ALL_EXCEPT); + temp |= (*flagp & excepts & FE_ALL_EXCEPT); + + /* Save state back to the FPU. */ + _FPU_SETCW (temp); + + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/sh4/fpu/ftestexcept.c b/REORG.TODO/sysdeps/sh/sh4/fpu/ftestexcept.c new file mode 100644 index 0000000000..fa2c011825 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/fpu/ftestexcept.c @@ -0,0 +1,32 @@ +/* Test exception in current environment. + Copyright (C) 1997-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <fpu_control.h> + +int +fetestexcept (int excepts) +{ + fpu_control_t temp; + + /* Get current exceptions. */ + _FPU_GETCW (temp); + + return temp & excepts & FE_ALL_EXCEPT; +} +libm_hidden_def (fetestexcept) diff --git a/REORG.TODO/sysdeps/sh/sh4/setjmp.S b/REORG.TODO/sysdeps/sh/sh4/setjmp.S new file mode 100644 index 0000000000..a09ffab627 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sh4/setjmp.S @@ -0,0 +1,90 @@ +/* setjmp for SH4. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> +#include <jmpbuf-offsets.h> + +ENTRY (__sigsetjmp) + /* Save registers */ +#ifdef __SH_FPU_ANY__ + add #JB_SIZE, r4 + fmov.s fr15, @-r4 + fmov.s fr14, @-r4 + fmov.s fr13, @-r4 + fmov.s fr12, @-r4 + sts.l fpscr, @-r4 +#else + add #(JB_SIZE - 4 * 5), r4 +#endif /* __SH_FPU_ANY__ */ + stc.l gbr, @-r4 +#ifdef PTR_MANGLE + sts pr, r2 + PTR_MANGLE (r2, r1) + mov.l r2, @-r4 + mov r15, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov r14, r2 + PTR_MANGLE2 (r2, r1) + mov.l r2, @-r4 + mov #0, r1 +#else + sts.l pr, @-r4 + mov.l r15, @-r4 + mov.l r14, @-r4 +#endif + mov.l r13, @-r4 + mov.l r12, @-r4 + mov.l r11, @-r4 + mov.l r10, @-r4 + mov.l r9, @-r4 + mov.l r8, @-r4 + +#if IS_IN (rtld) + /* In ld.so we never save the signal mask. */ + rts + mov #0, r0 +#else + /* Make a tail call to __sigjmp_save; it takes the same args. */ +# ifdef SHARED + mov.l 1f, r1 + mova 1f, r0 + bra 2f + add r1, r0 + .align 2 +1: + .long _GLOBAL_OFFSET_TABLE_ +2: + mov.l .L1, r1 + mov.l @(r0,r1), r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save@GOT) +# else + mov.l .L1, r1 + jmp @r1 + nop + .align 2 +.L1: + .long C_SYMBOL_NAME(__sigjmp_save) +# endif +#endif +END (__sigsetjmp) +hidden_def (__sigsetjmp) diff --git a/REORG.TODO/sysdeps/sh/soft-fp/sfp-machine.h b/REORG.TODO/sysdeps/sh/soft-fp/sfp-machine.h new file mode 100644 index 0000000000..81474e8a7c --- /dev/null +++ b/REORG.TODO/sysdeps/sh/soft-fp/sfp-machine.h @@ -0,0 +1,57 @@ +#define _FP_W_TYPE_SIZE 32 +#define _FP_W_TYPE unsigned long +#define _FP_WS_TYPE signed long +#define _FP_I_TYPE long + +#define _FP_MUL_MEAT_S(R,X,Y) \ + _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_D(R,X,Y) \ + _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_Q(R,X,Y) \ + _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) + +#define _FP_MUL_MEAT_DW_S(R,X,Y) \ + _FP_MUL_MEAT_DW_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_DW_D(R,X,Y) \ + _FP_MUL_MEAT_DW_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm) +#define _FP_MUL_MEAT_DW_Q(R,X,Y) \ + _FP_MUL_MEAT_DW_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm) + +#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_loop(S,R,X,Y) +#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y) +#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y) + +#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1) +#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1 +#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1 +#define _FP_NANSIGN_S 0 +#define _FP_NANSIGN_D 0 +#define _FP_NANSIGN_Q 0 + +#define _FP_KEEPNANFRACP 1 +#define _FP_QNANNEGATEDP 0 + +/* Someone please check this. */ +#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \ + do { \ + if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \ + && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \ + { \ + R##_s = Y##_s; \ + _FP_FRAC_COPY_##wc(R,Y); \ + } \ + else \ + { \ + R##_s = X##_s; \ + _FP_FRAC_COPY_##wc(R,X); \ + } \ + R##_c = FP_CLS_NAN; \ + } while (0) + +#define FP_EX_INVALID (1 << 6) +#define FP_EX_DIVZERO (1 << 5) +#define FP_EX_OVERFLOW (1 << 4) +#define FP_EX_UNDERFLOW (1 << 3) +#define FP_EX_INEXACT (1 << 2) + +#define _FP_TININESS_AFTER_ROUNDING 1 diff --git a/REORG.TODO/sysdeps/sh/sotruss-lib.c b/REORG.TODO/sysdeps/sh/sotruss-lib.c new file mode 100644 index 0000000000..152e502113 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sotruss-lib.c @@ -0,0 +1,50 @@ +/* Override generic sotruss-lib.c to define actual functions for SH. + Copyright (C) 2013-2017 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 + <http://www.gnu.org/licenses/>. */ + +#define HAVE_ARCH_PLTENTER +#define HAVE_ARCH_PLTEXIT + +#include <elf/sotruss-lib.c> + +ElfW(Addr) +la_sh_gnu_pltenter (ElfW(Sym) *sym __attribute__ ((unused)), + unsigned int ndx __attribute__ ((unused)), + uintptr_t *refcook, uintptr_t *defcook, + La_sh_regs *regs, unsigned int *flags, + const char *symname, long int *framesizep) +{ + print_enter (refcook, defcook, symname, + regs->lr_r4, regs->lr_r5, regs->lr_r6, *flags); + + /* No need to copy anything, we will not need the parameters in any case. */ + *framesizep = 0; + + return sym->st_value; +} + +unsigned int +la_sh_gnu_pltexit (ElfW(Sym) *sym, unsigned int ndx, uintptr_t *refcook, + uintptr_t *defcook, + const struct La_sh_regs *inregs, + struct La_sh_retval *outregs, const char *symname) +{ + print_exit (refcook, defcook, symname, outregs->lrv_r0); + + return 0; +} diff --git a/REORG.TODO/sysdeps/sh/stackguard-macros.h b/REORG.TODO/sysdeps/sh/stackguard-macros.h new file mode 100644 index 0000000000..55a5771b62 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/stackguard-macros.h @@ -0,0 +1,6 @@ +#include <stdint.h> + +extern uintptr_t __stack_chk_guard; +#define STACK_CHK_GUARD __stack_chk_guard + +#define POINTER_CHK_GUARD THREAD_GET_POINTER_GUARD() diff --git a/REORG.TODO/sysdeps/sh/stackinfo.h b/REORG.TODO/sysdeps/sh/stackinfo.h new file mode 100644 index 0000000000..cdbb27113d --- /dev/null +++ b/REORG.TODO/sysdeps/sh/stackinfo.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2001-2017 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 + <http://www.gnu.org/licenses/>. */ + +/* This file contains a bit of information about the stack allocation + of the processor. */ + +#ifndef _STACKINFO_H +#define _STACKINFO_H 1 + +#include <elf.h> + +/* On SH the stack grows down. */ +#define _STACK_GROWS_DOWN 1 + +/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is + * present, but it is presumed absent. */ +#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X) + +#endif /* stackinfo.h */ diff --git a/REORG.TODO/sysdeps/sh/start.S b/REORG.TODO/sysdeps/sh/start.S new file mode 100644 index 0000000000..0e6b90df9b --- /dev/null +++ b/REORG.TODO/sysdeps/sh/start.S @@ -0,0 +1,111 @@ +/* Startup code for SH & ELF. + Copyright (C) 1999-2017 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. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + 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 + <http://www.gnu.org/licenses/>. */ + +/* This is the canonical entry point, usually the first thing in the text + segment. + + Note that the code in the .init section has already been run. + This includes _init and _libc_init + + + At this entry point, most registers' values are unspecified, except: + + r4 Contains a function pointer to be registered with `atexit'. + This is how the dynamic linker arranges to have DT_FINI + functions called for shared libraries that have been loaded + before this code runs. + + sp The stack contains the arguments and environment: + 0(sp) argc + 4(sp) argv[0] + ... + (4*argc)(sp) NULL + (4*(argc+1))(sp) envp[0] + ... + NULL +*/ + + .text + .globl _start + .type _start,@function +_start: + /* Clear the frame pointer since this is the outermost frame. */ + mov #0, r14 + + /* Pop argc off the stack and save a pointer to argv */ + mov.l @r15+,r5 + mov r15, r6 + + /* Push the last arguments to main() onto the stack */ + mov.l r4,@-r15 + mov.l L_fini,r0 + mov.l r0,@-r15 + + /* Set up the other arguments for main() that go in registers */ + mov.l L_main,r4 + mov.l L_init,r7 + + /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */ + + /* Let the libc call main and exit with its return code. */ + mov.l L_libc_start_main,r1 + jsr @r1 + nop + /* should never get here....*/ + mov.l L_abort,r1 + jsr @r1 + nop + .align 2 +L_main: + .long main +L_init: + .long __libc_csu_init +L_fini: + .long __libc_csu_fini +L_libc_start_main: + .long __libc_start_main +L_abort: + .long abort +/* Define a symbol for the first piece of initialized data. */ + .data + .globl __data_start +__data_start: + .long 0 + .weak data_start + data_start = __data_start + .global __fpscr_values +__fpscr_values: + .long 0 + .long 0x80000 diff --git a/REORG.TODO/sysdeps/sh/strlen.S b/REORG.TODO/sysdeps/sh/strlen.S new file mode 100644 index 0000000000..8e0d53c471 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/strlen.S @@ -0,0 +1,83 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp> + + 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +/* size_t strlen (const char *s) */ + +ENTRY(strlen) + mov r4, r0 + and #3, r0 + tst r0, r0 + bt/s 1f + mov #0, r2 + + add #-1, r0 + shll2 r0 + shll r0 + braf r0 + nop + + mov.b @r4+, r1 + tst r1, r1 + bt 8f + add #1, r2 + + mov.b @r4+, r1 + tst r1, r1 + bt 8f + add #1, r2 + + mov.b @r4+, r1 + tst r1, r1 + bt 8f + add #1, r2 + +1: + mov #0, r3 +2: + mov.l @r4+, r1 + cmp/str r3, r1 + bf/s 2b + add #4, r2 + + add #-4, r2 +#ifdef __BIG_ENDIAN__ + swap.b r1, r1 + swap.w r1, r1 + swap.b r1, r1 +#endif + extu.b r1, r0 + tst r0, r0 + bt/s 8f + shlr8 r1 + add #1, r2 + extu.b r1, r0 + tst r0, r0 + bt/s 8f + shlr8 r1 + add #1, r2 + extu.b r1, r0 + tst r0, r0 + bt 8f + add #1, r2 +8: + rts + mov r2, r0 +END(strlen) +libc_hidden_builtin_def (strlen) diff --git a/REORG.TODO/sysdeps/sh/sysdep.h b/REORG.TODO/sysdeps/sh/sysdep.h new file mode 100644 index 0000000000..939c93144e --- /dev/null +++ b/REORG.TODO/sysdeps/sh/sysdep.h @@ -0,0 +1,75 @@ +/* Assembler macros for SH. + Copyright (C) 1999-2017 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 + <http://www.gnu.org/licenses/>. */ + +#include <sysdeps/generic/sysdep.h> + +#ifdef __ASSEMBLER__ + +/* Syntactic details of assembler. */ + +#define ALIGNARG(log2) log2 +#define ASM_SIZE_DIRECTIVE(name) .size name,.-name + +#ifdef SHARED +#define PLTJMP(_x) _x##@PLT +#else +#define PLTJMP(_x) _x +#endif + + +/* Define an entry point visible from C. */ +#define ENTRY(name) \ + .globl C_SYMBOL_NAME(name); \ + .type C_SYMBOL_NAME(name),@function; \ + .align ALIGNARG(5); \ + C_LABEL(name) \ + cfi_startproc; \ + CALL_MCOUNT + +#undef END +#define END(name) \ + cfi_endproc; \ + ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(name)) + +/* If compiled for profiling, call `mcount' at the start of each function. */ +#ifdef PROF +#define CALL_MCOUNT \ + mov.l 1f,r1; \ + sts.l pr,@-r15; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (pr, 0); \ + mova 2f,r0; \ + jmp @r1; \ + lds r0,pr; \ + .align 2; \ +1: .long mcount; \ +2: lds.l @r15+,pr; \ + cfi_adjust_cfa_offset (-4); \ + cfi_restore (pr) + +#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__ */ diff --git a/REORG.TODO/sysdeps/sh/tininess.h b/REORG.TODO/sysdeps/sh/tininess.h new file mode 100644 index 0000000000..1db37790f8 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/tininess.h @@ -0,0 +1 @@ +#define TININESS_AFTER_ROUNDING 1 diff --git a/REORG.TODO/sysdeps/sh/tls-macros.h b/REORG.TODO/sysdeps/sh/tls-macros.h new file mode 100644 index 0000000000..aa56b0a01f --- /dev/null +++ b/REORG.TODO/sysdeps/sh/tls-macros.h @@ -0,0 +1,143 @@ +#define TLS_LE(x) \ + ({ int *__l; void *__tp; \ + asm ("stc gbr,%1\n\t" \ + "mov.l 1f,%0\n\t" \ + "bra 2f\n\t" \ + " add %1,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tpoff\n\t" \ + "2:" \ + : "=r" (__l), "=r" (__tp)); \ + __l; }) + +#ifdef PIC +# define TLS_IE(x) \ + ({ int *__l; void *__tp; \ + register void *__gp __asm__("r12"); \ + asm ("mov.l 1f,r0\n\t" \ + "stc gbr,%1\n\t" \ + "mov.l @(r0,r12),%0\n\t" \ + "bra 2f\n\t" \ + " add %1,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@gottpoff\n\t" \ + "2:" \ + : "=r" (__l), "=r" (__tp) : "r" (__gp) : "r0"); \ + __l; }) +#else +# define TLS_IE(x) \ + ({ int *__l; void *__tp; \ + asm ("mov.l r12,@-r15\n\t" \ + "mova 0f,r0\n\t" \ + "mov.l 0f,r12\n\t" \ + "add r0,r12\n\t" \ + "mov.l 1f,r0\n\t" \ + "stc gbr,%1\n\t" \ + "mov.l @(r0,r12),%0\n\t" \ + "bra 2f\n\t" \ + " add %1,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@gottpoff\n\t" \ + "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ + "2: mov.l @r15+,r12" \ + : "=r" (__l), "=r" (__tp) : : "r0"); \ + __l; }) +#endif + +#ifdef PIC +# define TLS_LD(x) \ + ({ int *__l; \ + register void *__gp __asm__("r12"); \ + asm ("mov.l 1f,r4\n\t" \ + "mova 2f,r0\n\t" \ + "mov.l 2f,r1\n\t" \ + "add r0,r1\n\t" \ + "jsr @r1\n\t" \ + " add r12,r4\n\t" \ + "bra 4f\n\t" \ + " nop\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tlsldm\n\t" \ + "2: .long __tls_get_addr@plt\n\t" \ + "4: mov.l 3f,%0\n\t" \ + "bra 5f\n\t" \ + " add r0,%0\n\t" \ + ".align 2\n\t" \ + "3: .long " #x "@dtpoff\n\t" \ + "5:" \ + : "=r" (__l) : "r" (__gp) : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "pr", "t"); \ + __l; }) +#else +# define TLS_LD(x) \ + ({ int *__l; \ + asm ("mov.l r12,@-r15\n\t" \ + "mova 0f,r0\n\t" \ + "mov.l 0f,r12\n\t" \ + "add r0,r12\n\t" \ + "mov.l 1f,r4\n\t" \ + "mova 2f,r0\n\t" \ + "mov.l 2f,r1\n\t" \ + "add r0,r1\n\t" \ + "jsr @r1\n\t" \ + " add r12,r4\n\t" \ + "bra 4f\n\t" \ + " nop\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tlsldm\n\t" \ + "2: .long __tls_get_addr@plt\n\t" \ + "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ + "4: mov.l 3f,%0\n\t" \ + "bra 5f\n\t" \ + " add r0,%0\n\t" \ + ".align 2\n\t" \ + "3: .long " #x "@dtpoff\n\t" \ + "5: mov.l @r15+,r12" \ + : "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ + "pr", "t"); \ + __l; }) +#endif + +#ifdef PIC +# define TLS_GD(x) \ + ({ int *__l; \ + register void *__gp __asm__("r12"); \ + asm ("mov.l 1f,r4\n\t" \ + "mova 2f,r0\n\t" \ + "mov.l 2f,r1\n\t" \ + "add r0,r1\n\t" \ + "jsr @r1\n\t" \ + " add r12,r4\n\t" \ + "bra 3f\n\t" \ + " mov r0,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tlsgd\n\t" \ + "2: .long __tls_get_addr@plt\n\t" \ + "3:" \ + : "=r" (__l) : "r" (__gp) : "r0", "r1", "r2", "r3", "r4", "r5", \ + "r6", "r7", "pr", "t"); \ + __l; }) +#else +# define TLS_GD(x) \ + ({ int *__l; \ + asm ("mov.l r12,@-r15\n\t" \ + "mova 0f,r0\n\t" \ + "mov.l 0f,r12\n\t" \ + "add r0,r12\n\t" \ + "mov.l 1f,r4\n\t" \ + "mova 2f,r0\n\t" \ + "mov.l 2f,r1\n\t" \ + "add r0,r1\n\t" \ + "jsr @r1\n\t" \ + " add r12,r4\n\t" \ + "bra 3f\n\t" \ + " mov r0,%0\n\t" \ + ".align 2\n\t" \ + "1: .long " #x "@tlsgd\n\t" \ + "2: .long __tls_get_addr@plt\n\t" \ + "0: .long _GLOBAL_OFFSET_TABLE_\n\t" \ + "3: mov.l @r15+,r12" \ + : "=r" (__l) : : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ + "pr", "t"); \ + __l; }) +#endif diff --git a/REORG.TODO/sysdeps/sh/tst-audit.h b/REORG.TODO/sysdeps/sh/tst-audit.h new file mode 100644 index 0000000000..a7250a9817 --- /dev/null +++ b/REORG.TODO/sysdeps/sh/tst-audit.h @@ -0,0 +1,25 @@ +/* Definitions for testing PLT entry/exit auditing. SH version. + + Copyright (C) 2012-2017 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 + <http://www.gnu.org/licenses/>. */ + +#define pltenter la_sh_gnu_pltenter +#define pltexit la_sh_gnu_pltexit +#define La_regs La_sh_regs +#define La_retval La_sh_retval +#define int_retval lrv_r0 |