Path: blob/master/runtime/compiler/z/codegen/S390CHelperLinkage.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#include "codegen/Linkage.hpp"2324namespace TR { class AutomaticSymbol; }25namespace TR { class CodeGenerator; }26namespace TR { class RegisterDependencyConditions; }27namespace TR { class ResolvedMethodSymbol; }28namespace TR { class Snippet; }2930namespace J931{3233namespace Z34{3536class CHelperLinkage : public TR::Linkage37{38uint32_t _preservedRegisterMapForGC;39TR::RealRegister::RegNum _methodMetaDataRegister;40TR::RealRegister::RegNum _returnAddressRegister;41// Following Regs are needed only in the case of zOS.42#if defined(J9ZOS390)43TR::RealRegister::RegNum _DSAPointerRegister;44#if defined(TR_HOST_32BIT)45TR::RealRegister::RegNum _CAAPointerRegister;46#endif47#endif48public:4950CHelperLinkage(TR::CodeGenerator * cg, TR_LinkageConventions elc=TR_Helper);5152virtual void createPrologue(TR::Instruction * cursor) { TR_UNIMPLEMENTED(); }53virtual void createEpilogue(TR::Instruction * cursor) { TR_UNIMPLEMENTED(); }5455virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol * method)56{57TR_ASSERT_FATAL(false, "CHelperLinkage should only be used for call-outs");58}5960virtual void setParameterLinkageRegisterIndex(TR::ResolvedMethodSymbol *method, List<TR::ParameterSymbol>&parmList)61{62TR_ASSERT_FATAL(false, "CHelperLinkage should only be used for call-outs");63}6465virtual void mapStack(TR::ResolvedMethodSymbol *symbol) { TR_UNIMPLEMENTED(); }66virtual void mapSingleAutomatic(TR::AutomaticSymbol *p, uint32_t &stackIndex) { TR_UNIMPLEMENTED(); }67virtual bool hasToBeOnStack(TR::ParameterSymbol * parm) { TR_UNIMPLEMENTED(); return false; }68virtual void initS390RealRegisterLinkage() { TR_UNIMPLEMENTED(); }69virtual TR::RealRegister::RegNum setMethodMetaDataRegister(TR::RealRegister::RegNum r) { return _methodMetaDataRegister = r; }70virtual TR::RealRegister::RegNum getMethodMetaDataRegister() { return _methodMetaDataRegister; }71virtual TR::RealRegister::RegNum setReturnAddressRegister(TR::RealRegister::RegNum r) { return _returnAddressRegister = r; }72virtual TR::RealRegister::RegNum getReturnAddressRegister() { return _returnAddressRegister; }73#if defined(J9ZOS390)74virtual TR::RealRegister::RegNum setDSAPointerRegister(TR::RealRegister::RegNum r) { return _DSAPointerRegister = r; }75virtual TR::RealRegister::RegNum getDSAPointerRegister() { return _DSAPointerRegister; }76#if defined(TR_HOST_32BIT)77virtual TR::RealRegister::RegNum setCAAPointerRegister(TR::RealRegister::RegNum r) { return _CAAPointerRegister = r; }78virtual TR::RealRegister::RegNum getCAAPointerRegister() { return _CAAPointerRegister; }79#endif80#endif81/** \brief82* Setter for private member _preservedRegisterMapForGC83*84* \param m85* An 32-bit unsigned mapping for GC marking all preserved registers86*87* \return88* Returns _preservedRegisterMapForGC after setting it to m89*/90virtual uint32_t setPreservedRegisterMapForGC(uint32_t m) {return _preservedRegisterMapForGC = m; }91/** \brief92* Getter for private member _preservedRegisterMapForGC93*94* \return95* Returns private member _preservedRegisterMapForGC96*/97virtual uint32_t getPreservedRegisterMapForGC() {return _preservedRegisterMapForGC; }9899virtual TR::Register * buildIndirectDispatch(TR::Node * callNode)100{101TR_ASSERT(false, "Indirect dispatch is currently not supported");102return NULL;103}104105/** \brief106* Builds the direct dispatch sequence for given node using C Helper linkage107*108* \param callNode109* TR::Node* for which helper dispatch sequence will be generated110*111* \return112* Returns TR::Register* which contains return value from helper call113*/114virtual TR::Register * buildDirectDispatch(TR::Node * callNode)115{116return buildDirectDispatch(callNode, static_cast<TR::RegisterDependencyConditions**>(NULL));117}118119/** \brief120* Overloaded function that builds the direct dispatch sequence for given node using C Helper linkage121* with additional returnReg parameter from consumer122*123* \param callNode124* TR::Node* for which helper dispatch sequence will be generated125*126* \param returnReg127* TR::Register* allocated by consumer of this API. Dispatch sequence will use this register to store return value from helper128* instead from allocating new register.129*130* \return131* Returns TR::Register* which contains return value from helper call132*/133TR::Register* buildDirectDispatch(TR::Node *callNode, TR::Register *returnReg)134{135return buildDirectDispatch(callNode, NULL, returnReg);136}137138TR::Register *buildDirectDispatch(TR::Node *callNode, TR::RegisterDependencyConditions** deps, TR::Register *returnReg=NULL);139};140141}142143}144145146