retdec
Static Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
retdec::llvmir2hll::ExpressionNegater Class Reference

Negation of expressions. More...

#include <expression_negater.h>

Inheritance diagram for retdec::llvmir2hll::ExpressionNegater:
Inheritance graph
[legend]
Collaboration diagram for retdec::llvmir2hll::ExpressionNegater:
Collaboration graph
[legend]

Static Public Member Functions

static ShPtr< Expressionnegate (ShPtr< Expression > expr)
 Negates the given expression. More...
 

Private Types

using ExpressionStack = std::stack< ShPtr< Expression > >
 Type of a container to store expressions. More...
 

Private Member Functions

 ExpressionNegater ()
 Constructs a new expression negater. More...
 
ShPtr< ExpressionnegateInternal (ShPtr< Expression > expr)
 Negates the given expression. More...
 
Visitor Interface
virtual void visit (ShPtr< Variable > var) override
 
virtual void visit (ShPtr< AddressOpExpr > expr) override
 
virtual void visit (ShPtr< AssignOpExpr > expr) override
 
virtual void visit (ShPtr< ArrayIndexOpExpr > expr) override
 
virtual void visit (ShPtr< StructIndexOpExpr > expr) override
 
virtual void visit (ShPtr< DerefOpExpr > expr) override
 
virtual void visit (ShPtr< NotOpExpr > expr) override
 
virtual void visit (ShPtr< NegOpExpr > expr) override
 
virtual void visit (ShPtr< EqOpExpr > expr) override
 
virtual void visit (ShPtr< NeqOpExpr > expr) override
 
virtual void visit (ShPtr< LtEqOpExpr > expr) override
 
virtual void visit (ShPtr< GtEqOpExpr > expr) override
 
virtual void visit (ShPtr< LtOpExpr > expr) override
 
virtual void visit (ShPtr< GtOpExpr > expr) override
 
virtual void visit (ShPtr< AddOpExpr > expr) override
 
virtual void visit (ShPtr< SubOpExpr > expr) override
 
virtual void visit (ShPtr< MulOpExpr > expr) override
 
virtual void visit (ShPtr< ModOpExpr > expr) override
 
virtual void visit (ShPtr< DivOpExpr > expr) override
 
virtual void visit (ShPtr< AndOpExpr > expr) override
 
virtual void visit (ShPtr< OrOpExpr > expr) override
 
virtual void visit (ShPtr< BitAndOpExpr > expr) override
 
virtual void visit (ShPtr< BitOrOpExpr > expr) override
 
virtual void visit (ShPtr< BitXorOpExpr > expr) override
 
virtual void visit (ShPtr< BitShlOpExpr > expr) override
 
virtual void visit (ShPtr< BitShrOpExpr > expr) override
 
virtual void visit (ShPtr< TernaryOpExpr > expr) override
 
virtual void visit (ShPtr< CallExpr > expr) override
 
virtual void visit (ShPtr< CommaOpExpr > expr) override
 
virtual void visit (ShPtr< ConstBool > constant) override
 
virtual void visit (ShPtr< ConstFloat > constant) override
 
virtual void visit (ShPtr< ConstInt > constant) override
 
virtual void visit (ShPtr< ConstNullPointer > constant) override
 
virtual void visit (ShPtr< ConstString > constant) override
 
virtual void visit (ShPtr< ConstArray > constant) override
 
virtual void visit (ShPtr< ConstStruct > constant) override
 
virtual void visit (ShPtr< ConstSymbol > constant) override
 
virtual void visit (ShPtr< GlobalVarDef > varDef) override
 
virtual void visit (ShPtr< Function > func) override
 
virtual void visit (ShPtr< AssignStmt > stmt) override
 
virtual void visit (ShPtr< VarDefStmt > stmt) override
 
virtual void visit (ShPtr< CallStmt > stmt) override
 
virtual void visit (ShPtr< ReturnStmt > stmt) override
 
virtual void visit (ShPtr< EmptyStmt > stmt) override
 
virtual void visit (ShPtr< IfStmt > stmt) override
 
virtual void visit (ShPtr< SwitchStmt > stmt) override
 
virtual void visit (ShPtr< WhileLoopStmt > stmt) override
 
virtual void visit (ShPtr< ForLoopStmt > stmt) override
 
virtual void visit (ShPtr< UForLoopStmt > stmt) override
 
virtual void visit (ShPtr< BreakStmt > stmt) override
 
virtual void visit (ShPtr< ContinueStmt > stmt) override
 
virtual void visit (ShPtr< GotoStmt > stmt) override
 
virtual void visit (ShPtr< UnreachableStmt > stmt) override
 
virtual void visit (ShPtr< FloatType > type) override
 
virtual void visit (ShPtr< IntType > type) override
 
virtual void visit (ShPtr< PointerType > type) override
 
virtual void visit (ShPtr< StringType > type) override
 
virtual void visit (ShPtr< ArrayType > type) override
 
virtual void visit (ShPtr< StructType > type) override
 
virtual void visit (ShPtr< FunctionType > type) override
 
virtual void visit (ShPtr< VoidType > type) override
 
virtual void visit (ShPtr< UnknownType > type) override
 
virtual void visit (ShPtr< BitCastExpr > expr) override
 
virtual void visit (ShPtr< ExtCastExpr > expr) override
 
virtual void visit (ShPtr< TruncCastExpr > expr) override
 
virtual void visit (ShPtr< FPToIntCastExpr > expr) override
 
virtual void visit (ShPtr< IntToFPCastExpr > expr) override
 
virtual void visit (ShPtr< IntToPtrCastExpr > expr) override
 
virtual void visit (ShPtr< PtrToIntCastExpr > expr) override
 
- Private Member Functions inherited from retdec::llvmir2hll::Visitor
virtual ~Visitor ()=default
 
 Visitor ()=default
 
- Private Member Functions inherited from retdec::utils::NonCopyable
 NonCopyable (const NonCopyable &)=delete
 
NonCopyableoperator= (const NonCopyable &)=delete
 
 NonCopyable ()=default
 
 ~NonCopyable ()=default
 

Private Attributes

ExpressionStack exprStack
 A stack to store expressions during negations. More...
 

Detailed Description

Negation of expressions.

This class supports negation of expressions. For example, the expression

a == b and c < d

is negated into the following form

a != b or c >= d

De-Morgan rules are used whenever possible to reduce the size of negated expressions. Also, a double negation is replaced with no negation.

This class implements the "static helper" (or "library") design pattern (it has just static functions and no instances can be created).

Member Typedef Documentation

◆ ExpressionStack

Type of a container to store expressions.

Constructor & Destructor Documentation

◆ ExpressionNegater()

retdec::llvmir2hll::ExpressionNegater::ExpressionNegater ( )
private

Constructs a new expression negater.

Member Function Documentation

◆ negate()

ShPtr< Expression > retdec::llvmir2hll::ExpressionNegater::negate ( ShPtr< Expression expr)
static

Negates the given expression.

See the class description for more details.

Preconditions
  • expr is non-null

◆ negateInternal()

ShPtr< Expression > retdec::llvmir2hll::ExpressionNegater::negateInternal ( ShPtr< Expression expr)
private

Negates the given expression.

Since visitation functions return void, we use the private variable exprStack to manually simulate recursion. Hence, instead of returning a value from a visitation function, we push it onto the stack.

Preconditions
  • expr is non-null

◆ visit() [1/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< AddOpExpr expr)
overrideprivatevirtual

◆ visit() [2/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< AddressOpExpr expr)
overrideprivatevirtual

◆ visit() [3/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< AndOpExpr expr)
overrideprivatevirtual

◆ visit() [4/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ArrayIndexOpExpr expr)
overrideprivatevirtual

◆ visit() [5/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ArrayType type)
overrideprivatevirtual

◆ visit() [6/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< AssignOpExpr expr)
overrideprivatevirtual

◆ visit() [7/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< AssignStmt stmt)
overrideprivatevirtual

◆ visit() [8/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BitAndOpExpr expr)
overrideprivatevirtual

◆ visit() [9/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BitCastExpr expr)
overrideprivatevirtual

◆ visit() [10/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BitOrOpExpr expr)
overrideprivatevirtual

◆ visit() [11/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BitShlOpExpr expr)
overrideprivatevirtual

◆ visit() [12/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BitShrOpExpr expr)
overrideprivatevirtual

◆ visit() [13/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BitXorOpExpr expr)
overrideprivatevirtual

◆ visit() [14/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< BreakStmt stmt)
overrideprivatevirtual

◆ visit() [15/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< CallExpr expr)
overrideprivatevirtual

◆ visit() [16/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< CallStmt stmt)
overrideprivatevirtual

◆ visit() [17/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< CommaOpExpr expr)
overrideprivatevirtual

◆ visit() [18/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstArray constant)
overrideprivatevirtual

◆ visit() [19/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstBool constant)
overrideprivatevirtual

◆ visit() [20/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstFloat constant)
overrideprivatevirtual

◆ visit() [21/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstInt constant)
overrideprivatevirtual

◆ visit() [22/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstNullPointer constant)
overrideprivatevirtual

◆ visit() [23/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstString constant)
overrideprivatevirtual

◆ visit() [24/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstStruct constant)
overrideprivatevirtual

◆ visit() [25/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ConstSymbol constant)
overrideprivatevirtual

◆ visit() [26/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ContinueStmt stmt)
overrideprivatevirtual

◆ visit() [27/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< DerefOpExpr expr)
overrideprivatevirtual

◆ visit() [28/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< DivOpExpr expr)
overrideprivatevirtual

◆ visit() [29/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< EmptyStmt stmt)
overrideprivatevirtual

◆ visit() [30/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< EqOpExpr expr)
overrideprivatevirtual

◆ visit() [31/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ExtCastExpr expr)
overrideprivatevirtual

◆ visit() [32/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< FloatType type)
overrideprivatevirtual

◆ visit() [33/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ForLoopStmt stmt)
overrideprivatevirtual

◆ visit() [34/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< FPToIntCastExpr expr)
overrideprivatevirtual

◆ visit() [35/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< Function func)
overrideprivatevirtual

◆ visit() [36/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< FunctionType type)
overrideprivatevirtual

◆ visit() [37/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< GlobalVarDef varDef)
overrideprivatevirtual

◆ visit() [38/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< GotoStmt stmt)
overrideprivatevirtual

◆ visit() [39/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< GtEqOpExpr expr)
overrideprivatevirtual

◆ visit() [40/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< GtOpExpr expr)
overrideprivatevirtual

◆ visit() [41/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< IfStmt stmt)
overrideprivatevirtual

◆ visit() [42/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< IntToFPCastExpr expr)
overrideprivatevirtual

◆ visit() [43/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< IntToPtrCastExpr expr)
overrideprivatevirtual

◆ visit() [44/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< IntType type)
overrideprivatevirtual

◆ visit() [45/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< LtEqOpExpr expr)
overrideprivatevirtual

◆ visit() [46/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< LtOpExpr expr)
overrideprivatevirtual

◆ visit() [47/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ModOpExpr expr)
overrideprivatevirtual

◆ visit() [48/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< MulOpExpr expr)
overrideprivatevirtual

◆ visit() [49/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< NegOpExpr expr)
overrideprivatevirtual

◆ visit() [50/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< NeqOpExpr expr)
overrideprivatevirtual

◆ visit() [51/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< NotOpExpr expr)
overrideprivatevirtual

◆ visit() [52/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< OrOpExpr expr)
overrideprivatevirtual

◆ visit() [53/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< PointerType type)
overrideprivatevirtual

◆ visit() [54/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< PtrToIntCastExpr expr)
overrideprivatevirtual

◆ visit() [55/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< ReturnStmt stmt)
overrideprivatevirtual

◆ visit() [56/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< StringType type)
overrideprivatevirtual

◆ visit() [57/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< StructIndexOpExpr expr)
overrideprivatevirtual

◆ visit() [58/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< StructType type)
overrideprivatevirtual

◆ visit() [59/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< SubOpExpr expr)
overrideprivatevirtual

◆ visit() [60/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< SwitchStmt stmt)
overrideprivatevirtual

◆ visit() [61/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< TernaryOpExpr expr)
overrideprivatevirtual

◆ visit() [62/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< TruncCastExpr expr)
overrideprivatevirtual

◆ visit() [63/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< UForLoopStmt stmt)
overrideprivatevirtual

◆ visit() [64/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< UnknownType type)
overrideprivatevirtual

◆ visit() [65/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< UnreachableStmt stmt)
overrideprivatevirtual

◆ visit() [66/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< VarDefStmt stmt)
overrideprivatevirtual

◆ visit() [67/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< Variable var)
overrideprivatevirtual

◆ visit() [68/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< VoidType type)
overrideprivatevirtual

◆ visit() [69/69]

void retdec::llvmir2hll::ExpressionNegater::visit ( ShPtr< WhileLoopStmt stmt)
overrideprivatevirtual

Member Data Documentation

◆ exprStack

ExpressionStack retdec::llvmir2hll::ExpressionNegater::exprStack
private

A stack to store expressions during negations.


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