Skip to content

Commit 33fe341

Browse files
committed
AST: add check for constant-value expression
1 parent 3dd0e0f commit 33fe341

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

chb/ast/ASTNode.py

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1003,7 +1003,8 @@ def address_taken(self) -> Set[str]:
10031003
return self.lhs.address_taken().union(self.rhs.address_taken())
10041004

10051005
def variables_used(self) -> Set[str]:
1006-
return self.lhs.variables_used().union(self.rhs.variables_used())
1006+
lhsvars = set([]) if self.lhs.is_variable else self.lhs.variables_used()
1007+
return self.rhs.variables_used().union(lhsvars)
10071008

10081009
def callees(self) -> Set[str]:
10091010
return set([])
@@ -1051,6 +1052,12 @@ def tgt(self) -> "ASTExpr":
10511052
def arguments(self) -> List["ASTExpr"]:
10521053
return self._args
10531054

1055+
def variables_used(self) -> Set[str]:
1056+
result: Set[str] = set([])
1057+
for arg in self.arguments:
1058+
result = result.union(arg.variables_used())
1059+
return result
1060+
10541061
def accept(self, visitor: "ASTVisitor") -> None:
10551062
visitor.visit_call_instr(self)
10561063

@@ -1142,6 +1149,10 @@ def lvalid(self) -> int:
11421149
def lhost(self) -> "ASTLHost":
11431150
return self._lhost
11441151

1152+
@property
1153+
def is_constant_value_expression(self) -> bool:
1154+
return self.lhost.is_constant_value_expression
1155+
11451156
@property
11461157
def offset(self) -> "ASTOffset":
11471158
return self._offset
@@ -1204,6 +1215,14 @@ def is_variable(self) -> bool:
12041215
def is_global(self) -> bool:
12051216
return False
12061217

1218+
@property
1219+
def is_ssa(self) -> bool:
1220+
return False
1221+
1222+
@property
1223+
def is_constant_value_expression(self) -> bool:
1224+
return self.is_ssa
1225+
12071226
@abstractmethod
12081227
def transform(self, transformer: "ASTTransformer") -> "ASTLHost":
12091228
...
@@ -1226,12 +1245,14 @@ def __init__(
12261245
vtype: Optional["ASTTyp"],
12271246
parameter: Optional[int] = None,
12281247
globaladdress: Optional[int] = None,
1248+
ssa: bool = False,
12291249
vdescr: Optional[str] = None) -> None:
12301250
ASTNode.__init__(self, "varinfo")
12311251
self._vname = vname
12321252
self._vtype = vtype
12331253
self._parameter = parameter
12341254
self._globaladdress = globaladdress
1255+
self._ssa = ssa
12351256
self._vdescr = vdescr # describes what the variable holds
12361257

12371258
@property
@@ -1258,6 +1279,10 @@ def globaladdress(self) -> Optional[int]:
12581279
def is_global(self) -> bool:
12591280
return self.globaladdress is not None
12601281

1282+
@property
1283+
def is_ssa(self) -> bool:
1284+
return self._ssa
1285+
12611286
@property
12621287
def vdescr(self) -> Optional[str]:
12631288
return self._vdescr
@@ -1304,6 +1329,10 @@ def varinfo(self) -> "ASTVarInfo":
13041329
def is_global(self) -> bool:
13051330
return self.varinfo.is_global
13061331

1332+
@property
1333+
def is_ssa(self) -> bool:
1334+
return self.varinfo.is_ssa
1335+
13071336
@property
13081337
def vname(self) -> str:
13091338
return self.varinfo.vname
@@ -1625,6 +1654,10 @@ def is_integer_constant(self) -> bool:
16251654
def is_integer_constant_zero(self) -> bool:
16261655
return False
16271656

1657+
@property
1658+
def is_constant_value_expression(self) -> bool:
1659+
return False
1660+
16281661
@property
16291662
def is_global_address(self) -> bool:
16301663
return False
@@ -1692,6 +1725,10 @@ def __init__(self, exprid: int, tag: str) -> None:
16921725
def is_ast_constant(self) -> bool:
16931726
return True
16941727

1728+
@property
1729+
def is_constant_value_expression(self) -> bool:
1730+
return True
1731+
16951732
def use(self) -> List[str]:
16961733
return []
16971734

@@ -1886,6 +1923,10 @@ def is_ast_lval_expr(self) -> bool:
18861923
def lval(self) -> "ASTLval":
18871924
return self._lval
18881925

1926+
@property
1927+
def is_constant_value_expression(self) -> bool:
1928+
return self.lval.is_constant_value_expression
1929+
18891930
def accept(self, visitor: "ASTVisitor") -> None:
18901931
visitor.visit_lval_expression(self)
18911932

@@ -1921,6 +1962,10 @@ def __init__(self, exprid: int, tgttyp: "ASTTyp") -> None:
19211962
def tgt_type(self) -> "ASTTyp":
19221963
return self._tgttyp
19231964

1965+
@property
1966+
def is_constant_value_expression(self) -> bool:
1967+
return True
1968+
19241969
def accept(self, visitor: "ASTVisitor") -> None:
19251970
visitor.visit_sizeof_expression(self)
19261971

@@ -1956,6 +2001,10 @@ def cast_tgt_type(self) -> "ASTTyp":
19562001
def cast_expr(self) -> "ASTExpr":
19572002
return self._exp
19582003

2004+
@property
2005+
def is_constant_value_expression(self) -> bool:
2006+
return self.cast_expr.is_constant_value_expression
2007+
19592008
def accept(self, visitor: "ASTVisitor") -> None:
19602009
visitor.visit_cast_expression(self)
19612010

@@ -2002,6 +2051,10 @@ def op(self) -> str:
20022051
def exp1(self) -> "ASTExpr":
20032052
return self._exp
20042053

2054+
@property
2055+
def is_constant_value_expression(self) -> bool:
2056+
return self.exp1.is_constant_value_expression
2057+
20052058
def accept(self, visitor: "ASTVisitor") -> None:
20062059
visitor.visit_unary_expression(self)
20072060

@@ -2058,6 +2111,12 @@ def exp1(self) -> "ASTExpr":
20582111
def exp2(self) -> "ASTExpr":
20592112
return self._exp2
20602113

2114+
@property
2115+
def is_constant_value_expression(self) -> bool:
2116+
return (
2117+
self.exp1.is_constant_value_expression
2118+
and self.exp2.is_constant_value_expression)
2119+
20612120
def accept(self, visitor: "ASTVisitor") -> None:
20622121
visitor.visit_binary_expression(self)
20632122

@@ -2119,6 +2178,13 @@ def exp2(self) -> "ASTExpr":
21192178
def exp3(self) -> "ASTExpr":
21202179
return self._exp3
21212180

2181+
@property
2182+
def is_constant_value_expression(self) -> bool:
2183+
return (
2184+
self.exp1.is_constant_value_expression
2185+
and self.exp2.is_constant_value_expression
2186+
and self.exp3.is_constant_value_expression)
2187+
21222188
def accept(self, visitor: "ASTVisitor") -> None:
21232189
visitor.visit_question_expression(self)
21242190

@@ -2164,6 +2230,10 @@ def is_ast_addressof(self) -> bool:
21642230
def lval(self) -> "ASTLval":
21652231
return self._lval
21662232

2233+
@property
2234+
def is_constant_value_expression(self) -> bool:
2235+
return True
2236+
21672237
def accept(self, visitor: "ASTVisitor") -> None:
21682238
visitor.visit_address_of_expression(self)
21692239

@@ -2203,6 +2273,10 @@ def is_ast_startof(self) -> bool:
22032273
def lval(self) -> "ASTLval":
22042274
return self._lval
22052275

2276+
@property
2277+
def is_constant_value_expression(self) -> bool:
2278+
return True
2279+
22062280
def accept(self, visitor: "ASTVisitor") -> None:
22072281
visitor.visit_start_of_expression(self)
22082282

chb/ast/ASTSymbolTable.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def add_symbol(
6363
vtype: Optional[AST.ASTTyp] = None,
6464
parameter: Optional[int] = None,
6565
globaladdress: Optional[int] = None,
66+
ssa: bool = False,
6667
llref: bool = False,
6768
vdescr: Optional[str] = None) -> AST.ASTVarInfo:
6869

@@ -104,6 +105,7 @@ def add_symbol(
104105
vtype=vtype,
105106
parameter=parameter,
106107
globaladdress=globaladdress,
108+
ssa=ssa,
107109
vdescr=vdescr)
108110
self._table[vname] = varinfo
109111
return varinfo
@@ -257,6 +259,7 @@ def add_symbol(
257259
vtype: Optional[AST.ASTTyp] = None,
258260
parameter: Optional[int] = None,
259261
globaladdress: Optional[int] = None,
262+
ssa: bool = False,
260263
llref: bool = False,
261264
vdescr: Optional[str] = None) -> AST.ASTVarInfo:
262265
if parameter is not None:
@@ -266,6 +269,7 @@ def add_symbol(
266269
vname,
267270
vtype=vtype,
268271
globaladdress=globaladdress,
272+
ssa=ssa,
269273
vdescr=vdescr)
270274
if globaladdress is not None:
271275
self._symbolicnames[vinfo.vname] = vinfo

chb/ast/AbstractSyntaxTree.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,14 @@ def add_symbol(
204204
vtype: Optional[AST.ASTTyp] = None,
205205
parameter: Optional[int] = None,
206206
globaladdress: Optional[int] = None,
207+
ssa: bool = False,
207208
vdescr: Optional[str] = None) -> AST.ASTVarInfo:
208209
return self.symboltable.add_symbol(
209210
name,
210211
vtype=vtype,
211212
parameter=parameter,
212213
globaladdress=globaladdress,
214+
ssa=ssa,
213215
vdescr=vdescr)
214216

215217
def add_compinfo(self, cinfo: AST.ASTCompInfo) -> None:

0 commit comments

Comments
 (0)