decompiler  1.0.0
Public Member Functions | List of all members
ghidra::CastStrategyC Class Reference

Casting strategies that are specific to the C language. More...

#include <cast.hh>

Inheritance diagram for ghidra::CastStrategyC:
ghidra::CastStrategy ghidra::CastStrategyJava

Public Member Functions

virtual int4 localExtensionType (const Varnode *vn, const PcodeOp *op) const
 Decide on integer promotion by examining just local properties of the given Varnode. More...
 
virtual int4 intPromotionType (const Varnode *vn) const
 Calculate the integer promotion code of a given Varnode. More...
 
virtual bool checkIntPromotionForCompare (const PcodeOp *op, int4 slot) const
 Check if integer promotion forces a cast for the given comparison op and slot. More...
 
virtual bool checkIntPromotionForExtension (const PcodeOp *op) const
 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
 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
 Does there need to be a visible cast between the given data-types. More...
 
virtual DatatypearithmeticOutputStandard (const PcodeOp *op)
 What is the output data-type produced by the given integer arithmetic operation. More...
 
virtual bool isSubpieceCast (Datatype *outtype, Datatype *intype, uint4 offset) const
 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
 Is the given data-type truncation considered a cast, given endianess concerns. More...
 
virtual bool isSextCast (Datatype *outtype, Datatype *intype) const
 Is sign-extending an input data-type, producing an output data-type, considered a cast. More...
 
virtual bool isZextCast (Datatype *outtype, Datatype *intype) const
 Is zero-extending an input data-type, producing an output data-type, considered a cast. More...
 
- Public Member Functions inherited from ghidra::CastStrategy
 CastStrategy (void)
 Constructor.
 
void setTypeFactory (TypeFactory *t)
 Establish the data-type factory. More...
 
virtual ~CastStrategy (void)
 Destructor.
 
bool markExplicitUnsigned (PcodeOp *op, int4 slot) const
 Check if a constant input should be explicitly labeled as an unsigned token. More...
 
bool markExplicitLongSize (PcodeOp *op, int4 slot) const
 Check is a constant input should be explicitly labeled as a long integer token. More...
 
bool caresAboutCharRepresentation (const Varnode *vn, const PcodeOp *op) const
 For the given PcodeOp, does it matter if a constant operand is presented as a character or integer. More...
 

Additional Inherited Members

- Public Types inherited from ghidra::CastStrategy
enum  IntPromotionCode {
  NO_PROMOTION = -1, UNKNOWN_PROMOTION = 0, UNSIGNED_EXTENSION = 1, SIGNED_EXTENSION = 2,
  EITHER_EXTENSION = 3
}
 Types of integer promotion. More...
 
- Protected Attributes inherited from ghidra::CastStrategy
TypeFactorytlst
 Type factory associated with the Architecture.
 
int4 promoteSize
 Size of int data-type, (size that integers get promoted to)
 

Detailed Description

Casting strategies that are specific to the C language.

Member Function Documentation

◆ arithmeticOutputStandard()

Datatype * ghidra::CastStrategyC::arithmeticOutputStandard ( const PcodeOp op)
virtual

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

Parameters
opis the given operation
Returns
the output data-type

Implements ghidra::CastStrategy.

References ghidra::TypeFactory::getBase(), ghidra::Varnode::getHighTypeReadFacing(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::PcodeOp::numInput(), ghidra::CastStrategy::tlst, ghidra::TYPE_BOOL, ghidra::TYPE_INT, and ghidra::Datatype::typeOrder().

◆ castStandard()

Datatype * ghidra::CastStrategyC::castStandard ( Datatype reqtype,
Datatype curtype,
bool  care_uint_int,
bool  care_ptr_uint 
) const
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

Implements ghidra::CastStrategy.

Reimplemented in ghidra::CastStrategyJava.

References ghidra::Datatype::getMetatype(), ghidra::TypePointer::getPtrTo(), ghidra::Datatype::getSize(), ghidra::TypePointer::getSpace(), ghidra::Datatype::getTypedef(), ghidra::TypePointer::getWordSize(), ghidra::Datatype::hasSameVariableBase(), ghidra::Datatype::isVariableLength(), ghidra::TYPE_BOOL, ghidra::TYPE_CODE, ghidra::TYPE_INT, ghidra::TYPE_PTR, ghidra::TYPE_UINT, ghidra::TYPE_UNKNOWN, and ghidra::TYPE_VOID.

◆ checkIntPromotionForCompare()

bool ghidra::CastStrategyC::checkIntPromotionForCompare ( const PcodeOp op,
int4  slot 
) const
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

Implements ghidra::CastStrategy.

References ghidra::PcodeOp::getIn(), ghidra::CastStrategy::intPromotionType(), ghidra::CastStrategy::NO_PROMOTION, and ghidra::CastStrategy::UNKNOWN_PROMOTION.

◆ checkIntPromotionForExtension()

bool ghidra::CastStrategyC::checkIntPromotionForExtension ( const PcodeOp op) const
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

Implements ghidra::CastStrategy.

References ghidra::PcodeOp::code(), ghidra::CPUI_INT_SEXT, ghidra::CPUI_INT_ZEXT, ghidra::PcodeOp::getIn(), ghidra::CastStrategy::intPromotionType(), ghidra::CastStrategy::NO_PROMOTION, ghidra::CastStrategy::SIGNED_EXTENSION, ghidra::CastStrategy::UNKNOWN_PROMOTION, and ghidra::CastStrategy::UNSIGNED_EXTENSION.

◆ intPromotionType()

int4 ghidra::CastStrategyC::intPromotionType ( const Varnode vn) const
virtual

◆ isExtensionCastImplied()

bool ghidra::CastStrategyC::isExtensionCastImplied ( const PcodeOp op,
const PcodeOp readOp 
) const
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

Implements ghidra::CastStrategy.

References ghidra::PcodeOp::code(), ghidra::CPUI_INT_ADD, ghidra::CPUI_INT_AND, ghidra::CPUI_INT_DIV, ghidra::CPUI_INT_EQUAL, ghidra::CPUI_INT_LESS, ghidra::CPUI_INT_LESSEQUAL, ghidra::CPUI_INT_MULT, ghidra::CPUI_INT_NOTEQUAL, ghidra::CPUI_INT_OR, ghidra::CPUI_INT_SLESS, ghidra::CPUI_INT_SLESSEQUAL, ghidra::CPUI_INT_SUB, ghidra::CPUI_INT_XOR, ghidra::CPUI_PTRADD, ghidra::Varnode::getHighTypeReadFacing(), ghidra::PcodeOp::getIn(), ghidra::Datatype::getMetatype(), ghidra::PcodeOp::getOut(), ghidra::Varnode::getSize(), ghidra::PcodeOp::getSlot(), ghidra::Varnode::isConstant(), ghidra::Varnode::isExplicit(), and ghidra::CastStrategy::promoteSize.

◆ isSextCast()

bool ghidra::CastStrategyC::isSextCast ( Datatype outtype,
Datatype intype 
) const
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

Implements ghidra::CastStrategy.

References ghidra::Datatype::getMetatype(), ghidra::TYPE_BOOL, ghidra::TYPE_INT, and ghidra::TYPE_UINT.

◆ isSubpieceCast()

bool ghidra::CastStrategyC::isSubpieceCast ( Datatype outtype,
Datatype intype,
uint4  offset 
) const
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

Implements ghidra::CastStrategy.

References ghidra::Datatype::getMetatype(), ghidra::Datatype::getSize(), ghidra::TYPE_FLOAT, ghidra::TYPE_INT, ghidra::TYPE_PTR, ghidra::TYPE_UINT, and ghidra::TYPE_UNKNOWN.

◆ isSubpieceCastEndian()

bool ghidra::CastStrategyC::isSubpieceCastEndian ( Datatype outtype,
Datatype intype,
uint4  offset,
bool  isbigend 
) const
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

Implements ghidra::CastStrategy.

References ghidra::Datatype::getSize(), and ghidra::CastStrategy::isSubpieceCast().

◆ isZextCast()

bool ghidra::CastStrategyC::isZextCast ( Datatype outtype,
Datatype intype 
) const
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

Implements ghidra::CastStrategy.

Reimplemented in ghidra::CastStrategyJava.

References ghidra::Datatype::getMetatype(), ghidra::TYPE_BOOL, ghidra::TYPE_INT, and ghidra::TYPE_UINT.

◆ localExtensionType()

int4 ghidra::CastStrategyC::localExtensionType ( const Varnode vn,
const PcodeOp op 
) const
virtual

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