Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/z/codegen/S390PrivateLinkage.hpp
6004 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#ifndef S390PRIVATELINKAGE_INCL
24
#define S390PRIVATELINKAGE_INCL
25
26
#include "codegen/PrivateLinkage.hpp"
27
28
namespace TR { class S390JNICallDataSnippet; }
29
namespace TR { class AutomaticSymbol; }
30
namespace TR { class CodeGenerator; }
31
namespace TR { class RegisterDependencyConditions; }
32
namespace TR { class ResolvedMethodSymbol; }
33
namespace TR { class Snippet; }
34
35
36
namespace J9
37
{
38
39
namespace Z
40
{
41
42
////////////////////////////////////////////////////////////////////////////////
43
// J9::Z::PrivateLinkage Definition for J9
44
////////////////////////////////////////////////////////////////////////////////
45
46
class PrivateLinkage : public J9::PrivateLinkage
47
{
48
uint32_t _preservedRegisterMapForGC;
49
50
TR::RealRegister::RegNum _methodMetaDataRegister;
51
52
public:
53
54
PrivateLinkage(TR::CodeGenerator * cg, TR_LinkageConventions elc=TR_Private);
55
56
virtual void createPrologue(TR::Instruction * cursor);
57
virtual void createEpilogue(TR::Instruction * cursor);
58
59
/** \brief
60
* Align the stackIndex to a multiple of localObjectAlignment and update the numberOfSlotMapped.
61
*
62
* \param stackIndex
63
* The current stack index to be aligned to \p localObjectAlignment.
64
*
65
* \param localObjectAlignment
66
* The stack object alignment.
67
*/
68
void alignLocalsOffset(uint32_t &stackIndex, uint32_t localObjectAlignment);
69
70
void mapCompactedStack(TR::ResolvedMethodSymbol * symbol);
71
virtual void mapStack(TR::ResolvedMethodSymbol * symbol);
72
virtual void mapSingleAutomatic(TR::AutomaticSymbol * p, uint32_t & stackIndex);
73
void mapSingleAutomatic(TR::AutomaticSymbol * p, uint32_t size, uint32_t & stackIndex);
74
uint32_t getS390RoundedSize(uint32_t size);
75
virtual bool hasToBeOnStack(TR::ParameterSymbol * parm);
76
virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol * method);
77
virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol *method, List<TR::ParameterSymbol>&parmList);
78
79
virtual void initS390RealRegisterLinkage();
80
virtual void doNotKillSpecialRegsForBuildArgs (TR::Linkage *linkage, bool isFastJNI, int64_t &killMask);
81
virtual void addSpecialRegDepsForBuildArgs(TR::Node * callNode, TR::RegisterDependencyConditions * dependencies, int32_t& from, int32_t step);
82
virtual int32_t storeExtraEnvRegForBuildArgs(TR::Node * callNode, TR::Linkage* linkage, TR::RegisterDependencyConditions * dependencies, bool isFastJNI, int32_t stackOffset, int8_t gprSize, uint32_t &numIntegerArgs);
83
virtual int64_t addFECustomizedReturnRegDependency(int64_t killMask, TR::Linkage* linkage, TR::DataType resType, TR::RegisterDependencyConditions * dependencies);
84
85
virtual void buildVirtualDispatch(TR::Node * callNode, TR::RegisterDependencyConditions * dependencies,
86
TR::Register * vftReg, uint32_t sizeOfArguments);
87
88
virtual TR::RealRegister::RegNum setMethodMetaDataRegister(TR::RealRegister::RegNum r) { return _methodMetaDataRegister = r; }
89
virtual TR::RealRegister::RegNum getMethodMetaDataRegister() { return _methodMetaDataRegister; }
90
virtual TR::RealRegister *getMethodMetaDataRealRegister() {return getRealRegister(_methodMetaDataRegister);}
91
92
virtual uint32_t setPreservedRegisterMapForGC(uint32_t m) { return _preservedRegisterMapForGC = m; }
93
virtual uint32_t getPreservedRegisterMapForGC() { return _preservedRegisterMapForGC; }
94
95
virtual TR::RealRegister::RegNum getSystemStackPointerRegister();
96
virtual TR::RealRegister *getSystemStackPointerRealRegister() {return getRealRegister(getSystemStackPointerRegister());}
97
98
virtual int32_t setupLiteralPoolRegister(TR::Snippet *firstSnippet);
99
100
//called by buildNativeDispatch
101
virtual void setupRegisterDepForLinkage(TR::Node *, TR_DispatchType, TR::RegisterDependencyConditions * &, int64_t &, TR::SystemLinkage *, TR::Node * &, bool &, TR::Register **, TR::Register *&);
102
virtual void setupBuildArgForLinkage(TR::Node *, TR_DispatchType, TR::RegisterDependencyConditions *, bool, bool, int64_t &, TR::Node *, bool, TR::SystemLinkage *);
103
104
virtual int32_t calculateRegisterSaveSize(TR::RealRegister::RegNum f,
105
TR::RealRegister::RegNum l,
106
int32_t &rsd,
107
int32_t &numInts, int32_t &numFloats);
108
109
protected:
110
111
virtual TR::Register * buildIndirectDispatch(TR::Node * callNode);
112
virtual TR::Register * buildDirectDispatch(TR::Node * callNode);
113
TR::Register * buildJNIDispatch(TR::Node * callNode);
114
TR::Instruction * buildDirectCall(TR::Node * callNode, TR::SymbolReference * callSymRef,
115
TR::RegisterDependencyConditions * dependencies, int32_t argSize);
116
117
void callPreJNICallOffloadCheck(TR::Node * callNode);
118
void callPostJNICallOffloadCheck(TR::Node * callNode);
119
void collapseJNIReferenceFrame(TR::Node * callNode, TR::RealRegister * javaStackPointerRealRegister,
120
TR::Register * javaLitPoolVirtualRegister, TR::Register * tempReg);
121
122
void setupJNICallOutFrame(TR::Node * callNode,
123
TR::RealRegister * javaStackPointerRealRegister,
124
TR::Register * methodMetaDataVirtualRegister,
125
TR::LabelSymbol * returnFromJNICallLabel,
126
TR::S390JNICallDataSnippet *jniCallDataSnippet);
127
128
};
129
130
131
////////////////////////////////////////////////////////////////////////////////
132
// J9::Z::HelperLinkage Definition for J9
133
////////////////////////////////////////////////////////////////////////////////
134
135
class HelperLinkage : public PrivateLinkage
136
{
137
public:
138
139
HelperLinkage(TR::CodeGenerator * cg)
140
: PrivateLinkage(cg,TR_Helper)
141
{
142
setProperty(ParmsInReverseOrder);
143
}
144
};
145
146
147
class JNILinkage : public PrivateLinkage
148
{
149
public:
150
151
JNILinkage(TR::CodeGenerator * cg, TR_LinkageConventions elc=TR_Private);
152
virtual TR::Register * buildDirectDispatch(TR::Node * callNode);
153
154
/**
155
* \brief
156
* JNI return value processing:
157
* 1) Unwrap return value if needed for object return types, or
158
* 2) Enforce a return value of 0 or 1 for boolean return type
159
*
160
* \param callNode
161
* The JNI call node to be evaluated.
162
*
163
* \param cg
164
* The code generator object.
165
*
166
* \param javaReturnRegister
167
* Register for the JNI call return value.
168
*/
169
void processJNIReturnValue(TR::Node * callNode,
170
TR::CodeGenerator* cg,
171
TR::Register* javaReturnRegister);
172
173
void checkException(TR::Node * callNode, TR::Register *methodMetaDataVirtualRegister, TR::Register * tempReg);
174
void releaseVMAccessMask(TR::Node * callNode, TR::Register * methodMetaDataVirtualRegister,
175
TR::Register * methodAddressReg, TR::Register * javaLitOffsetReg, TR::S390JNICallDataSnippet * jniCallDataSnippet, TR::RegisterDependencyConditions * deps);
176
void acquireVMAccessMask(TR::Node * callNode, TR::Register * javaLitPoolVirtualRegister,
177
TR::Register * methodMetaDataVirtualRegister, TR::Register * methodAddressReg, TR::Register * javaLitOffsetReg);
178
179
#ifdef J9VM_INTERP_ATOMIC_FREE_JNI
180
void releaseVMAccessMaskAtomicFree(TR::Node * callNode,
181
TR::Register * methodMetaDataVirtualRegister,
182
TR::Register * tempReg1);
183
184
void acquireVMAccessMaskAtomicFree(TR::Node * callNode,
185
TR::Register * methodMetaDataVirtualRegister,
186
TR::Register * tempReg1);
187
#endif /* J9VM_INTERP_ATOMIC_FREE_JNI */
188
};
189
190
}
191
192
}
193
194
#endif /* S390PRIVATELINKAGE_INCL */
195
196