Blame sysdeps/sparc/sysdep.h

Packit Service 82fcde
/* Copyright (C) 2011-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
#define _SYSDEPS_SYSDEP_H 1
Packit Service 82fcde
#include <bits/hwcap.h>
Packit Service 82fcde
Packit Service 82fcde
#ifdef	__ASSEMBLER__
Packit Service 82fcde
Packit Service 82fcde
#define SPARC_PIC_THUNK(reg)						\
Packit Service 82fcde
	.ifndef __sparc_get_pc_thunk.reg;				\
Packit Service 82fcde
	.section .text.__sparc_get_pc_thunk.reg,"axG",@progbits,__sparc_get_pc_thunk.reg,comdat; \
Packit Service 82fcde
	.align	 32;							\
Packit Service 82fcde
	.weak	 __sparc_get_pc_thunk.reg;				\
Packit Service 82fcde
	.hidden	 __sparc_get_pc_thunk.reg;				\
Packit Service 82fcde
	.type	 __sparc_get_pc_thunk.reg, #function;			\
Packit Service 82fcde
__sparc_get_pc_thunk.reg:		   				\
Packit Service 82fcde
	jmp	%o7 + 8;						\
Packit Service 82fcde
	 add	%o7, %reg, %##reg;					\
Packit Service 82fcde
	.previous;							\
Packit Service 82fcde
	.endif;
Packit Service 82fcde
Packit Service 82fcde
/* The "-4" and "+4" offsets against _GLOBAL_OFFSET_TABLE_ are
Packit Service 82fcde
   critical since they represent the offset from the thunk call to the
Packit Service 82fcde
   instruction containing the _GLOBAL_OFFSET_TABLE_ reference.
Packit Service 82fcde
   Therefore these instructions cannot be moved around without
Packit Service 82fcde
   appropriate adjustments to those offsets.
Packit Service 82fcde
Packit Service 82fcde
   Furthermore, these expressions are special in another regard.  When
Packit Service 82fcde
   the assembler sees a reference to _GLOBAL_OFFSET_TABLE_ inside of
Packit Service 82fcde
   a %hi() or %lo(), it emits a PC-relative relocation.  This causes
Packit Service 82fcde
   R_SPARC_HI22 to turn into R_SPARC_PC22, and R_SPARC_LO10 to turn into
Packit Service 82fcde
   R_SPARC_PC10, respectively.
Packit Service 82fcde
Packit Service 82fcde
   Even when v9 we use a call sequence instead of using "rd %pc" because
Packit Service 82fcde
   RDPC is extremely expensive and incurs a full pipeline flush.  */
Packit Service 82fcde
Packit Service 82fcde
#define SPARC_PIC_THUNK_CALL(reg)					\
Packit Service 82fcde
	sethi	%hi(_GLOBAL_OFFSET_TABLE_-4), %##reg;			\
Packit Service 82fcde
	call	__sparc_get_pc_thunk.reg;				\
Packit Service 82fcde
	 or	%##reg, %lo(_GLOBAL_OFFSET_TABLE_+4), %##reg;
Packit Service 82fcde
Packit Service 82fcde
#define SETUP_PIC_REG(reg)						\
Packit Service 82fcde
	SPARC_PIC_THUNK(reg)						\
Packit Service 82fcde
	SPARC_PIC_THUNK_CALL(reg)
Packit Service 82fcde
Packit Service 82fcde
#define SETUP_PIC_REG_LEAF(reg, tmp)					\
Packit Service 82fcde
	SPARC_PIC_THUNK(reg)						\
Packit Service 82fcde
	mov	%o7, %##tmp;		      				\
Packit Service 82fcde
	SPARC_PIC_THUNK_CALL(reg);					\
Packit Service 82fcde
	mov	%##tmp, %o7;
Packit Service 82fcde
Packit Service 82fcde
#undef ENTRY
Packit Service 82fcde
#define ENTRY(name)			\
Packit Service 82fcde
	.align	4;			\
Packit Service 82fcde
	.global	C_SYMBOL_NAME(name);	\
Packit Service 82fcde
	.type	name, @function;	\
Packit Service 82fcde
C_LABEL(name)				\
Packit Service 82fcde
	cfi_startproc;
Packit Service 82fcde
Packit Service 82fcde
#undef END
Packit Service 82fcde
#define END(name)			\
Packit Service 82fcde
	cfi_endproc;			\
Packit Service 82fcde
	.size name, . - name
Packit Service 82fcde
Packit Service 82fcde
#undef LOC
Packit Service 82fcde
#define LOC(name)  .L##name
Packit Service 82fcde
Packit Service 82fcde
#endif	/* __ASSEMBLER__ */