1 /* Copyright (C) 2004, 2005, 2009 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, write to the Free 16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17 02111-1307 USA. */ 18 19 #ifndef _LINK_H 20 # error "Never include <bits/link.h> directly; use <link.h> instead." 21 #endif 22 23 24 #if __ELF_NATIVE_CLASS == 32 25 /* Registers for entry into PLT on IA-32. */ 26 typedef struct La_i86_regs 27 { 28 uint32_t lr_edx; 29 uint32_t lr_ecx; 30 uint32_t lr_eax; 31 uint32_t lr_ebp; 32 uint32_t lr_esp; 33 } La_i86_regs; 34 35 /* Return values for calls from PLT on IA-32. */ 36 typedef struct La_i86_retval 37 { 38 uint32_t lrv_eax; 39 uint32_t lrv_edx; 40 long double lrv_st0; 41 long double lrv_st1; 42 } La_i86_retval; 43 44 45 __BEGIN_DECLS 46 47 extern Elf32_Addr la_i86_gnu_pltenter (Elf32_Sym *__sym, unsigned int __ndx, 48 uintptr_t *__refcook, 49 uintptr_t *__defcook, 50 La_i86_regs *__regs, 51 unsigned int *__flags, 52 const char *__symname, 53 long int *__framesizep); 54 extern unsigned int la_i86_gnu_pltexit (Elf32_Sym *__sym, unsigned int __ndx, 55 uintptr_t *__refcook, 56 uintptr_t *__defcook, 57 const La_i86_regs *__inregs, 58 La_i86_retval *__outregs, 59 const char *symname); 60 61 __END_DECLS 62 63 #else 64 65 /* Registers for entry into PLT on x86-64. */ 66 # if __GNUC_PREREQ (4,0) 67 typedef float La_x86_64_xmm __attribute__ ((__vector_size__ (16))); 68 typedef float La_x86_64_ymm __attribute__ ((__vector_size__ (32))); 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 109 __BEGIN_DECLS 110 111 extern Elf64_Addr la_x86_64_gnu_pltenter (Elf64_Sym *__sym, 112 unsigned int __ndx, 113 uintptr_t *__refcook, 114 uintptr_t *__defcook, 115 La_x86_64_regs *__regs, 116 unsigned int *__flags, 117 const char *__symname, 118 long int *__framesizep); 119 extern unsigned int la_x86_64_gnu_pltexit (Elf64_Sym *__sym, 120 unsigned int __ndx, 121 uintptr_t *__refcook, 122 uintptr_t *__defcook, 123 const La_x86_64_regs *__inregs, 124 La_x86_64_retval *__outregs, 125 const char *__symname); 126 127 __END_DECLS 128 129 #endif 130