1 /* IBM Z support code for TLS offsets. 2 Copyright (C) 2020-2022 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 GCC is free software; you can redistribute it and/or modify it under 7 the terms of the GNU General Public License as published by the Free 8 Software Foundation; either version 3, or (at your option) any later 9 version. 10 11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12 WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 for more details. 15 16 Under Section 7 of GPL version 3, you are granted additional 17 permissions described in the GCC Runtime Library Exception, version 18 3.1, as published by the Free Software Foundation. 19 20 You should have received a copy of the GNU General Public License and 21 a copy of the GCC Runtime Library Exception along with this program; 22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 <http://www.gnu.org/licenses/>. */ 24 25 /* __tls_get_offset expects the GOT pointer in %r12 and adds 26 it to its argument in %r2. In order to get the offset of 27 ti, we load it into %r2, subtract the current %r12 from %r2 28 so the addition will result in a nop (%r2 - %r12 + %r12). 29 30 Note: This file is shared between systemz and s390 as the 31 same file is used in multilib case for s390x and s390. */ 32 33 #include "../common/threadasm.S" 34 35 .text 36 .globl CSYM(__ibmz_get_tls_offset) 37 .type CSYM(__ibmz_get_tls_offset), @function 38 .align 8 39 CSYM(__ibmz_get_tls_offset): 40 .cfi_startproc 41 42 #ifdef __s390x__ 43 .machinemode zarch 44 stmg %r14,%r15,112(%r15) 45 .cfi_offset 14, -48 46 .cfi_offset 15, -40 47 aghi %r15,-160 48 .cfi_def_cfa_offset 320 49 sgr %r2,%r12 50 brasl %r14,__tls_get_offset@PLT 51 lg %r4,272(%r15) 52 lmg %r14,%r15,272(%r15) 53 .cfi_restore 15 54 .cfi_restore 14 55 .cfi_def_cfa_offset 160 56 br %r4 57 #else 58 .machinemode esa 59 stm %r12,%r15,48(%r15) 60 .cfi_offset 12, -48 61 .cfi_offset 13, -44 62 .cfi_offset 14, -40 63 .cfi_offset 15, -36 64 ahi %r15,-96 65 .cfi_def_cfa_offset 192 66 larl %r12,_GLOBAL_OFFSET_TABLE_ 67 sr %r2,%r12 68 brasl %r14,__tls_get_offset@PLT 69 l %r4,152(%r15) 70 lm %r12,%r15,144(%r15) 71 .cfi_restore 15 72 .cfi_restore 14 73 .cfi_restore 13 74 .cfi_restore 12 75 .cfi_def_cfa_offset 96 76 br %r4 77 #endif 78 .cfi_endproc 79 .size __ibmz_get_tls_offset, .-__ibmz_get_tls_offset 80