44# ------------------------------------------------------------------------------
55# The MIT License (MIT)
66#
7- # Copyright (c) 2021-2023 Aarno Labs LLC
7+ # Copyright (c) 2021-2025 Aarno Labs LLC
88#
99# Permission is hereby granted, free of charge, to any person obtaining a copy
1010# of this software and associated documentation files (the "Software"), to deal
3030from chb .app .InstrXData import InstrXData
3131
3232from chb .arm .ARMDictionaryRecord import armregistry
33- from chb .arm .ARMOpcode import ARMOpcode , simplify_result
33+ from chb .arm .ARMOpcode import ARMOpcode , ARMOpcodeXData , simplify_result
3434from chb .arm .ARMOperand import ARMOperand
3535
3636import chb .ast .ASTNode as AST
3939import chb .invariants .XXprUtil as XU
4040
4141import chb .util .fileutil as UF
42-
4342from chb .util .IndexedTable import IndexedTableValue
43+ from chb .util .loggingutil import chklogger
44+
4445
4546if TYPE_CHECKING :
46- import chb .arm .ARMDictionary
47+ from chb .arm .ARMDictionary import ARMDictionary
48+ from chb .invariants .XVariable import XVariable
49+ from chb .invariants .XXpr import XXpr
50+
51+
52+ class ARMBitwiseOrNotXData (ARMOpcodeXData ):
53+
54+ def __init__ (self , xdata : InstrXData ) -> None :
55+ ARMOpcodeXData .__init__ (self , xdata )
56+
57+ @property
58+ def vrd (self ) -> "XVariable" :
59+ return self .var (0 , "vrd" )
60+
61+ @property
62+ def xrn (self ) -> "XXpr" :
63+ return self .xpr (0 , "xrn" )
64+
65+ @property
66+ def xrm (self ) -> "XXpr" :
67+ return self .xpr (1 , "xrm" )
68+
69+ @property
70+ def xrmn (self ) -> "XXpr" :
71+ return self .xpr (2 , "xrmn" )
72+
73+ @property
74+ def result (self ) -> "XXpr" :
75+ return self .xpr (3 , "result" )
76+
77+ @property
78+ def rresult (self ) -> "XXpr" :
79+ return self .xpr (4 , "rresult" )
80+
81+ @property
82+ def result_simplified (self ) -> str :
83+ return simplify_result (
84+ self .xdata .args [4 ], self .xdata .args [5 ], self .result , self .rresult )
85+
86+ @property
87+ def annotation (self ) -> str :
88+ assignment = str (self .vrd ) + " := " + self .result_simplified
89+ return self .add_instruction_condition (assignment )
4790
4891
4992@armregistry .register_tag ("ORN" , ARMOpcode )
@@ -74,10 +117,7 @@ class ARMBitwiseOrNot(ARMOpcode):
74117 useshigh[0]: lhs
75118 """
76119
77- def __init__ (
78- self ,
79- d : "chb.arm.ARMDictionary.ARMDictionary" ,
80- ixval : IndexedTableValue ) -> None :
120+ def __init__ (self , d : "ARMDictionary" , ixval : IndexedTableValue ) -> None :
81121 ARMOpcode .__init__ (self , d , ixval )
82122 self .check_key (2 , 4 , "BitwiseOrNot" )
83123
@@ -99,18 +139,11 @@ def is_writeback(self) -> bool:
99139 return self .args [0 ] == 1
100140
101141 def annotation (self , xdata : InstrXData ) -> str :
102- lhs = str (xdata .vars [0 ])
103- result = xdata .xprs [3 ]
104- rresult = xdata .xprs [4 ]
105- xresult = simplify_result (xdata .args [4 ], xdata .args [5 ], result , rresult )
106- assignment = lhs + " := " + xresult
107- if xdata .has_unknown_instruction_condition ():
108- return "if ? then " + assignment
109- elif xdata .has_instruction_condition ():
110- c = str (xdata .xprs [1 ])
111- return "if " + c + " then " + assignment
142+ xd = ARMBitwiseOrNotXData (xdata )
143+ if xd .is_ok :
144+ return xd .annotation
112145 else :
113- return assignment
146+ return "Error value"
114147
115148 def ast_prov (
116149 self ,
@@ -122,14 +155,6 @@ def ast_prov(
122155
123156 annotations : List [str ] = [iaddr , "ORN" ]
124157
125- lhs = xdata .vars [0 ]
126- rhs1 = xdata .xprs [0 ]
127- rhs2 = xdata .xprs [1 ]
128- rhs4 = xdata .xprs [4 ]
129- rdefs = xdata .reachingdefs
130- defuses = xdata .defuses
131- defuseshigh = xdata .defuseshigh
132-
133158 (ll_lhs , _ , _ ) = self .opargs [0 ].ast_lvalue (astree )
134159 (ll_op1 , _ , _ ) = self .opargs [1 ].ast_rvalue (astree )
135160 (ll_op2 , _ , _ ) = self .opargs [2 ].ast_rvalue (astree )
@@ -143,27 +168,21 @@ def ast_prov(
143168 bytestring = bytestring ,
144169 annotations = annotations )
145170
146- lhsasts = XU .xvariable_to_ast_lvals (lhs , xdata , astree )
147- if len (lhsasts ) == 0 :
148- raise UF .CHBError ("BitwiseOrNot (ORN): no lval found" )
149-
150- if len (lhsasts ) > 1 :
151- raise UF .CHBError (
152- "BitwiseOrNot (ORN): multiple lvals found: "
153- + ", " .join (str (v ) for v in lhsasts ))
154-
155- hl_lhs = lhsasts [0 ]
171+ xd = ARMBitwiseOrNotXData (xdata )
172+ if not xd .is_ok :
173+ chklogger .logger .error (
174+ "Encountered error value at address %s" , iaddr )
175+ return ([], [])
156176
157- rhsasts = XU .xxpr_to_ast_def_exprs (rhs4 , xdata , iaddr , astree )
158- if len (rhsasts ) == 0 :
159- raise UF .CHBError ("BitwiseOrNot (ORN): no lval found" )
177+ lhs = xd .vrd
178+ rhs = xd .rresult
160179
161- if len (rhsasts ) > 1 :
162- raise UF .CHBError (
163- "BitwiseOrNot (ORN): multiple rhs values found: "
164- + ", " .join (str (v ) for v in rhsasts ))
180+ rdefs = xdata .reachingdefs
181+ defuses = xdata .defuses
182+ defuseshigh = xdata .defuseshigh
165183
166- hl_rhs = rhsasts [0 ]
184+ hl_lhs = XU .xvariable_to_ast_lval (lhs , xdata , iaddr , astree )
185+ hl_rhs = XU .xxpr_to_ast_def_expr (rhs , xdata , iaddr , astree )
167186
168187 hl_assign = astree .mk_assign (
169188 hl_lhs ,
0 commit comments