Skip to content

Commit

Permalink
Initial ObjectFormat and FunctionCallData definitions
Browse files Browse the repository at this point in the history
Provide abstract APIs and base structures

Issue: #5569

Signed-off-by: Daryl Maier <maier@ca.ibm.com>
  • Loading branch information
0xdaryl committed Jan 10, 2021
1 parent bded46c commit abdde9e
Show file tree
Hide file tree
Showing 6 changed files with 357 additions and 3 deletions.
7 changes: 5 additions & 2 deletions compiler/env/TRMemory.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corp. and others
* Copyright (c) 2000, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -308,7 +308,10 @@ const char * objectName[] =
"ClientSessionData",
"ROMClass",

"SymbolValidationManager"
"SymbolValidationManager",

"ObjectFormat",
"FunctionCallData"
};


Expand Down
5 changes: 4 additions & 1 deletion compiler/env/TRMemory.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corp. and others
* Copyright (c) 2000, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
Expand Down Expand Up @@ -456,6 +456,9 @@ class TR_MemoryBase

SymbolValidationManager,

ObjectFormat,
FunctionCallData,

NumObjectTypes,
// If adding new object types above, add the corresponding names
// to objectName[] array defined in TRMemory.cpp
Expand Down
52 changes: 52 additions & 0 deletions compiler/objectfmt/FunctionCallData.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*******************************************************************************
* Copyright (c) 2020, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at http://eclipse.org/legal/epl-2.0
* or the Apache License, Version 2.0 which accompanies this distribution
* and is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License, v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception [1] and GNU General Public
* License, version 2 with the OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] http://openjdk.java.net/legal/assembly-exception.html
*
* 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
*******************************************************************************/

#ifndef TR_FUNCTIONCALLDATA_INCL
#define TR_FUNCTIONCALLDATA_INCL

#include "objectfmt/OMRFunctionCallData.hpp"
#include "infra/Annotations.hpp"

namespace TR
{

class OMR_EXTENSIBLE FunctionCallData : public OMR::FunctionCallDataConnector
{
public:

FunctionCallData(
TR::CodeGenerator *cg,
TR::SymbolReference *methodSymRef,
TR::Node *callNode) :
OMR::FunctionCallDataConnector(cg, methodSymRef, callNode) {}

FunctionCallData(
TR::CodeGenerator *cg,
TR::SymbolReference *methodSymRef,
TR::Node *callNode,
uint8_t *bufferAddress) :
OMR::FunctionCallDataConnector(cg, methodSymRef, callNode, bufferAddress) {}

};

}

#endif
125 changes: 125 additions & 0 deletions compiler/objectfmt/OMRFunctionCallData.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
/*******************************************************************************
* Copyright (c) 2021, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at http://eclipse.org/legal/epl-2.0
* or the Apache License, Version 2.0 which accompanies this distribution
* and is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License, v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception [1] and GNU General Public
* License, version 2 with the OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] http://openjdk.java.net/legal/assembly-exception.html
*
* 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
*******************************************************************************/

#ifndef OMR_FUNCTIONCALLDATA_INCL
#define OMR_FUNCTIONCALLDATA_INCL

/*
* The following #define and typedef must appear before any #includes in this file
*/
#ifndef OMR_FUNCTIONCALLDATA_CONNECTOR
#define OMR_FUNCTIONCALLDATA_CONNECTOR
namespace OMR { class FunctionCallData; }
namespace OMR { typedef OMR::FunctionCallData FunctionCallDataConnector; }
#endif

#include <stddef.h>
#include <stdint.h>
#include "env/TRMemory.hpp"
#include "infra/Annotations.hpp"

namespace TR { class CodeGenerator; }
namespace TR { class Node; }
namespace TR { class SymbolReference; }

namespace OMR
{

/**
* @class FunctionCallData
*
* @details
* The \c FunctionCallData class is an extensible class used to encapsulate
* all the information at particular call site needed to emit a function
* call in a particular object format. Each platform and language
* environment is responsible for extending this class to capture whatever
* meaningful data is necessary at a call site.
*
* The resulting \c TR::FunctionCallData class is accepted as a parameter to
* most \c TR::ObjectFormat APIs.
*/
class OMR_EXTENSIBLE FunctionCallData
{

public:

TR_ALLOC(TR_Memory::FunctionCallData)

FunctionCallData(
TR::CodeGenerator *cg,
TR::SymbolReference *methodSymRef,
TR::Node *callNode) :
methodSymRef(methodSymRef),
callNode(callNode),
bufferAddress(NULL),
out_encodedMethodAddressLocation(NULL),
cg(cg) {}

FunctionCallData(
TR::CodeGenerator *cg,
TR::SymbolReference *methodSymRef,
TR::Node *callNode,
uint8_t *bufferAddress) :
methodSymRef(methodSymRef),
callNode(callNode),
bufferAddress(bufferAddress),
out_encodedMethodAddressLocation(NULL),
cg(cg) {}

/**
* The \c TR::SymbolReference of the method to call
*/
TR::SymbolReference *methodSymRef;

/**
* If applicable, the \c TR::Node of the IL opcode that requires this call
*
* If not applicable, the field is NULL.
*/
TR::Node *callNode;

/**
* The \c TR::CodeGenerator object
*/
TR::CodeGenerator *cg;

/**
* For a call created post-binary encoding, the address of a buffer
* where the function call is to be emitted.
*
* Otherwise, this field is NULL.
*/
uint8_t *bufferAddress;

/**
* This field is populated during an ObjectFormat dispatch sequence.
*
* If the address of the target function is known and it is encoded
* somewhere as part of the function dispatch sequence then this field
* records the address where that function address is written.
*/
uint8_t *out_encodedMethodAddressLocation;

};

}

#endif
133 changes: 133 additions & 0 deletions compiler/objectfmt/OMRObjectFormat.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/*******************************************************************************
* Copyright (c) 2021, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at http://eclipse.org/legal/epl-2.0
* or the Apache License, Version 2.0 which accompanies this distribution
* and is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License, v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception [1] and GNU General Public
* License, version 2 with the OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] http://openjdk.java.net/legal/assembly-exception.html
*
* 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
*******************************************************************************/

#ifndef OMR_OBJECTFORMAT_INCL
#define OMR_OBJECTFORMAT_INCL

/*
* The following #define and typedef must appear before any #includes in this file
*/
#ifndef OMR_OBJECTFORMAT_CONNECTOR
#define OMR_OBJECTFORMAT_CONNECTOR
namespace OMR { class ObjectFormat; }
namespace OMR { typedef OMR::ObjectFormat ObjectFormatConnector; }
#endif

#include <stddef.h>
#include <stdint.h>
#include "env/FilePointerDecl.hpp"
#include "env/TRMemory.hpp"
#include "infra/Annotations.hpp"

namespace TR { class FunctionCallData; }
namespace TR { class Instruction; }

namespace OMR
{

/**
* @class ObjectFormat
*
* @details
* The \c ObjectFormat class is an extensible class that encapsulates the
* encoding of a function call. The concrete class \c TR::ObjectFormat
* defines an abstract API for emitting and encoding function calls. This
* concrete class is intended to serve as a base for other object formats
* that provide implementations of the encoding functions. For example:
*
* * \c JitCodeRWXObjectFormat for calls in a Read+Writable+eXecutable code
* cache in a dynamic language
* * \c JitCodeRXObjectFormat for calls in a Read+eXecutable code cache in a
* dynamic language
* * \c ELFObjectFormat for static compiles using ELF
* * \c MachOObjectFormat for static compiles using Mach-O
*
* A language environment is expected to install whatever object format
* encoding that makes sense for that environment.
*
* The \c TR::ObjectFormat API is expected to be used at all places in
* the compiled code that call another function.
*
* To provide a consistent API for all platforms, the data required to
* emit each call site is encapsulated in an extensible
* \c TR::FunctionCallData class that is passed into each function.
* Each platform and language environment is responsible for refining
* the contents and populating it accordingly at each call site with i
* whatever data values are necessary to encode the call.
*/
class OMR_EXTENSIBLE ObjectFormat
{

public:

TR_ALLOC(TR_Memory::ObjectFormat)

/**
* @brief Emit a sequence of \c TR::Instruction 's to call a function using this
* object format.
*
* @param[in,out] data : a populated \c TR::FunctionCallData structure with
* valid parameters for this call site. Note that this function
* may alter the contents of this structure.
*
* @return : the final \c TR::Instruction produced in the instruction stream to emit a
* call to a function for this object format.
*/
virtual TR::Instruction *emitFunctionCall(TR::FunctionCallData &data) = 0;

/**
* @brief Emit the binary code to call a function using this object format.
* This function is suitable for calling during binary encoding and does not
* use \c TR::Instruction 's.
*
* @param[in,out] data : a populated \c TR::FunctionCallData structure with valid
* parameters for this call site. Note that this function may alter
* the contents of this structure.
*
* @return : the next buffer address following the necessary instruction(s) to emit
* a function call using this object format.
*/
virtual uint8_t *encodeFunctionCall(TR::FunctionCallData &data) = 0;

/**
* @brief Return the length in bytes of the binary encoding sequence to generate a
* call to a function using this object format. If the exact length
* cannot be determined, this should return a conservatively correct estimate
* that is at least as large as the actual length.
*
* @return : the length in bytes of the encoding of a function call
*/
virtual int32_t estimateBinaryLength() = 0;

/**
* @brief Print an encoded function call to a file stream
*
* @param[in] file : the \c TR::FILE to print to
* @param[in] data : a populated \c TR::FunctionCallData structure with valid parameters
* for an encoded function call.
*/
virtual void printEncodedFunctionCall(TR::FILE *file, TR::FunctionCallData &data) = 0;

};

}

#endif
38 changes: 38 additions & 0 deletions compiler/objectfmt/ObjectFormat.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*******************************************************************************
* Copyright (c) 2021, 2021 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at http://eclipse.org/legal/epl-2.0
* or the Apache License, Version 2.0 which accompanies this distribution
* and is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License, v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception [1] and GNU General Public
* License, version 2 with the OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] http://openjdk.java.net/legal/assembly-exception.html
*
* 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
*******************************************************************************/

#ifndef TR_OBJECTFORMAT_INCL
#define TR_OBJECTFORMAT_INCL

#include "objectfmt/OMRObjectFormat.hpp"
#include "infra/Annotations.hpp"

namespace TR
{

class OMR_EXTENSIBLE ObjectFormat : public OMR::ObjectFormatConnector
{

};

}

#endif

0 comments on commit abdde9e

Please sign in to comment.