retdec
bracket_manager.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_LLVMIR2HLL_HLL_BRACKET_MANAGER_H
8 #define RETDEC_LLVMIR2HLL_HLL_BRACKET_MANAGER_H
9 
10 #include <map>
11 #include <stack>
12 
16 
17 namespace retdec {
18 namespace llvmir2hll {
19 
20 class BinaryOpExpr;
21 class CastExpr;
22 class Expression;
23 class TernaryOpExpr;
24 class UnaryOpExpr;
25 
39 protected:
41  enum class Operators {
42  ADD,
43  ADDRESS,
44  AND,
45  ARRAY,
46  ASSIGN,
47  BITAND,
48  BITOR,
49  BITSHL,
50  BITSHR,
51  BITXOR,
52  CALL,
53  CAST,
54  COMMA,
55  DEREF,
56  DIV,
57  EQ,
58  GT,
59  GTEQ,
60  LT,
61  LTEQ,
62  MOD,
63  MUL,
64  NEG,
65  NEQ,
66  NOT,
67  OR,
68  STRUCT,
69  SUB,
70  TERNARY
71  };
72 
74  enum class Direction {
75  CENTER,
76  LEFT,
77  RIGHT
78  };
79 
82  // It is not a scoped enum (no "class" after "enum") because the code is
83  // more readable without the enum's name.
85  L,
86  R,
87  N,
88  S
89  };
90 
93  struct ItemOfPrecTable {
96  };
97 
100  struct PrevOperators {
103  };
104 
106  static const bool T = true;
107  static const bool F = false;
109  // Has to correspond to the number of elements in the Operators enum (!).
110  static const int PREC_TABLE_SIZE = 29;
111 
112 private:
115  std::stack<PrevOperators> prevOperatorsStack;
118  std::map<ShPtr<Expression>, bool> bracketsAreNeededMap;
121 
122 public:
124 
125  void init();
126 
130  virtual std::string getId() const = 0;
131 
133 
137  virtual void visit(ShPtr<AddressOpExpr> expr) override;
138  virtual void visit(ShPtr<AssignOpExpr> expr) override;
139  virtual void visit(ShPtr<ArrayIndexOpExpr> expr) override;
140  virtual void visit(ShPtr<StructIndexOpExpr> expr) override;
141  virtual void visit(ShPtr<DerefOpExpr> expr) override;
142  virtual void visit(ShPtr<NotOpExpr> expr) override;
143  virtual void visit(ShPtr<NegOpExpr> expr) override;
144  virtual void visit(ShPtr<EqOpExpr> expr) override;
145  virtual void visit(ShPtr<NeqOpExpr> expr) override;
146  virtual void visit(ShPtr<LtEqOpExpr> expr) override;
147  virtual void visit(ShPtr<GtEqOpExpr> expr) override;
148  virtual void visit(ShPtr<LtOpExpr> expr) override;
149  virtual void visit(ShPtr<GtOpExpr> expr) override;
150  virtual void visit(ShPtr<AddOpExpr> expr) override;
151  virtual void visit(ShPtr<SubOpExpr> expr) override;
152  virtual void visit(ShPtr<MulOpExpr> expr) override;
153  virtual void visit(ShPtr<ModOpExpr> expr) override;
154  virtual void visit(ShPtr<DivOpExpr> expr) override;
155  virtual void visit(ShPtr<AndOpExpr> expr) override;
156  virtual void visit(ShPtr<OrOpExpr> expr) override;
157  virtual void visit(ShPtr<BitAndOpExpr> expr) override;
158  virtual void visit(ShPtr<BitOrOpExpr> expr) override;
159  virtual void visit(ShPtr<BitXorOpExpr> expr) override;
160  virtual void visit(ShPtr<BitShlOpExpr> expr) override;
161  virtual void visit(ShPtr<BitShrOpExpr> expr) override;
162  virtual void visit(ShPtr<TernaryOpExpr> expr) override;
163  virtual void visit(ShPtr<CallExpr> expr) override;
164  virtual void visit(ShPtr<CommaOpExpr> expr) override;
165  // Casts
166  virtual void visit(ShPtr<BitCastExpr> expr) override;
167  virtual void visit(ShPtr<ExtCastExpr> expr) override;
168  virtual void visit(ShPtr<TruncCastExpr> expr) override;
169  virtual void visit(ShPtr<FPToIntCastExpr> expr) override;
170  virtual void visit(ShPtr<IntToFPCastExpr> expr) override;
171  virtual void visit(ShPtr<IntToPtrCastExpr> expr) override;
172  virtual void visit(ShPtr<PtrToIntCastExpr> expr) override;
173  // Constants
174  virtual void visit(ShPtr<ConstBool> constant) override;
175  virtual void visit(ShPtr<ConstFloat> constant) override;
176  virtual void visit(ShPtr<ConstInt> constant) override;
177  virtual void visit(ShPtr<ConstNullPointer> constant) override;
178  virtual void visit(ShPtr<ConstString> constant) override;
179  virtual void visit(ShPtr<ConstArray> constant) override;
180  virtual void visit(ShPtr<ConstStruct> constant) override;
181  virtual void visit(ShPtr<ConstSymbol> constant) override;
182  // Extra
183  virtual void visit(ShPtr<Variable> var) override;
185 
186 protected:
187  virtual ItemOfPrecTable checkPrecTable(Operators currentOperator,
188  Operators prevOperator) = 0;
189  virtual bool isOperatorSupported(Operators currentOperator) = 0;
190 
192 
193 private:
194  void addOperatorOnStackIfSupported(Operators currentOperator,
195  Direction direction);
197  Operators currentOperator);
198  bool areBracketsNeededPrecTable(Operators currentOperator);
199  void removeOperatorFromStackIfSupported(Operators currentOperator);
200 
202  ShPtr<BinaryOpExpr> expr, Operators currentOperator);
204  ShPtr<CallExpr> expr, Operators currentOperator);
206  ShPtr<CastExpr> expr, Operators currentOperator);
208  ShPtr<TernaryOpExpr> expr, Operators currentOperator);
210  ShPtr<UnaryOpExpr> expr, Operators currentOperator);
211 };
212 
213 } // namespace llvmir2hll
214 } // namespace retdec
215 
216 #endif
A base class of all brackets managers.
Definition: bracket_manager.h:38
void treeTraversalForCallWithStackOperations(ShPtr< CallExpr > expr, Operators currentOperator)
Function visit arguments of CallExpr. Function also add operator on stack of previous operators and a...
Definition: bracket_manager.cpp:273
void treeTraversalForCastWithStackOperations(ShPtr< CastExpr > expr, Operators currentOperator)
Function visit operand of CastExpr. Function also add operator on stack of previous operators and aft...
Definition: bracket_manager.cpp:258
Direction
Enumeration for direction tree traversal.
Definition: bracket_manager.h:74
BracketManager(ShPtr< Module > module)
Constructs a new base class for brackets managers.
Definition: bracket_manager.cpp:69
void treeTraversalForUnaryOpWithStackOperations(ShPtr< UnaryOpExpr > expr, Operators currentOperator)
Function visit operand of UnaryOpExpr. Function also add operator on stack of previous operators and ...
Definition: bracket_manager.cpp:201
void removeOperatorFromStackIfSupported(Operators currentOperator)
Pop element from prevOperatorsStack. If operator is not supported, operator is not popped from stack.
Definition: bracket_manager.cpp:186
virtual ItemOfPrecTable checkPrecTable(Operators currentOperator, Operators prevOperator)=0
ShPtr< Module > module
The module to be analyzed.
Definition: bracket_manager.h:120
void treeTraversalForBinaryOpWithStackOperations(ShPtr< BinaryOpExpr > expr, Operators currentOperator)
Function visit operands of BinaryOpExpr. Function also add operator on stack of previous operators an...
Definition: bracket_manager.cpp:216
virtual bool isOperatorSupported(Operators currentOperator)=0
static const int PREC_TABLE_SIZE
Constant for size of precedence table.
Definition: bracket_manager.h:110
bool areBracketsNeeded(ShPtr< Expression > expr)
Function that decides whether the brackets are needed. This function is needed to be called from HLL ...
Definition: bracket_manager.cpp:101
virtual std::string getId() const =0
Returns the ID of the BracketManager.
Operators
Enumeration for operators.
Definition: bracket_manager.h:41
void addOperatorOnStackIfSupported(Operators currentOperator, Direction direction)
Create a structure which contains previous operator and direction of tree traversal and add it on sta...
Definition: bracket_manager.cpp:171
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
void areBracketsNeededForExpr(ShPtr< Expression > expr, Operators currentOperator)
Function find out, if brackets are needed for input expression.
Definition: bracket_manager.cpp:112
static const bool F
Definition: bracket_manager.h:107
void init()
Iterate through the module and visit all functions and all global variables. Starts brackets analyse.
Definition: bracket_manager.cpp:77
void treeTraversalForTernaryOpWithStackOperations(ShPtr< TernaryOpExpr > expr, Operators currentOperator)
Function visit operands of TernaryOpExpr. Function also add operator on stack of previous operators a...
Definition: bracket_manager.cpp:235
bool areBracketsNeededPrecTable(Operators currentOperator)
This function enter to precedence table with function checkPrecTable(...) and accordance it decide to...
Definition: bracket_manager.cpp:129
static const bool T
Bool constants.
Definition: bracket_manager.h:106
FirstParInItemOfPrecTable
Definition: bracket_manager.h:84
@ L
Definition: bracket_manager.h:85
@ R
Definition: bracket_manager.h:86
@ S
Definition: bracket_manager.h:88
@ N
Definition: bracket_manager.h:87
std::map< ShPtr< Expression >, bool > bracketsAreNeededMap
Definition: bracket_manager.h:118
std::stack< PrevOperators > prevOperatorsStack
Definition: bracket_manager.h:115
PrevOperators getPrevOperator()
Top element from prevOperatorsStack.
Definition: bracket_manager.cpp:158
A visitor that visits everything in an ordered way.
Definition: ordered_all_visitor.h:44
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
A library providing API for working with back-end IR.
std::shared_ptr< T > ShPtr
An alias for a shared pointer.
Definition: smart_ptr.h:18
Definition: archive_wrapper.h:19
A visitor that visits everything in an ordered way.
Declarations, aliases, macros, etc. for the use of smart pointers.
FirstParInItemOfPrecTable association
Definition: bracket_manager.h:94
bool bracketsNeeded
Definition: bracket_manager.h:95
Definition: bracket_manager.h:100
Direction treeDirection
Definition: bracket_manager.h:102
Operators prevOperator
Definition: bracket_manager.h:101
Aliases for several useful types.