1 /* Copyright (C) 2004, 2005, 2009, 2011 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    <http://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 
23 #ifndef __x86_64__
24 /* Registers for entry into PLT on IA-32.  */
25 typedef struct La_i86_regs
26 {
27   uint32_t lr_edx;
28   uint32_t lr_ecx;
29   uint32_t lr_eax;
30   uint32_t lr_ebp;
31   uint32_t lr_esp;
32 } La_i86_regs;
33 
34 /* Return values for calls from PLT on IA-32.  */
35 typedef struct La_i86_retval
36 {
37   uint32_t lrv_eax;
38   uint32_t lrv_edx;
39   long double lrv_st0;
40   long double lrv_st1;
41 } La_i86_retval;
42 
43 
44 __BEGIN_DECLS
45 
46 extern Elf32_Addr la_i86_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx,
47 				       uintptr_t *__refcook,
48 				       uintptr_t *__defcook,
49 				       La_i86_regs *__regs,
50 				       unsigned int *__flags,
51 				       const char *__symname,
52 				       long int *__framesizep);
53 extern unsigned int la_i86_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx,
54 					uintptr_t *__refcook,
55 					uintptr_t *__defcook,
56 					const La_i86_regs *__inregs,
57 					La_i86_retval *__outregs,
58 					const char *symname);
59 
60 __END_DECLS
61 
62 #else
63 
64 /* Registers for entry into PLT on x86-64.  */
65 # if __GNUC_PREREQ (4,0)
66 typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16)));
67 typedef float La_x86_64_ymm
68     __attribute__ ((__vector_size__ (32), __aligned__ (16)));
69 # else
70 typedef float La_x86_64_xmm __attribute__ ((__mode__ (__V4SF__)));
71 # endif
72 
73 typedef union
74 {
75 # if __GNUC_PREREQ (4,0)
76   La_x86_64_ymm ymm[2];
77 # endif
78   La_x86_64_xmm xmm[4];
79 } La_x86_64_vector __attribute__ ((__aligned__ (16)));
80 
81 typedef struct La_x86_64_regs
82 {
83   uint64_t lr_rdx;
84   uint64_t lr_r8;
85   uint64_t lr_r9;
86   uint64_t lr_rcx;
87   uint64_t lr_rsi;
88   uint64_t lr_rdi;
89   uint64_t lr_rbp;
90   uint64_t lr_rsp;
91   La_x86_64_xmm lr_xmm[8];
92   La_x86_64_vector lr_vector[8];
93 } La_x86_64_regs;
94 
95 /* Return values for calls from PLT on x86-64.  */
96 typedef struct La_x86_64_retval
97 {
98   uint64_t lrv_rax;
99   uint64_t lrv_rdx;
100   La_x86_64_xmm lrv_xmm0;
101   La_x86_64_xmm lrv_xmm1;
102   long double lrv_st0;
103   long double lrv_st1;
104   La_x86_64_vector lrv_vector0;
105   La_x86_64_vector lrv_vector1;
106 } La_x86_64_retval;
107 
108 #define La_x32_regs La_x86_64_regs
109 #define La_x32_retval La_x86_64_retval
110 
111 __BEGIN_DECLS
112 
113 extern Elf64_Addr la_x86_64_gnu_pltenter (Elf64_Sym *__sym,
114 					  unsigned int __ndx,
115 					  uintptr_t *__refcook,
116 					  uintptr_t *__defcook,
117 					  La_x86_64_regs *__regs,
118 					  unsigned int *__flags,
119 					  const char *__symname,
120 					  long int *__framesizep);
121 extern unsigned int la_x86_64_gnu_pltexit (Elf64_Sym *__sym,
122 					   unsigned int __ndx,
123 					   uintptr_t *__refcook,
124 					   uintptr_t *__defcook,
125 					   const La_x86_64_regs *__inregs,
126 					   La_x86_64_retval *__outregs,
127 					   const char *__symname);
128 
129 extern Elf32_Addr la_x32_gnu_pltenter (Elf32_Sym *__sym,
130 				       unsigned int __ndx,
131 				       uintptr_t *__refcook,
132 				       uintptr_t *__defcook,
133 				       La_x32_regs *__regs,
134 				       unsigned int *__flags,
135 				       const char *__symname,
136 				       long int *__framesizep);
137 extern unsigned int la_x32_gnu_pltexit (Elf32_Sym *__sym,
138 					unsigned int __ndx,
139 					uintptr_t *__refcook,
140 					uintptr_t *__defcook,
141 					const La_x32_regs *__inregs,
142 					La_x32_retval *__outregs,
143 					const char *__symname);
144 
145 __END_DECLS
146 
147 #endif
148