Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/z/codegen/S390CHelperLinkage.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
#include "codegen/Linkage.hpp"
24
25
namespace TR { class AutomaticSymbol; }
26
namespace TR { class CodeGenerator; }
27
namespace TR { class RegisterDependencyConditions; }
28
namespace TR { class ResolvedMethodSymbol; }
29
namespace TR { class Snippet; }
30
31
namespace J9
32
{
33
34
namespace Z
35
{
36
37
class CHelperLinkage : public TR::Linkage
38
{
39
uint32_t _preservedRegisterMapForGC;
40
TR::RealRegister::RegNum _methodMetaDataRegister;
41
TR::RealRegister::RegNum _returnAddressRegister;
42
// Following Regs are needed only in the case of zOS.
43
#if defined(J9ZOS390)
44
TR::RealRegister::RegNum _DSAPointerRegister;
45
#if defined(TR_HOST_32BIT)
46
TR::RealRegister::RegNum _CAAPointerRegister;
47
#endif
48
#endif
49
public:
50
51
CHelperLinkage(TR::CodeGenerator * cg, TR_LinkageConventions elc=TR_Helper);
52
53
virtual void createPrologue(TR::Instruction * cursor) { TR_UNIMPLEMENTED(); }
54
virtual void createEpilogue(TR::Instruction * cursor) { TR_UNIMPLEMENTED(); }
55
56
virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol * method)
57
{
58
TR_ASSERT_FATAL(false, "CHelperLinkage should only be used for call-outs");
59
}
60
61
virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol *method, List<TR::ParameterSymbol>&parmList)
62
{
63
TR_ASSERT_FATAL(false, "CHelperLinkage should only be used for call-outs");
64
}
65
66
virtual void mapStack(TR::ResolvedMethodSymbol *symbol) { TR_UNIMPLEMENTED(); }
67
virtual void mapSingleAutomatic(TR::AutomaticSymbol *p, uint32_t &stackIndex) { TR_UNIMPLEMENTED(); }
68
virtual bool hasToBeOnStack(TR::ParameterSymbol * parm) { TR_UNIMPLEMENTED(); return false; }
69
virtual void initS390RealRegisterLinkage() { TR_UNIMPLEMENTED(); }
70
virtual TR::RealRegister::RegNum setMethodMetaDataRegister(TR::RealRegister::RegNum r) { return _methodMetaDataRegister = r; }
71
virtual TR::RealRegister::RegNum getMethodMetaDataRegister() { return _methodMetaDataRegister; }
72
virtual TR::RealRegister::RegNum setReturnAddressRegister(TR::RealRegister::RegNum r) { return _returnAddressRegister = r; }
73
virtual TR::RealRegister::RegNum getReturnAddressRegister() { return _returnAddressRegister; }
74
#if defined(J9ZOS390)
75
virtual TR::RealRegister::RegNum setDSAPointerRegister(TR::RealRegister::RegNum r) { return _DSAPointerRegister = r; }
76
virtual TR::RealRegister::RegNum getDSAPointerRegister() { return _DSAPointerRegister; }
77
#if defined(TR_HOST_32BIT)
78
virtual TR::RealRegister::RegNum setCAAPointerRegister(TR::RealRegister::RegNum r) { return _CAAPointerRegister = r; }
79
virtual TR::RealRegister::RegNum getCAAPointerRegister() { return _CAAPointerRegister; }
80
#endif
81
#endif
82
/** \brief
83
* Setter for private member _preservedRegisterMapForGC
84
*
85
* \param m
86
* An 32-bit unsigned mapping for GC marking all preserved registers
87
*
88
* \return
89
* Returns _preservedRegisterMapForGC after setting it to m
90
*/
91
virtual uint32_t setPreservedRegisterMapForGC(uint32_t m) {return _preservedRegisterMapForGC = m; }
92
/** \brief
93
* Getter for private member _preservedRegisterMapForGC
94
*
95
* \return
96
* Returns private member _preservedRegisterMapForGC
97
*/
98
virtual uint32_t getPreservedRegisterMapForGC() {return _preservedRegisterMapForGC; }
99
100
virtual TR::Register * buildIndirectDispatch(TR::Node * callNode)
101
{
102
TR_ASSERT(false, "Indirect dispatch is currently not supported");
103
return NULL;
104
}
105
106
/** \brief
107
* Builds the direct dispatch sequence for given node using C Helper linkage
108
*
109
* \param callNode
110
* TR::Node* for which helper dispatch sequence will be generated
111
*
112
* \return
113
* Returns TR::Register* which contains return value from helper call
114
*/
115
virtual TR::Register * buildDirectDispatch(TR::Node * callNode)
116
{
117
return buildDirectDispatch(callNode, static_cast<TR::RegisterDependencyConditions**>(NULL));
118
}
119
120
/** \brief
121
* Overloaded function that builds the direct dispatch sequence for given node using C Helper linkage
122
* with additional returnReg parameter from consumer
123
*
124
* \param callNode
125
* TR::Node* for which helper dispatch sequence will be generated
126
*
127
* \param returnReg
128
* TR::Register* allocated by consumer of this API. Dispatch sequence will use this register to store return value from helper
129
* instead from allocating new register.
130
*
131
* \return
132
* Returns TR::Register* which contains return value from helper call
133
*/
134
TR::Register* buildDirectDispatch(TR::Node *callNode, TR::Register *returnReg)
135
{
136
return buildDirectDispatch(callNode, NULL, returnReg);
137
}
138
139
TR::Register *buildDirectDispatch(TR::Node *callNode, TR::RegisterDependencyConditions** deps, TR::Register *returnReg=NULL);
140
};
141
142
}
143
144
}
145
146