decompiler  1.0.0
Classes | Functions | Variables
address.hh File Reference

Classes for specifying addresses and other low-level constants. More...

#include "space.hh"

Classes

class  Address
 A low-level machine address for labelling bytes and data. More...
 
class  SeqNum
 A class for uniquely labelling and comparing PcodeOps. More...
 
class  Range
 A contiguous range of bytes in some address space. More...
 
class  RangeList
 A disjoint set of Ranges, possibly across multiple address spaces. More...
 

Functions

uintb calc_mask (int4 size)
 Calculate a mask for a given byte size. More...
 
uintb pcode_right (uintb val, int4 sa)
 
uintb pcode_left (uintb val, int4 sa)
 
bool signbit_negative (uintb val, int4 size)
 Return true if the sign-big is set. More...
 
uintb uintb_negate (uintb in, int4 size)
 Negate the sized value. More...
 
uintb sign_extend (uintb in, int4 sizein, int4 sizeout)
 Sign-extend a value between two byte sizes. More...
 
void sign_extend (intb &val, int4 bit)
 Sign extend above given bit. More...
 
void zero_extend (intb &val, int4 bit)
 Clear all bits above given bit. More...
 
void byte_swap (intb &val, int4 size)
 Swap bytes in the given value. More...
 
uintb byte_swap (uintb val, int4 size)
 Return the given value with bytes swapped. More...
 
int4 leastsigbit_set (uintb val)
 Return index of least significant bit set in given value. More...
 
int4 mostsigbit_set (uintb val)
 Return index of most significant bit set in given val. More...
 
uintb coveringmask (uintb val)
 Return a mask that covers the given value. More...
 
int4 bit_transitions (uintb val, int4 sz)
 Calculate the number of bit transitions in the sized value. More...
 
void mult64to128 (uint8 *res, uint8 x, uint8 y)
 Multiply 2 unsigned 64-bit values, producing a 128-bit value. More...
 
void unsignedSubtract128 (uint8 *a, uint8 *b)
 Subtract (in-place) a 128-bit value from a base 128-value. More...
 
int4 unsignedCompare128 (uint8 *a, uint8 *b)
 Compare two unsigned 128-bit values. More...
 
int4 power2Divide (int4 n, uint8 divisor, uint8 &q, uint8 &r)
 Unsigned division of a power of 2 (upto 2^127) by a 64-bit divisor. More...
 

Variables

uintb uintbmasks []
 Precalculated masks indexed by size.
 

Detailed Description

Classes for specifying addresses and other low-level constants.

All addresses are absolute and there are are no registers in CPUI. However, all addresses are prefixed with an "immutable" pointer, which can specify a separate RAM space, a register space, an i/o space etc. Thus a translation from a real machine language will typically simulate registers by placing them in their own space, separate from RAM. Indirection (i.e. pointers) must be simulated through the LOAD and STORE ops.

Function Documentation

◆ bit_transitions()

int4 bit_transitions ( uintb  val,
int4  sz 
)

Calculate the number of bit transitions in the sized value.

Treat val as a constant of size sz. Scanning across the bits of val return the number of transitions (from 0->1 or 1->0) If there are 2 or less transitions, this is an indication of a bit flag or a mask

Parameters
valis the given value
szis the size to treat the value as
Returns
the number of transitions

Referenced by ActionConstantPtr::isPointer(), and CircleRange::setNZMask().

◆ byte_swap() [1/2]

void byte_swap ( intb &  val,
int4  size 
)

Swap bytes in the given value.

Swap the least significant size bytes in val

Parameters
valis a reference to the value to swap
sizeis the number of bytes to swap

Referenced by MemoryImage::find(), EmulatePcodeOp::getLoadImageValue(), EmulateSnippet::getLoadImageValue(), MemoryBank::getPage(), and MemoryBank::setPage().

◆ byte_swap() [2/2]

uintb byte_swap ( uintb  val,
int4  size 
)

Return the given value with bytes swapped.

Swap the least significant size bytes in val

Parameters
valis the value to swap
sizeis the number of bytes to swap
Returns
the swapped value

◆ calc_mask()

uintb calc_mask ( int4  size)
inline

Calculate a mask for a given byte size.

Parameters
sizeis the desired size in bytes
Returns
a value appropriate for masking off the first size bytes

References uintbmasks.

Referenced by ActionStackPtrFlow::analyzeExtraPop(), RuleCollectTerms::applyOp(), RuleOrMask::applyOp(), RuleNegateIdentity::applyOp(), RuleShiftBitops::applyOp(), RuleHighOrderAnd::applyOp(), RuleAndDistribute::applyOp(), RuleAndCommute::applyOp(), RuleAndPiece::applyOp(), RuleAndCompare::applyOp(), RuleDoubleShift::applyOp(), RuleShiftCompare::applyOp(), RuleBoolZext::applyOp(), RuleSborrow::applyOp(), RuleTransformCpool::applyOp(), Rule2Comp2Mult::applyOp(), RuleCarryElim::applyOp(), RuleSub2Add::applyOp(), RuleSubCommute::applyOp(), RuleConcatCommute::applyOp(), RuleShiftAnd::applyOp(), RuleSubZext::applyOp(), RuleHumptyOr::applyOp(), RuleEmbed::applyOp(), RuleLess2Zero::applyOp(), RuleLessEqual2Zero::applyOp(), RuleSLess2Zero::applyOp(), RuleEqual2Zero::applyOp(), RuleEqual2Constant::applyOp(), RuleMultNegOne::applyOp(), RuleAddUnsigned::applyOp(), RuleDivTermAdd2::applyOp(), RuleSignDiv2::applyOp(), RuleSignNearMult::applyOp(), RuleModOpt::applyOp(), RuleSubvarAnd::applyOp(), RuleSubvarSubpiece::applyOp(), RuleSubvarCompZero::applyOp(), RuleSubvarZext::applyOp(), RuleSubvarSext::applyOp(), RuleFuncPtrEncoding::applyOp(), RuleThreeWayCompare::applyOp(), Funcdata::calcNZMask(), AddrSpace::calcScaleMask(), ActionStackPtrFlow::checkClog(), CircleRange::CircleRange(), RuleThreeWayCompare::detectThreeWay(), OpBehaviorIntAdd::evaluateBinary(), OpBehaviorIntSub::evaluateBinary(), OpBehaviorIntCarry::evaluateBinary(), OpBehaviorIntLeft::evaluateBinary(), OpBehaviorIntRight::evaluateBinary(), OpBehaviorIntSright::evaluateBinary(), OpBehaviorIntMult::evaluateBinary(), OpBehaviorSubpiece::evaluateBinary(), RuleSLess2Zero::getHiBit(), EmulatePcodeOp::getLoadImageValue(), EmulateSnippet::getLoadImageValue(), PcodeOp::getNZMaskLocal(), ContextDatabase::getTrackedValue(), MemoryBank::getValue(), EquateSymbol::isValueClose(), FloatFormat::opTrunc(), ActionDeadCode::propagateConsumed(), CircleRange::pullBack(), PrintC::push_integer(), ActionDeadCode::pushConsumed(), PrintC::pushEquate(), OpBehaviorIntAdd::recoverInputBinary(), OpBehaviorIntSub::recoverInputBinary(), OpBehaviorIntLeft::recoverInputBinary(), OpBehaviorIntZext::recoverInputUnary(), OpBehaviorIntSext::recoverInputUnary(), Funcdata::replaceLessequal(), SegmentedResolver::resolve(), TypeFactory::setEnumValues(), CircleRange::setNZMask(), MemoryBank::setValue(), sign_extend(), Funcdata::splitVarnode(), ActionLikelyTrash::traceTrash(), RulePtrArith::transformPtr(), and uintb_negate().

◆ coveringmask()

uintb coveringmask ( uintb  val)

Return a mask that covers the given value.

Return smallest number of form 2^n-1, bigger or equal to the given value

Parameters
valis the given value
Returns
the mask

Referenced by PcodeOp::getNZMaskLocal().

◆ leastsigbit_set()

int4 leastsigbit_set ( uintb  val)

Return index of least significant bit set in given value.

The least significant bit is index 0.

Parameters
valis the given value
Returns
the index of the least significant set bit, or -1 if none are set

Referenced by RuleShiftBitops::applyOp(), RuleDoubleShift::applyOp(), RuleShiftCompare::applyOp(), RuleShiftAnd::applyOp(), RuleSubvarCompZero::applyOp(), PcodeOp::getNZMaskLocal(), and CircleRange::setNZMask().

◆ mostsigbit_set()

int4 mostsigbit_set ( uintb  val)

Return index of most significant bit set in given val.

The least significant bit is index 0.

Parameters
valis the given value
Returns
the index of the most significant set bit, or -1 if none are set

Referenced by PrintLanguage::formatBinary(), PcodeOp::getNZMaskLocal(), CircleRange::pullBack(), and PrintLanguage::writeUtf8().

◆ mult64to128()

void mult64to128 ( uint8 *  res,
uint8  x,
uint8  y 
)

Multiply 2 unsigned 64-bit values, producing a 128-bit value.

TODO: Remove once we import a full multiprecision library.

Parameters
respoints to the result array (2 uint8 pieces)
xis the first 64-bit value
yis the second 64-bit value

Referenced by power2Divide().

◆ pcode_left()

uintb pcode_left ( uintb  val,
int4  sa 
)
inline

Perform a CPUI_INT_LEFT on the given val

Parameters
valis the value to shift
sais the number of bits to shift
Returns
the shifted value

Referenced by RuleShiftBitops::applyOp(), and PcodeOp::getNZMaskLocal().

◆ pcode_right()

uintb pcode_right ( uintb  val,
int4  sa 
)
inline

Perform a CPUI_INT_RIGHT on the given val

Parameters
valis the value to shift
sais the number of bits to shift
Returns
the shifted value

Referenced by RuleShiftBitops::applyOp(), and PcodeOp::getNZMaskLocal().

◆ power2Divide()

int4 power2Divide ( int4  n,
uint8  divisor,
uint8 &  q,
uint8 &  r 
)

Unsigned division of a power of 2 (upto 2^127) by a 64-bit divisor.

The result must be less than 2^64. The remainder is calculated.

Parameters
nis the power of 2 for the numerand
divisoris the 64-bit divisor
qis the passed back 64-bit quotient
ris the passed back 64-bit remainder
Returns
0 if successful, 1 if result is too big, 2 if divide by 0

References mult64to128(), unsignedCompare128(), and unsignedSubtract128().

Referenced by RuleDivOpt::calcDivisor().

◆ sign_extend() [1/2]

uintb sign_extend ( uintb  in,
int4  sizein,
int4  sizeout 
)

Sign-extend a value between two byte sizes.

Take the first sizein bytes of the given in and sign-extend this to sizeout bytes, keeping any more significant bytes zero

Parameters
inis the given value
sizeinis the size to treat that value as an input
sizeoutis the size to sign-extend the value to
Returns
the sign-extended value

References calc_mask().

Referenced by RuleSubCommute::applyOp(), ScopeLocal::buildVariableName(), OpBehaviorIntSdiv::evaluateBinary(), OpBehaviorIntSrem::evaluateBinary(), OpBehaviorIntSext::evaluateUnary(), PcodeOp::getNZMaskLocal(), EquateSymbol::isValueClose(), FloatFormat::opInt2Float(), CircleRange::pullBack(), PrintC::pushEquate(), Funcdata::replaceLessequal(), and RulePtrArith::transformPtr().

◆ sign_extend() [2/2]

void sign_extend ( intb &  val,
int4  bit 
)

Sign extend above given bit.

Sign extend val starting at bit

Parameters
valis a reference to the value to be sign-extended
bitis the index of the bit to extend from (0=least significant bit)

◆ signbit_negative()

bool signbit_negative ( uintb  val,
int4  size 
)

Return true if the sign-big is set.

Treat the given val as a constant of size bytes

Parameters
valis the given value
sizeis the size in bytes
Returns
true if the constant (as sized) has its sign bit set

Referenced by RuleSlessToLess::applyOp(), RuleDivTermAdd::applyOp(), OpBehaviorIntSright::evaluateBinary(), CastStrategyC::localExtensionType(), and ConditionMarker::sameOpComplement().

◆ uintb_negate()

uintb uintb_negate ( uintb  in,
int4  size 
)

Negate the sized value.

Treat the given in as a constant of size bytes. Negate this constant keeping the upper bytes zero.

Parameters
inis the given value
sizeis the size in bytes
Returns
the negation of the sized constant

References calc_mask().

Referenced by RuleSborrow::applyOp(), RuleEqual2Zero::applyOp(), OpBehaviorInt2Comp::evaluateUnary(), OpBehaviorIntNegate::evaluateUnary(), and RulePtrArith::transformPtr().

◆ unsignedCompare128()

int4 unsignedCompare128 ( uint8 *  a,
uint8 *  b 
)

Compare two unsigned 128-bit values.

TODO: Remove once we import a full multiprecision library. Given a first and second value, return -1, 0, or 1 depending on whether the first value is less, equal, or greater than the second value.

Parameters
ais the first 128-bit value (as an array of 2 uint8 elements)
bis the second 128-bit value
Returns
the comparison code

Referenced by power2Divide().

◆ unsignedSubtract128()

void unsignedSubtract128 ( uint8 *  a,
uint8 *  b 
)

Subtract (in-place) a 128-bit value from a base 128-value.

The base value is altered in place. TODO: Remove once we import a full multiprecision library.

Parameters
ais the base 128-bit value being subtracted from in-place
bis the other 128-bit value being subtracted

Referenced by power2Divide().

◆ zero_extend()

void zero_extend ( intb &  val,
int4  bit 
)

Clear all bits above given bit.

Zero extend val starting at bit

Parameters
valis a reference to the value to be zero extended
bitis the index of the bit to extend from (0=least significant bit)

Referenced by OpBehaviorIntSdiv::evaluateBinary(), and OpBehaviorIntSrem::evaluateBinary().