Ghidra Decompiler Analysis Engine
Public Types | Public Member Functions | Protected Attributes | List of all members
CastStrategy Class Referenceabstract

A strategy for applying type casts. More...

#include <cast.hh>

Inheritance diagram for CastStrategy:
Inheritance graph
[legend]
Collaboration diagram for CastStrategy:
Collaboration graph
[legend]

Public Types

enum  IntPromotionCode {
  NO_PROMOTION = -1, UNKNOWN_PROMOTION = 0, UNSIGNED_EXTENSION = 1, SIGNED_EXTENSION = 2,
  EITHER_EXTENSION = 3
}
 Types of integer promotion. More...
 

Public Member Functions

void setTypeFactory (TypeFactory *t)
 Establish the data-type factory. More...
 
virtual int4 localExtensionType (const Varnode *vn) const =0
 Decide on integer promotion by examining just local properties of the given Varnode. More...
 
virtual int4 intPromotionType (const Varnode *vn) const =0
 Calculate the integer promotion code of a given Varnode. More...
 
virtual bool checkIntPromotionForCompare (const PcodeOp *op, int4 slot) const =0
 Check if integer promotion forces a cast for the given comparison op and slot. More...
 
virtual bool checkIntPromotionForExtension (const PcodeOp *op) const =0
 Check if integer promotion forces a cast for the input to the given extension. More...
 
virtual bool isExtensionCastImplied (const PcodeOp *op, const PcodeOp *readOp) const =0
 Is the given ZEXT/SEXT cast implied by the expression its in? More...
 
virtual DatatypecastStandard (Datatype *reqtype, Datatype *curtype, bool care_uint_int, bool care_ptr_uint) const =0
 Does there need to be a visible cast between the given data-types. More...
 
virtual DatatypearithmeticOutputStandard (const PcodeOp *op)=0
 What is the output data-type produced by the given integer arithmetic operation. More...
 
virtual bool isSubpieceCast (Datatype *outtype, Datatype *intype, uint4 offset) const =0
 Is truncating an input data-type, producing an output data-type, considered a cast. More...
 
virtual bool isSubpieceCastEndian (Datatype *outtype, Datatype *intype, uint4 offset, bool isbigend) const =0
 Is the given data-type truncation considered a cast, given endianess concerns. More...
 
virtual bool isSextCast (Datatype *outtype, Datatype *intype) const =0
 Is sign-extending an input data-type, producing an output data-type, considered a cast. More...
 
virtual bool isZextCast (Datatype *outtype, Datatype *intype) const =0
 Is zero-extending an input data-type, producing an output data-type, considered a cast. More...
 

Protected Attributes

TypeFactorytlst
 Type factory associated with the Architecture.
 
int4 promoteSize
 Size of int data-type, (size that integers get promoted to)
 

Detailed Description

A strategy for applying type casts.

A cast operation in C or other languages masks a variety of possible low-level conversions, such as extensions, truncations, integer to floating-point, etc. On top of this, languages allow many of these types of operations to be implied in the source code, with no explicit token representing the conversion. Conversions happen automatically for things like integer promotion, between different sizes (of integers), and between signed and unsigned data-type variants.

This class is the API for making four kinds of decisions:

Member Enumeration Documentation

◆ IntPromotionCode

Types of integer promotion.

For many languages, small integers are automatically promoted to a standard size. The decompiler describes how an expression is or will be affected by integer promotion, using these codes

Enumerator
NO_PROMOTION 

There is no integer promotion.

UNKNOWN_PROMOTION 

The type of integer promotion cannot be determined.

UNSIGNED_EXTENSION 

The value is promoted using unsigned extension.

SIGNED_EXTENSION 

The value is promoted using signed extension.

EITHER_EXTENSION 

The value is promoted using either signed or unsigned extension.

Member Function Documentation

◆ arithmeticOutputStandard()

virtual Datatype* CastStrategy::arithmeticOutputStandard ( const PcodeOp op)
pure virtual

What is the output data-type produced by the given integer arithmetic operation.

Parameters
opis the given operation
Returns
the output data-type

Implemented in CastStrategyC.

◆ castStandard()

virtual Datatype* CastStrategy::castStandard ( Datatype reqtype,
Datatype curtype,
bool  care_uint_int,
bool  care_ptr_uint 
) const
pure virtual

Does there need to be a visible cast between the given data-types.

The cast is from a current data-type to an expected data-type. NULL is returned if no cast is required, otherwise the data-type to cast to (usually the expected data-type) is returned.

Parameters
reqtypeis the expected data-type
curtypeis the current data-type
care_uint_intis true if we care about a change in signedness
care_ptr_uintis true if we care about conversions between pointers and unsigned values
Returns
NULL to indicate no cast, or the data-type to cast to

Implemented in CastStrategyJava, and CastStrategyC.

◆ checkIntPromotionForCompare()

virtual bool CastStrategy::checkIntPromotionForCompare ( const PcodeOp op,
int4  slot 
) const
pure virtual

Check if integer promotion forces a cast for the given comparison op and slot.

Compute to what level the given slot has seen integer promotion and if a cast is required before the comparison operator makes sense.

Parameters
opis the given comparison operator
slotis the input slot being tested
Returns
true if a cast is required before comparing

Implemented in CastStrategyC.

◆ checkIntPromotionForExtension()

virtual bool CastStrategy::checkIntPromotionForExtension ( const PcodeOp op) const
pure virtual

Check if integer promotion forces a cast for the input to the given extension.

Compute to what level the given slot has seen integer promotion and if a cast is required before the extension operator makes sense.

Parameters
opis the given extension operator INT_ZEXT or INT_SEXT
Returns
true if a cast is required before extending

Implemented in CastStrategyC.

◆ intPromotionType()

virtual int4 CastStrategy::intPromotionType ( const Varnode vn) const
pure virtual

Calculate the integer promotion code of a given Varnode.

Recursively examine the expression defining the Varnode as necessary

Parameters
vnis the given Varnode
Returns
the IntPromotionCode

Implemented in CastStrategyC.

◆ isExtensionCastImplied()

virtual bool CastStrategy::isExtensionCastImplied ( const PcodeOp op,
const PcodeOp readOp 
) const
pure virtual

Is the given ZEXT/SEXT cast implied by the expression its in?

We've already determined that the given ZEXT or SEXT op can be viewed as a natural cast operation. Determine if the cast is implied by the expression its and doesn't need to be printed.

Parameters
opis the given ZEXT or SEXT PcodeOp
readOpis the PcodeOp consuming the output of the extensions (or null)
Returns
true if the op as a cast does not need to be printed

Implemented in CastStrategyC.

◆ isSextCast()

virtual bool CastStrategy::isSextCast ( Datatype outtype,
Datatype intype 
) const
pure virtual

Is sign-extending an input data-type, producing an output data-type, considered a cast.

Data-types must be provided from the input and output of an INT_SEXT operation.

Parameters
outtypeis the output data-type
intypeis the input data-type
Returns
true if the INT_SEXT should be represented as a cast

Implemented in CastStrategyC.

◆ isSubpieceCast()

virtual bool CastStrategy::isSubpieceCast ( Datatype outtype,
Datatype intype,
uint4  offset 
) const
pure virtual

Is truncating an input data-type, producing an output data-type, considered a cast.

Data-types must be provided from the input and output of a SUBPIECE operation.

Parameters
outtypeis the output data-type
intypeis the input data-type
offsetis number of bytes truncated by the SUBPIECE
Returns
true if the SUBPIECE should be represented as a cast

Implemented in CastStrategyC.

◆ isSubpieceCastEndian()

virtual bool CastStrategy::isSubpieceCastEndian ( Datatype outtype,
Datatype intype,
uint4  offset,
bool  isbigend 
) const
pure virtual

Is the given data-type truncation considered a cast, given endianess concerns.

This is equivalent to isSubpieceCast() but where the truncation is accomplished by pulling bytes directly out of memory. We assume the input data-type is layed down in memory, and we pull the output value starting at a given byte offset.

Parameters
outtypeis the output data-type
intypeis the input data-type
offsetis the given byte offset (into the input memory)
isbigendis true if the address space holding the memory is big endian.
Returns
true if the truncation should be represented as a cast

Implemented in CastStrategyC.

◆ isZextCast()

virtual bool CastStrategy::isZextCast ( Datatype outtype,
Datatype intype 
) const
pure virtual

Is zero-extending an input data-type, producing an output data-type, considered a cast.

Data-types must be provided from the input and output of an INT_ZEXT operation.

Parameters
outtypeis the output data-type
intypeis the input data-type
Returns
true if the INT_ZEXT should be represented as a cast

Implemented in CastStrategyJava, and CastStrategyC.

◆ localExtensionType()

virtual int4 CastStrategy::localExtensionType ( const Varnode vn) const
pure virtual

Decide on integer promotion by examining just local properties of the given Varnode.

Parameters
vnis the given Varnode
Returns
an IntPromotionCode (excluding NO_PROMOTION)

Implemented in CastStrategyC.

◆ setTypeFactory()

void CastStrategy::setTypeFactory ( TypeFactory t)

Establish the data-type factory.

Sets the TypeFactory used to produce data-types for the arithmeticOutputStandard() method

Parameters
tis the TypeFactory

The documentation for this class was generated from the following files: