1 /* Copyright (C) 2005-2021 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library.  If not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #ifndef	_LINK_H
19 # error "Never include <bits/link.h> directly; use <link.h> instead."
20 #endif
21 
22 #include <sgidefs.h>
23 
24 #if _MIPS_SIM == _ABIO32
25 
26 /* Registers for entry into PLT on MIPS.  */
27 typedef struct La_mips_32_regs
28 {
29   uint32_t lr_reg[4]; /* $a0 through $a3 */
30   double lr_fpreg[2]; /* $f12 and $f14 */
31   uint32_t lr_ra;
32   uint32_t lr_sp;
33 } La_mips_32_regs;
34 
35 /* Return values for calls from PLT on MIPS.  */
36 typedef struct La_mips_32_retval
37 {
38   uint32_t lrv_v0;
39   uint32_t lrv_v1;
40   double lrv_f0;
41   double lrv_f2;
42 } La_mips_32_retval;
43 
44 #else
45 
46 typedef struct La_mips_64_regs
47 {
48   uint64_t lr_reg[8]; /* $a0 through $a7 */
49   double lr_fpreg[8]; /* $f12 throgh $f19 */
50   uint64_t lr_ra;
51   uint64_t lr_sp;
52 } La_mips_64_regs;
53 
54 /* Return values for calls from PLT on MIPS.  */
55 typedef struct La_mips_64_retval
56 {
57   uint64_t lrv_v0;
58   uint64_t lrv_v1;
59   double lrv_f0;
60   double lrv_f2;
61 } La_mips_64_retval;
62 
63 #endif
64 
65 __BEGIN_DECLS
66 
67 #if _MIPS_SIM == _ABIO32
68 
69 extern Elf32_Addr la_mips_o32_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
70 					    uintptr_t *__refcook,
71 					    uintptr_t *__defcook,
72 					    La_mips_32_regs *__regs,
73 					    unsigned int *__flags,
74 					    const char *__symname,
75 					    long int *__framesizep);
76 extern unsigned int la_mips_o32_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
77 					     uintptr_t *__refcook,
78 					     uintptr_t *__defcook,
79 					     const La_mips_32_regs *__inregs,
80 					     La_mips_32_retval *__outregs,
81 					     const char *__symname);
82 
83 #elif _MIPS_SIM == _ABIN32
84 
85 extern Elf32_Addr la_mips_n32_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
86 					    uintptr_t *__refcook,
87 					    uintptr_t *__defcook,
88 					    La_mips_64_regs *__regs,
89 					    unsigned int *__flags,
90 					    const char *__symname,
91 					    long int *__framesizep);
92 extern unsigned int la_mips_n32_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
93 					     uintptr_t *__refcook,
94 					     uintptr_t *__defcook,
95 					     const La_mips_64_regs *__inregs,
96 					     La_mips_64_retval *__outregs,
97 					     const char *__symname);
98 
99 #else
100 
101 extern Elf64_Addr la_mips_n64_gnu_pltenter (Elf64_Sym *__sym, unsigned int __ndx,
102 					    uintptr_t *__refcook,
103 					    uintptr_t *__defcook,
104 					    La_mips_64_regs *__regs,
105 					    unsigned int *__flags,
106 					    const char *__symname,
107 					    long int *__framesizep);
108 extern unsigned int la_mips_n64_gnu_pltexit (Elf64_Sym *__sym, unsigned int __ndx,
109 					     uintptr_t *__refcook,
110 					     uintptr_t *__defcook,
111 					     const La_mips_64_regs *__inregs,
112 					     La_mips_64_retval *__outregs,
113 					     const char *__symname);
114 
115 #endif
116 
117 __END_DECLS