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