blob: ffcbca9bb61bd1dd4efdb4f285d57e9deecf4f19 [file] [log] [blame]
/* --COPYRIGHT--,EPL
* Copyright (c) 2008 Texas Instruments and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Texas Instruments - initial implementation
*
* --/COPYRIGHT--
*/
/*
* ======== StructureDecoder.xdc ========
*/
package xdc.rov;
/*!
* ======== StructureDecoder ========
* Module for retrieving and decoding target structures.
*
* The StructureDecoder is responsible for decoding target data given the
* raw target bytes and the data's type as defined in XDC. It also contains
* APIs for retrieving data from the target given the data's address.
*
* The StructureDecoder relies on the TargetDecoder to decode the raw target
* bytes, but is itself responsible for decoding the structure layout. The
* decodeStruct API takes as an argument the structure's type representation
* in the XDC object model, and refers to this object to determine the size
* and offsets of the structure's fields.
*
* The object returned by decodeStruct is not the typed Java representation of
* the structure, but rather a typeless JavaScript object which simply
* contains all of the same fields. This allows ROV to control the type of the
* fields, and specifically to represent arrays as addresses rather than as
* objects.
*
* All of the 'decode' methods are essentially private methods. The intended
* interface to the StructureDecoder is through the 'fetch' APIs.
*/
metaonly module StructureDecoder
{
/*!
* ======== Buffer ========
* This structure encapsulates a buffer of target memory (`buffer`),
* the buffer's original target address (`addr`), and a running offset
* into that buffer (`off`).
*
* Decoding a structure is a recursive process, since the structure may
* include fields which are also structures. As the StructureDecoder
* decodes each field, it updates the `off` field to move to the next
* field.
*
* The original address of the buffer is stored as well so that each
* structure field can be given a `$addr` property with its target
* address.
*/
metaonly struct Buffer {
Any buffer;
Int addr;
Int off;
}
/*!
* ======== FieldType ========
* Object representing the type of a field. An object of this type is
* returned by the parseTypeString API.
*
* A field can either be a scalar, a structure, or an array.
*/
metaonly struct FieldType {
/* Scalar */
Bool isScalarType;
Bool signed;
Bool isEnum;
Bool isEncoded;
Int size;
Int align;
Bool isAddr;
String fldType;
/* Structure */
Bool isStrType;
Any strType;
/* Array */
Bool isArrType;
Int len;
String elemType;
}
instance:
/*!
* ======== create ========
* The StructureDecoder requires a MemoryImage instance and the target
* configuration object from the ROV recap file.
*/
create(Any mem, Any targConfig);
/*!
* ======== fetchStruct ========
* Retrieves and decodes a structure of the given type at the given
* address from the target.
*
* structType - Structure type. Not just a string, it is the XDC object
* model representation of the type.
* addr - Target address of the structure to retrieve.
* addrCheck - Whether to check the memory read against the section map.
*/
Any fetchStruct(Any structType, Int addr, Bool addrCheck);
/*!
* ======== fetchArray ========
* Retrieves and decodes an array of structures from the target.
*
* structType - Structure type. Not just a string, it is the XDC object
* model representation of the type.
* addr - Target address of the structure to retrieve.
* len - Number of entries in the array.
* isScalar - Whether it is an array of scalars.
* addrCheck - Whether to check the memory read against the section map.
*/
Any fetchArray(Any structType, Int addr, Int len, Bool isScalar,
Bool addrCheck);
/*!
* ======== decodeStruct ========
* Decodes an entire structure by decoding each of the structure's fields.
*
* structType - Structure type. Not just a string, it is the XDC object
* model representation of the type.
* buffer - Buffer of target memory containing raw data.
* inStr - Optional structure to fill in. Otherwise decodeStruct will
* create a new one.
*/
Any decodeStruct(Any structType, Buffer buffer, Any inStr = null);
/*!
* ======== decodeStructArray ========
* Decodes an array of structures given the structure's XDC OM type
* object.
*
* This API exists to perform some optimizations when decoding an array
* of a single type of object.
*
* structType - Structure type of the elements in the array. Not just a
* string, it is the XDC object model representation of the
* type.
* buffer - Buffer of target memory containing raw data.
* len - Number of elements in the array.
*/
Any decodeStructArray(Any structType, Buffer buffer, Int len);
/*!
* @_nodoc
* ======== _parseTypeString ========
* Interperets a type string from a $$sizes structure, and returns the
* interpretation in a FieldType object.
*/
FieldType _parseTypeString(String fieldType);
/*!
* @_nodoc
* ======== _decodeField ========
* Decodes a single field within a structure and returns its value.
* This API is only called by decodeStruct. It does not take an XDC type
* object but just a string representing the type of a single field within
* a structure.
*
* fieldType - Type info for the field.
* buffer - Buffer of target memory containing raw data.
*
* TODO - This should be spec'd, but currently it can't because it will
* not properly return an Enum object.
*/
//Any _decodeField(String fieldType, Buffer buffer);
function _decodeField(fieldType, buffer);
/*!
* @_nodoc
* ======== _decodeArray ========
* This API decodes an array of any type of elements given the elements'
* type string.
*
* decodeStructArray takes an XDC OM type object, while decodeArray takes
* a type string. decodeArray calls down to decodeStructArray if the
* element type is a structure.
*
* elemType - Type info for the elements of the array.
* buffer - Buffer of target memory containing raw data.
* len - Number of elements in the array.
*/
Any _decodeArray(String elemType, Buffer buffer, Int len);
/*!
* @_nodoc
* ======== _decodeScalar ========
* Decodes a scalar value of 'type' at the offset specified in
* 'buffer.off'.
*
* type - Type info for the scalar
* buffer - Buffer of target memory containing raw data.
*
* TODO - This should be spec'd, but currently it can't because it will
* not properly return an Enum object.
*/
//Any _decodeScalar(FieldType type, Buffer buffer);
function _decodeScalar(type, buffer);
}
/*
*! Revision History
*! ================
*! 13-Feb-2009 cmcc Created
*/