diff options
Diffstat (limited to 'sysdeps/aarch64/sysdep.h')
-rw-r--r-- | sysdeps/aarch64/sysdep.h | 90 |
1 files changed, 77 insertions, 13 deletions
diff --git a/sysdeps/aarch64/sysdep.h b/sysdeps/aarch64/sysdep.h index 6b728ec651..5b30709436 100644 --- a/sysdeps/aarch64/sysdep.h +++ b/sysdeps/aarch64/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997-2016 Free Software Foundation, Inc. +/* Copyright (C) 1997-2018 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -16,8 +16,25 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _AARCH64_SYSDEP_H +#define _AARCH64_SYSDEP_H + #include <sysdeps/generic/sysdep.h> +#ifdef __LP64__ +# define AARCH64_R(NAME) R_AARCH64_ ## NAME +# define PTR_REG(n) x##n +# define PTR_LOG_SIZE 3 +# define DELOUSE(n) +#else +# define AARCH64_R(NAME) R_AARCH64_P32_ ## NAME +# define PTR_REG(n) w##n +# define PTR_LOG_SIZE 2 +# define DELOUSE(n) mov w##n, w##n +#endif + +#define PTR_SIZE (1<<PTR_LOG_SIZE) + #ifdef __ASSEMBLER__ /* Syntactic details of assembler. */ @@ -66,9 +83,38 @@ /* If compiled for profiling, call `mcount' at the start of each function. */ #ifdef PROF # define CALL_MCOUNT \ - str x30, [sp, #-16]!; \ + str x30, [sp, #-80]!; \ + cfi_adjust_cfa_offset (80); \ + cfi_rel_offset (x30, 0); \ + stp x0, x1, [sp, #16]; \ + cfi_rel_offset (x0, 16); \ + cfi_rel_offset (x1, 24); \ + stp x2, x3, [sp, #32]; \ + cfi_rel_offset (x2, 32); \ + cfi_rel_offset (x3, 40); \ + stp x4, x5, [sp, #48]; \ + cfi_rel_offset (x4, 48); \ + cfi_rel_offset (x5, 56); \ + stp x6, x7, [sp, #64]; \ + cfi_rel_offset (x6, 64); \ + cfi_rel_offset (x7, 72); \ + mov x0, x30; \ bl mcount; \ - ldr x30, [sp], #16 ; + ldp x0, x1, [sp, #16]; \ + cfi_restore (x0); \ + cfi_restore (x1); \ + ldp x2, x3, [sp, #32]; \ + cfi_restore (x2); \ + cfi_restore (x3); \ + ldp x4, x5, [sp, #48]; \ + cfi_restore (x4); \ + cfi_restore (x5); \ + ldp x6, x7, [sp, #64]; \ + cfi_restore (x6); \ + cfi_restore (x7); \ + ldr x30, [sp], #80; \ + cfi_adjust_cfa_offset (-80); \ + cfi_restore (x30); #else # define CALL_MCOUNT /* Do nothing. */ #endif @@ -78,16 +124,32 @@ # define L(name) .L##name #endif -/* Load or store to/from a pc-relative EXPR into/from R, using T. */ -#define LDST_PCREL(OP, R, T, EXPR) \ - adrp T, EXPR; \ - OP R, [T, #:lo12:EXPR];\ - -/* Load or store to/from a got-relative EXPR into/from R, using T. */ -#define LDST_GLOBAL(OP, R, T, EXPR) \ - adrp T, :got:EXPR; \ - ldr T, [T, #:got_lo12:EXPR];\ - OP R, [T]; +/* Load or store to/from a pc-relative EXPR into/from R, using T. + Note R and T are register numbers and not register names. */ +#define LDST_PCREL(OP, R, T, EXPR) \ + adrp x##T, EXPR; \ + OP PTR_REG (R), [x##T, #:lo12:EXPR]; \ + +/* Load or store to/from a got-relative EXPR into/from R, using T. + Note R and T are register numbers and not register names. */ +#define LDST_GLOBAL(OP, R, T, EXPR) \ + adrp x##T, :got:EXPR; \ + ldr PTR_REG (T), [x##T, #:got_lo12:EXPR]; \ + OP PTR_REG (R), [x##T]; + +/* Load an immediate into R. + Note R is a register number and not a register name. */ +#ifdef __LP64__ +# define MOVL(R, NAME) \ + movz PTR_REG (R), #:abs_g3:NAME; \ + movk PTR_REG (R), #:abs_g2_nc:NAME; \ + movk PTR_REG (R), #:abs_g1_nc:NAME; \ + movk PTR_REG (R), #:abs_g0_nc:NAME; +#else +# define MOVL(R, NAME) \ + movz PTR_REG (R), #:abs_g1:NAME; \ + movk PTR_REG (R), #:abs_g0_nc:NAME; +#endif /* Since C identifiers are not normally prefixed with an underscore on this system, the asm identifier `syscall_error' intrudes on the @@ -96,3 +158,5 @@ #define mcount _mcount #endif /* __ASSEMBLER__ */ + +#endif /* _AARCH64_SYSDEP_H */ |