Ghidra Decompiler Analysis Engine
Public Member Functions | Static Public Member Functions | List of all members
GuardRecord Class Reference

A (putative) switch variable Varnode and a constraint imposed by a CBRANCH. More...

#include <jumptable.hh>

Public Member Functions

 GuardRecord (PcodeOp *bOp, PcodeOp *rOp, int4 path, const CircleRange &rng, Varnode *v)
 Constructor. More...
 
int4 valueMatch (Varnode *vn2, Varnode *baseVn2, int4 bitsPreserved2) const
 Determine if this guard applies to the given Varnode. More...
 

Static Public Member Functions

static int4 oneOffMatch (PcodeOp *op1, PcodeOp *op2)
 Return 1 if the two given PcodeOps produce exactly the same value, 0 if otherwise. More...
 
static VarnodequasiCopy (Varnode *vn, int4 &bitsPreserved)
 Compute the source of a quasi-COPY chain for the given Varnode. More...
 

Detailed Description

A (putative) switch variable Varnode and a constraint imposed by a CBRANCH.

The record constrains a specific Varnode. If the associated CBRANCH is followed along the path that reaches the switch's BRANCHIND, then we have an explicit description of the possible values the Varnode can hold.

Constructor & Destructor Documentation

◆ GuardRecord()

GuardRecord::GuardRecord ( PcodeOp bOp,
PcodeOp rOp,
int4  path,
const CircleRange rng,
Varnode v 
)

Constructor.

Parameters
bOpis the CBRANCH guarding the switch
rOpis the PcodeOp immediately reading the Varnode
pathis the specific branch to take from the CBRANCH to reach the switch
rngis the range of values causing the switch path to be taken
vis the Varnode holding the value controlling the CBRANCH

Member Function Documentation

◆ oneOffMatch()

int4 GuardRecord::oneOffMatch ( PcodeOp op1,
PcodeOp op2 
)
static

Return 1 if the two given PcodeOps produce exactly the same value, 0 if otherwise.

We up through only one level of PcodeOp calculation and only for certain binary ops where the second parameter is a constant.

Parameters
op1is the first given PcodeOp to test
op2is the second given PcodeOp
Returns
1 if the same value is produced, 0 otherwise

◆ quasiCopy()

Varnode * GuardRecord::quasiCopy ( Varnode vn,
int4 &  bitsPreserved 
)
static

Compute the source of a quasi-COPY chain for the given Varnode.

A value is a quasi-copy if a sequence of PcodeOps producing it always hold the value as the least significant bits of their output Varnode, but the sequence may put other non-zero values in the upper bits. This method computes the earliest ancestor Varnode for which the given Varnode can be viewed as a quasi-copy.

Parameters
vnis the given Varnode
bitsPreservedwill hold the number of least significant bits preserved by the sequence
Returns
the earliest source of the quasi-copy, which may just be the given Varnode

◆ valueMatch()

int4 GuardRecord::valueMatch ( Varnode vn2,
Varnode baseVn2,
int4  bitsPreserved2 
) const

Determine if this guard applies to the given Varnode.

The guard applies if we know the given Varnode holds the same value as the Varnode attached to the guard. So we return:

  • 0, if the two Varnodes do not clearly hold the same value.
  • 1, if the two Varnodes clearly hold the same value.
  • 2, if the two Varnode clearly hold the same value, pending no writes between their defining op.
Parameters
vn2is the given Varnode being tested against this guard
baseVn2is the earliest Varnode from which the given Varnode is quasi-copied.
bitsPreserved2is the number of potentially non-zero bits in the given Varnode
Returns
the matching code 0, 1, or 2

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