1 /* Copyright (C) 2021-2023 Free Software Foundation, Inc.
2 Contributed by Oracle.
3
4 This file is part of GNU Binutils.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #ifndef _EXPRESSION_H
22 #define _EXPRESSION_H
23
24 #include <inttypes.h>
25
26 class Experiment;
27 class DataView;
28 class DbeView;
29 class Histable;
30
31 class Expression
32 {
33 public:
34
35 class Context
36 {
37 public:
38 Context (DbeView *_dbev, Experiment *_exp = 0);
39 Context (DbeView *_dbev, Experiment *_exp, DataView *_dview, long _eventId);
40
41 ~Context () { };
42
43 void
44 put (DataView *d, long id)
45 {
46 dview = d;
47 eventId = id;
48 };
49
50 void
51 put (Experiment *_exp)
52 {
53 exp = _exp;
54 };
55
56 Experiment *exp;
57 DataView *dview;
58 DbeView *dbev;
59 long eventId;
60 };
61
62 enum OpCode
63 {
64 OP_NONE,
65 OP_QWE,
66 OP_COLON,
67 OP_OR,
68 OP_AND,
69 OP_NOT,
70 OP_EQV,
71 OP_NEQV,
72 OP_BITOR,
73 OP_BITAND,
74 OP_BITXOR,
75 OP_BITNOT,
76 OP_EQ,
77 OP_NE,
78 OP_LT,
79 OP_GT,
80 OP_LE,
81 OP_GE,
82 OP_LS,
83 OP_RS,
84 OP_ADD,
85 OP_MINUS,
86 OP_MUL,
87 OP_DIV,
88 OP_REM,
89 OP_DEG,
90 OP_COMMA,
91 OP_IN,
92 OP_SOMEIN,
93 OP_ORDRIN,
94 OP_NUM,
95 OP_NAME,
96 OP_FUNC,
97 OP_FILE,
98 OP_JAVA,
99 OP_HASPROP,
100 OP_LIBRARY_IN,
101 OP_LIBRARY_SOMEIN,
102 OP_LIBRARY_ORDRIN
103 };
104
105 enum FuncCode
106 {
107 FUNC_FNAME,
108 FUNC_DNAME
109 };
110
111 enum JavaCode
112 {
113 JAVA_JGROUP,
114 JAVA_JPARENT
115 };
116
117 Expression (OpCode, const Expression*, const Expression* = 0);
118 Expression (OpCode, uint64_t);
119 Expression (const Expression &rhs);
120 Expression (const Expression *rhs);
121 Expression &operator= (const Expression &rhs);
122 ~Expression ();
123
124 Expression *
125 copy () const
126 {
127 return new Expression (this);
128 }
129 void copy (const Expression *rhs);
130
131 uint64_t
132 eval (Context *ctx)
133 {
134 return bEval (ctx) ? v.val : 0;
135 };
136
137 bool
138 passes (Context *ctx)
139 {
140 return bEval (ctx) ? v.val != 0 : true;
141 };
142
143 bool
144 complete ()
145 {
146 return op == OP_NUM;
147 };
148
149 bool verifyObjectInExpr (Histable *obj);
150 Expression *
151 pEval (Context *ctx); // Partial evaluation to simplify expression
152
153 private:
154
155 struct Value
156 {
157
158 Value (uint64_t _val = 0, Value *_next = 0) : val (_val), next (_next)
159 {
160 fn = 0;
161 }
162 uint64_t val;
163 uint64_t fn;
164 Value *next;
165 };
166
167 bool getVal (int propId, Context *ctx);
168 bool bEval (Context *ctx);
169 bool hasLoadObject ();
170
171 OpCode op;
172 Value v;
173 Expression *arg0;
174 Expression *arg1;
175 };
176
177
178 #endif /* _EXPRESSION_H */