File: xray_trampoline_s390x.S

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,245,028 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,675; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (176 lines) | stat: -rw-r--r-- 5,992 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
//===-- xray_trampoline_s390x.s ---------------------------------*- ASM -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file is a part of XRay, a dynamic runtime instrumentation system.
//
// This implements the s390x-specific assembler for the trampolines.
// 2 versions of the functions are provided: one which does not store the
// vector registers, and one which does store them. The compiler decides
// which to call based on the availability of the vector extension.
//
//===----------------------------------------------------------------------===//

    .text

// Minimal stack frame size
#define STACKSZ  160

// Minimal stack frame size (160) plus space for 8 vector registers a 16 bytes.
#define STACKSZ_VEC  288

//===----------------------------------------------------------------------===//

    .globl  __xray_FunctionEntry
    .p2align    4
    .type   __xray_FunctionEntry,@function
__xray_FunctionEntry:
    # The registers r2-15 of the instrumented function are already saved in the
    # stack frame. On entry, r2 contains the function id, and %r14 the address
    # of the first instruction of the instrumented function.
    # Register r14 will be stored in the slot reserved for compiler use.
    stg     %r14, 8(%r15)
    std     %f0, 128(%r15)
    std     %f2, 136(%r15)
    std     %f4, 144(%r15)
    std     %f6, 152(%r15)
    aghi    %r15, -STACKSZ

    lgrl    %r1, _ZN6__xray19XRayPatchedFunctionE@GOT
    ltg     %r1, 0(%r1)
    je      .Lrestore0

    # Set r3 to XRayEntryType::ENTRY = 0.
    # The FuncId is still stored in r2.
    lghi    %r3, 0
    basr    %r14, %r1

.Lrestore0:
    ld      %f6, STACKSZ+152(%r15)
    ld      %f4, STACKSZ+144(%r15)
    ld      %f2, STACKSZ+136(%r15)
    ld      %f0, STACKSZ+128(%r15)
    lmg     %r1, %r15, STACKSZ+8(%r15)
    br      %r1
.Lfunc_end0:
    .size    __xray_FunctionEntry, .Lfunc_end0-__xray_FunctionEntry

//===----------------------------------------------------------------------===//

    .globl  __xray_FunctionEntryVec
    .p2align    4
    .type   __xray_FunctionEntryVec,@function
__xray_FunctionEntryVec:
    # The registers r2-15 of the instrumented function are already saved in the
    # stack frame. On entry, r2 contains the function id, and %r14 the address
    # of the first instruction of the instrumented function.
    # Register r14 will be stored in the slot reserved for compiler use.
    stg     %r14, 8(%r15)
    std     %f0, 128(%r15)
    std     %f2, 136(%r15)
    std     %f4, 144(%r15)
    std     %f6, 152(%r15)
    aghi    %r15, -STACKSZ_VEC
    vstm    %v24, %v31, 160(%r15)

    lgrl    %r1, _ZN6__xray19XRayPatchedFunctionE@GOT
    ltg     %r1, 0(%r1)
    je      .Lrestore1

    # Set r3 to XRayEntryType::ENTRY = 0.
    # The FuncId is still stored in r2.
    lghi    %r3, 0
    basr    %r14, %r1

.Lrestore1:
    vlm     %v24, %v31, 160(%r15)
    ld      %f6, STACKSZ_VEC+152(%r15)
    ld      %f4, STACKSZ_VEC+144(%r15)
    ld      %f2, STACKSZ_VEC+136(%r15)
    ld      %f0, STACKSZ_VEC+128(%r15)
    lmg     %r1, %r15, STACKSZ_VEC+8(%r15)
    br      %r1
.Lfunc_end1:
    .size    __xray_FunctionEntryVec, .Lfunc_end1-__xray_FunctionEntryVec

//===----------------------------------------------------------------------===//

    .globl  __xray_FunctionExit
    .p2align    4
    .type   __xray_FunctionExit,@function
__xray_FunctionExit:
    # The registers r2-15 of the instrumented function are already saved in the
    # stack frame. On entry, the register r2 contains the function id.
    # At the end, the function jumps to the address saved in the slot for r14,
    # which contains the return address into the caller of the instrumented
    # function.
    std     %f0, 128(%r15)
    std     %f2, 136(%r15)
    std     %f4, 144(%r15)
    std     %f6, 152(%r15)
    aghi    %r15, -STACKSZ

    lgrl    %r1, _ZN6__xray19XRayPatchedFunctionE@GOT
    ltg     %r1, 0(%r1)
    je      .Lrestore2

    # Set r3 to XRayEntryType::EXIT = 1.
    # The FuncId is still stored in r2.
    lghi    %r3, 1
    basr    %r14, %r1

.Lrestore2:
    ld      %f6, STACKSZ+152(%r15)
    ld      %f4, STACKSZ+144(%r15)
    ld      %f2, STACKSZ+136(%r15)
    ld      %f0, STACKSZ+128(%r15)
    lmg     %r2, %r15, STACKSZ+16(%r15)
    br      %r14
.Lfunc_end2:
    .size    __xray_FunctionExit, .Lfunc_end2-__xray_FunctionExit

//===----------------------------------------------------------------------===//

    .globl  __xray_FunctionExitVec
    .p2align    4
    .type   __xray_FunctionExitVec,@function
__xray_FunctionExitVec:
    # The registers r2-15 of the instrumented function are already saved in the
    # stack frame. On entry, the register r2 contains the function id.
    # At the end, the function jumps to the address saved in the slot for r14,
    # which contains the return address into the caller of the instrumented
    # function.
    std     %f0, 128(%r15)
    std     %f2, 136(%r15)
    std     %f4, 144(%r15)
    std     %f6, 152(%r15)
    aghi    %r15, -STACKSZ_VEC
    vstm    %v24, %v31, 160(%r15)

    lgrl    %r1, _ZN6__xray19XRayPatchedFunctionE@GOT
    ltg     %r1, 0(%r1)
    je      .Lrestore3

    # Set r3 to XRayEntryType::EXIT = 1.
    # The FuncId is still stored in r2.
    lghi    %r3, 1
    basr    %r14, %r1

.Lrestore3:
    vlm     %v24, %v31, 160(%r15)
    ld      %f6, STACKSZ_VEC+152(%r15)
    ld      %f4, STACKSZ_VEC+144(%r15)
    ld      %f2, STACKSZ_VEC+136(%r15)
    ld      %f0, STACKSZ_VEC+128(%r15)
    lmg     %r2, %r15, STACKSZ_VEC+16(%r15)
    br      %r14
.Lfunc_end3:
    .size    __xray_FunctionExit, .Lfunc_end3-__xray_FunctionExit

//===----------------------------------------------------------------------===//

    .section    ".note.GNU-stack","",@progbits