mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-27 15:30:07 +00:00
274895575e
Ensure that all objects in ARM EABI glibc have the proper EABI build attributes to indicate that 8-byte stack alignment is required and preserved. (GNU ld does not currently give errors for mixing code requiring 8-byte alignment - such as anything built with GCC - and code not marked as preserving it, because of the prevalence of assembly code without proper markers to indicate that alignment is preserved. The ARM RealView linker does give such errors.) The bulk of the markers are accomplished by the change to sysdep.h, but a few .S files do not include sysdep.h. In the case of internal_accept4.S, no code is generated because EABI does not have socketcall, but for completeness a dummy file with the right attributes is used to override the default version in libc. * sysdeps/arm/sysdep.h: (Tag_ABI_align8_preserved, Tag_ABI_align8_needed): Attributes added. * sysdeps/arm/elf/start.S: Likewise. * sysdeps/arm/eabi/abi-note.S: New file. * sysdeps/unix/sysv/linux/arm/eabi/internal_accept4.S: New file.
118 lines
3.3 KiB
C
118 lines
3.3 KiB
C
/* Assembler macros for ARM.
|
|
Copyright (C) 1997, 1998, 2003 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA. */
|
|
|
|
#include <sysdeps/generic/sysdep.h>
|
|
|
|
#if (!defined (__ARM_ARCH_2__) && !defined (__ARM_ARCH_3__) \
|
|
&& !defined (__ARM_ARCH_3M__) && !defined (__ARM_ARCH_4__))
|
|
# define __USE_BX__
|
|
#endif
|
|
|
|
#ifdef __ASSEMBLER__
|
|
|
|
/* Syntactic details of assembler. */
|
|
|
|
#ifdef HAVE_ELF
|
|
|
|
#define ALIGNARG(log2) log2
|
|
/* For ELF we need the `.type' directive to make shared libs work right. */
|
|
#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,%##typearg;
|
|
#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
|
|
|
|
/* In ELF C symbols are asm symbols. */
|
|
#undef NO_UNDERSCORES
|
|
#define NO_UNDERSCORES
|
|
|
|
#define PLTJMP(_x) _x##(PLT)
|
|
|
|
#else
|
|
|
|
#define ALIGNARG(log2) log2
|
|
#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
|
|
#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
|
|
|
|
#define PLTJMP(_x) _x
|
|
|
|
#endif
|
|
|
|
/* APCS-32 doesn't preserve the condition codes across function call. */
|
|
#ifdef __APCS_32__
|
|
#define LOADREGS(cond, base, reglist...)\
|
|
ldm##cond base,reglist
|
|
#ifdef __USE_BX__
|
|
#define RETINSTR(cond, reg) \
|
|
bx##cond reg
|
|
#define DO_RET(_reg) \
|
|
bx _reg
|
|
#else
|
|
#define RETINSTR(cond, reg) \
|
|
mov##cond pc, reg
|
|
#define DO_RET(_reg) \
|
|
mov pc, _reg
|
|
#endif
|
|
#else /* APCS-26 */
|
|
#define LOADREGS(cond, base, reglist...)\
|
|
ldm##cond base,reglist^
|
|
#define RETINSTR(cond, reg) \
|
|
mov##cond##s pc, reg
|
|
#define DO_RET(_reg) \
|
|
movs pc, _reg
|
|
#endif
|
|
|
|
/* Define an entry point visible from C. */
|
|
#define ENTRY(name) \
|
|
ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
|
|
ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function) \
|
|
.align ALIGNARG(4); \
|
|
C_LABEL(name) \
|
|
CALL_MCOUNT
|
|
|
|
#undef END
|
|
#define END(name) \
|
|
ASM_SIZE_DIRECTIVE(name)
|
|
|
|
/* If compiled for profiling, call `mcount' at the start of each function. */
|
|
#ifdef PROF
|
|
#define CALL_MCOUNT \
|
|
str lr,[sp, #-4]! ; \
|
|
bl PLTJMP(mcount) ; \
|
|
ldr lr, [sp], #4 ;
|
|
#else
|
|
#define CALL_MCOUNT /* Do nothing. */
|
|
#endif
|
|
|
|
#ifdef NO_UNDERSCORES
|
|
/* Since C identifiers are not normally prefixed with an underscore
|
|
on this system, the asm identifier `syscall_error' intrudes on the
|
|
C name space. Make sure we use an innocuous name. */
|
|
#define syscall_error __syscall_error
|
|
#define mcount _mcount
|
|
#endif
|
|
|
|
#if defined(__ARM_EABI__)
|
|
/* Tag_ABI_align8_preserved: This code preserves 8-byte
|
|
alignment in any callee. */
|
|
.eabi_attribute 25, 1
|
|
/* Tag_ABI_align8_needed: This code may require 8-byte alignment from
|
|
the caller. */
|
|
.eabi_attribute 24, 1
|
|
#endif
|
|
|
|
#endif /* __ASSEMBLER__ */
|