Blame sysdeps/i386/sysdep.h

Packit Service 82fcde
/* Assembler macros for i386.
Packit Service 82fcde
   Copyright (C) 1991-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
   License as published by the Free Software Foundation; either
Packit Service 82fcde
   version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; if not, see
Packit Service 82fcde
   <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <sysdeps/x86/sysdep.h>
Packit Service 82fcde
Packit Service 82fcde
#include <features.h> /* For __GNUC_PREREQ.  */
Packit Service 82fcde
Packit Service 82fcde
/* It is desirable that the names of PIC thunks match those used by
Packit Service 82fcde
   GCC so that multiple copies are eliminated by the linker.  Because
Packit Service 82fcde
   GCC 4.6 and earlier use __i686 in the names, it is necessary to
Packit Service 82fcde
   override that predefined macro.  */
Packit Service 82fcde
#if defined __i686 && defined __ASSEMBLER__
Packit Service 82fcde
#undef __i686
Packit Service 82fcde
#define __i686 __i686
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef	__ASSEMBLER__
Packit Service 82fcde
# define GET_PC_THUNK(reg) __x86.get_pc_thunk.reg
Packit Service 82fcde
#else
Packit Service 82fcde
# define GET_PC_THUNK_STR(reg) "__x86.get_pc_thunk." #reg
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#ifdef	__ASSEMBLER__
Packit Service 82fcde
Packit Service 82fcde
/* Syntactic details of assembler.  */
Packit Service 82fcde
Packit Service 82fcde
/* If compiled for profiling, call `mcount' at the start of each function.  */
Packit Service 82fcde
#ifdef	PROF
Packit Service 82fcde
/* The mcount code relies on a normal frame pointer being on the stack
Packit Service 82fcde
   to locate our caller, so push one just for its benefit.  */
Packit Service 82fcde
#define CALL_MCOUNT \
Packit Service 82fcde
  pushl %ebp; cfi_adjust_cfa_offset (4); movl %esp, %ebp; \
Packit Service 82fcde
  cfi_def_cfa_register (ebp); call JUMPTARGET(mcount); \
Packit Service 82fcde
  popl %ebp; cfi_def_cfa (esp, 4);
Packit Service 82fcde
#else
Packit Service 82fcde
#define CALL_MCOUNT		/* Do nothing.  */
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#define	PSEUDO(name, syscall_name, args)				      \
Packit Service 82fcde
  .globl syscall_error;							      \
Packit Service 82fcde
lose: SYSCALL_PIC_SETUP							      \
Packit Service 82fcde
  jmp JUMPTARGET(syscall_error);					      \
Packit Service 82fcde
  ENTRY (name)								      \
Packit Service 82fcde
  DO_CALL (syscall_name, args);						      \
Packit Service 82fcde
  jb lose
Packit Service 82fcde
Packit Service 82fcde
# define SETUP_PIC_REG(reg) \
Packit Service 82fcde
  .ifndef GET_PC_THUNK(reg);						      \
Packit Service 82fcde
  .section .gnu.linkonce.t.GET_PC_THUNK(reg),"ax",@progbits;		      \
Packit Service 82fcde
  .globl GET_PC_THUNK(reg);						      \
Packit Service 82fcde
  .hidden GET_PC_THUNK(reg);						      \
Packit Service 82fcde
  .p2align 4;								      \
Packit Service 82fcde
  .type GET_PC_THUNK(reg),@function;					      \
Packit Service 82fcde
GET_PC_THUNK(reg):							      \
Packit Service 82fcde
  movl (%esp), %e##reg;							      \
Packit Service 82fcde
  ret;									      \
Packit Service 82fcde
  .size GET_PC_THUNK(reg), . - GET_PC_THUNK(reg);			      \
Packit Service 82fcde
  .previous;								      \
Packit Service 82fcde
  .endif;								      \
Packit Service 82fcde
  call GET_PC_THUNK(reg)
Packit Service 82fcde
Packit Service 82fcde
# define LOAD_PIC_REG(reg) \
Packit Service 82fcde
  SETUP_PIC_REG(reg); addl $_GLOBAL_OFFSET_TABLE_, %e##reg
Packit Service 82fcde
Packit Service 82fcde
#undef JUMPTARGET
Packit Service 82fcde
#ifdef PIC
Packit Service 82fcde
#define JUMPTARGET(name)	name##@PLT
Packit Service 82fcde
#define SYSCALL_PIC_SETUP \
Packit Service 82fcde
    pushl %ebx;								      \
Packit Service 82fcde
    cfi_adjust_cfa_offset (4);						      \
Packit Service 82fcde
    call 0f;								      \
Packit Service 82fcde
0:  popl %ebx;								      \
Packit Service 82fcde
    cfi_adjust_cfa_offset (-4);						      \
Packit Service 82fcde
    addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ebx;
Packit Service 82fcde
Packit Service 82fcde
#else
Packit Service 82fcde
#define JUMPTARGET(name)	name
Packit Service 82fcde
#define SYSCALL_PIC_SETUP	/* Nothing.  */
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#else /* __ASSEMBLER__ */
Packit Service 82fcde
Packit Service 82fcde
# define SETUP_PIC_REG_STR(reg)						\
Packit Service 82fcde
  ".ifndef " GET_PC_THUNK_STR (reg) "\n"				\
Packit Service 82fcde
  ".section .gnu.linkonce.t." GET_PC_THUNK_STR (reg) ",\"ax\",@progbits\n" \
Packit Service 82fcde
  ".globl " GET_PC_THUNK_STR (reg) "\n"					\
Packit Service 82fcde
  ".hidden " GET_PC_THUNK_STR (reg) "\n"				\
Packit Service 82fcde
  ".p2align 4\n"							\
Packit Service 82fcde
  ".type " GET_PC_THUNK_STR (reg) ",@function\n"			\
Packit Service 82fcde
GET_PC_THUNK_STR (reg) ":"						\
Packit Service 82fcde
  "movl (%%esp), %%e" #reg "\n"						\
Packit Service 82fcde
  "ret\n"								\
Packit Service 82fcde
  ".size " GET_PC_THUNK_STR (reg) ", . - " GET_PC_THUNK_STR (reg) "\n"	\
Packit Service 82fcde
  ".previous\n"								\
Packit Service 82fcde
  ".endif\n"								\
Packit Service 82fcde
  "call " GET_PC_THUNK_STR (reg)
Packit Service 82fcde
Packit Service 82fcde
# define LOAD_PIC_REG_STR(reg) \
Packit Service 82fcde
  SETUP_PIC_REG_STR (reg) "\naddl $_GLOBAL_OFFSET_TABLE_, %%e" #reg
Packit Service 82fcde
Packit Service 82fcde
#endif	/* __ASSEMBLER__ */