Path: blob/master/runtime/compiler/z/codegen/S390PrivateLinkage.hpp
6004 views
/*******************************************************************************1* Copyright (c) 2000, 2021 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* 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-exception20*******************************************************************************/2122#ifndef S390PRIVATELINKAGE_INCL23#define S390PRIVATELINKAGE_INCL2425#include "codegen/PrivateLinkage.hpp"2627namespace TR { class S390JNICallDataSnippet; }28namespace TR { class AutomaticSymbol; }29namespace TR { class CodeGenerator; }30namespace TR { class RegisterDependencyConditions; }31namespace TR { class ResolvedMethodSymbol; }32namespace TR { class Snippet; }333435namespace J936{3738namespace Z39{4041////////////////////////////////////////////////////////////////////////////////42// J9::Z::PrivateLinkage Definition for J943////////////////////////////////////////////////////////////////////////////////4445class PrivateLinkage : public J9::PrivateLinkage46{47uint32_t _preservedRegisterMapForGC;4849TR::RealRegister::RegNum _methodMetaDataRegister;5051public:5253PrivateLinkage(TR::CodeGenerator * cg, TR_LinkageConventions elc=TR_Private);5455virtual void createPrologue(TR::Instruction * cursor);56virtual void createEpilogue(TR::Instruction * cursor);5758/** \brief59* Align the stackIndex to a multiple of localObjectAlignment and update the numberOfSlotMapped.60*61* \param stackIndex62* The current stack index to be aligned to \p localObjectAlignment.63*64* \param localObjectAlignment65* The stack object alignment.66*/67void alignLocalsOffset(uint32_t &stackIndex, uint32_t localObjectAlignment);6869void mapCompactedStack(TR::ResolvedMethodSymbol * symbol);70virtual void mapStack(TR::ResolvedMethodSymbol * symbol);71virtual void mapSingleAutomatic(TR::AutomaticSymbol * p, uint32_t & stackIndex);72void mapSingleAutomatic(TR::AutomaticSymbol * p, uint32_t size, uint32_t & stackIndex);73uint32_t getS390RoundedSize(uint32_t size);74virtual bool hasToBeOnStack(TR::ParameterSymbol * parm);75virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol * method);76virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol *method, List<TR::ParameterSymbol>&parmList);7778virtual void initS390RealRegisterLinkage();79virtual void doNotKillSpecialRegsForBuildArgs (TR::Linkage *linkage, bool isFastJNI, int64_t &killMask);80virtual void addSpecialRegDepsForBuildArgs(TR::Node * callNode, TR::RegisterDependencyConditions * dependencies, int32_t& from, int32_t step);81virtual int32_t storeExtraEnvRegForBuildArgs(TR::Node * callNode, TR::Linkage* linkage, TR::RegisterDependencyConditions * dependencies, bool isFastJNI, int32_t stackOffset, int8_t gprSize, uint32_t &numIntegerArgs);82virtual int64_t addFECustomizedReturnRegDependency(int64_t killMask, TR::Linkage* linkage, TR::DataType resType, TR::RegisterDependencyConditions * dependencies);8384virtual void buildVirtualDispatch(TR::Node * callNode, TR::RegisterDependencyConditions * dependencies,85TR::Register * vftReg, uint32_t sizeOfArguments);8687virtual TR::RealRegister::RegNum setMethodMetaDataRegister(TR::RealRegister::RegNum r) { return _methodMetaDataRegister = r; }88virtual TR::RealRegister::RegNum getMethodMetaDataRegister() { return _methodMetaDataRegister; }89virtual TR::RealRegister *getMethodMetaDataRealRegister() {return getRealRegister(_methodMetaDataRegister);}9091virtual uint32_t setPreservedRegisterMapForGC(uint32_t m) { return _preservedRegisterMapForGC = m; }92virtual uint32_t getPreservedRegisterMapForGC() { return _preservedRegisterMapForGC; }9394virtual TR::RealRegister::RegNum getSystemStackPointerRegister();95virtual TR::RealRegister *getSystemStackPointerRealRegister() {return getRealRegister(getSystemStackPointerRegister());}9697virtual int32_t setupLiteralPoolRegister(TR::Snippet *firstSnippet);9899//called by buildNativeDispatch100virtual void setupRegisterDepForLinkage(TR::Node *, TR_DispatchType, TR::RegisterDependencyConditions * &, int64_t &, TR::SystemLinkage *, TR::Node * &, bool &, TR::Register **, TR::Register *&);101virtual void setupBuildArgForLinkage(TR::Node *, TR_DispatchType, TR::RegisterDependencyConditions *, bool, bool, int64_t &, TR::Node *, bool, TR::SystemLinkage *);102103virtual int32_t calculateRegisterSaveSize(TR::RealRegister::RegNum f,104TR::RealRegister::RegNum l,105int32_t &rsd,106int32_t &numInts, int32_t &numFloats);107108protected:109110virtual TR::Register * buildIndirectDispatch(TR::Node * callNode);111virtual TR::Register * buildDirectDispatch(TR::Node * callNode);112TR::Register * buildJNIDispatch(TR::Node * callNode);113TR::Instruction * buildDirectCall(TR::Node * callNode, TR::SymbolReference * callSymRef,114TR::RegisterDependencyConditions * dependencies, int32_t argSize);115116void callPreJNICallOffloadCheck(TR::Node * callNode);117void callPostJNICallOffloadCheck(TR::Node * callNode);118void collapseJNIReferenceFrame(TR::Node * callNode, TR::RealRegister * javaStackPointerRealRegister,119TR::Register * javaLitPoolVirtualRegister, TR::Register * tempReg);120121void setupJNICallOutFrame(TR::Node * callNode,122TR::RealRegister * javaStackPointerRealRegister,123TR::Register * methodMetaDataVirtualRegister,124TR::LabelSymbol * returnFromJNICallLabel,125TR::S390JNICallDataSnippet *jniCallDataSnippet);126127};128129130////////////////////////////////////////////////////////////////////////////////131// J9::Z::HelperLinkage Definition for J9132////////////////////////////////////////////////////////////////////////////////133134class HelperLinkage : public PrivateLinkage135{136public:137138HelperLinkage(TR::CodeGenerator * cg)139: PrivateLinkage(cg,TR_Helper)140{141setProperty(ParmsInReverseOrder);142}143};144145146class JNILinkage : public PrivateLinkage147{148public:149150JNILinkage(TR::CodeGenerator * cg, TR_LinkageConventions elc=TR_Private);151virtual TR::Register * buildDirectDispatch(TR::Node * callNode);152153/**154* \brief155* JNI return value processing:156* 1) Unwrap return value if needed for object return types, or157* 2) Enforce a return value of 0 or 1 for boolean return type158*159* \param callNode160* The JNI call node to be evaluated.161*162* \param cg163* The code generator object.164*165* \param javaReturnRegister166* Register for the JNI call return value.167*/168void processJNIReturnValue(TR::Node * callNode,169TR::CodeGenerator* cg,170TR::Register* javaReturnRegister);171172void checkException(TR::Node * callNode, TR::Register *methodMetaDataVirtualRegister, TR::Register * tempReg);173void releaseVMAccessMask(TR::Node * callNode, TR::Register * methodMetaDataVirtualRegister,174TR::Register * methodAddressReg, TR::Register * javaLitOffsetReg, TR::S390JNICallDataSnippet * jniCallDataSnippet, TR::RegisterDependencyConditions * deps);175void acquireVMAccessMask(TR::Node * callNode, TR::Register * javaLitPoolVirtualRegister,176TR::Register * methodMetaDataVirtualRegister, TR::Register * methodAddressReg, TR::Register * javaLitOffsetReg);177178#ifdef J9VM_INTERP_ATOMIC_FREE_JNI179void releaseVMAccessMaskAtomicFree(TR::Node * callNode,180TR::Register * methodMetaDataVirtualRegister,181TR::Register * tempReg1);182183void acquireVMAccessMaskAtomicFree(TR::Node * callNode,184TR::Register * methodMetaDataVirtualRegister,185TR::Register * tempReg1);186#endif /* J9VM_INTERP_ATOMIC_FREE_JNI */187};188189}190191}192193#endif /* S390PRIVATELINKAGE_INCL */194195196