@@ -44,6 +44,8 @@ open BCHBasicTypes
4444open BCHLibTypes
4545open BCHSumTypeSerializer
4646
47+ module TR = CHTraceResult
48+
4749
4850let bcd = BCHBCDictionary. bcdictionary
4951let bd = BCHDictionary. bdictionary
@@ -74,6 +76,8 @@ object (self)
7476 val xd = xd
7577 val memory_base_table = mk_index_table " memory-base-table"
7678 val memory_offset_table = mk_index_table " memory-offset-table"
79+ val sideeffect_argument_location_table =
80+ mk_index_table " sideeffect-argument-location-table"
7781 val assembly_variable_denotation_table =
7882 mk_index_table " assembly-variable-denotation-table"
7983 val constant_value_variable_table =
@@ -172,6 +176,38 @@ object (self)
172176 | "u" -> UnknownOffset
173177 | s -> raise_tag_error name s memory_offset_mcts#tags
174178
179+ method index_sideeffect_argument_location (s : sideeffect_argument_location_t ) =
180+ let tags = [sideeffect_argument_location_mcts#ts s] in
181+ let key = match s with
182+ | SEGlobal a -> (tags @ [a#to_hex_string], [] )
183+ | SEStack s -> (tags @ [s#toString], [] )
184+ | SEDescr d -> (tags @ [d], [] ) in
185+ sideeffect_argument_location_table#add key
186+
187+ method get_sideeffect_argument_location (index : int ) =
188+ let name = " sideeffect_location" in
189+ let (tags, _) = sideeffect_argument_location_table#retrieve index in
190+ let t = t name tags in
191+ match (t 0 ) with
192+ | "d" -> SEDescr (t 1 )
193+ | "g" ->
194+ TR. tfold
195+ ~ok: (fun dw -> SEGlobal dw)
196+ ~error: (fun e ->
197+ begin
198+ log_error_result
199+ ~msg: " get_sideeffect_location"
200+ ~tag: " vardictionary error"
201+ __FILE__ __LINE__ e;
202+ raise
203+ (BCH_failure
204+ (LBLOCK [STR " Vardictionary: get_sideeffect_location: " ;
205+ STR (String. concat " ; " e)]))
206+ end )
207+ (BCHDoubleword. string_to_doubleword (t 1 ))
208+ | "s" -> SEStack (CHNumerical. mkNumericalFromString (t 1 ))
209+ | s -> raise_tag_error name s sideeffect_argument_location_mcts#tags
210+
175211 method index_assembly_variable_denotation (v :assembly_variable_denotation_t ) =
176212 let tags = [ assembly_variable_denotation_mcts#ts v ] in
177213 let key = match v with
@@ -182,7 +218,7 @@ object (self)
182218 assembly_variable_denotation_table#add key
183219
184220 method get_assembly_variable_denotation (index :int ) =
185- let name = " assembly_variable_denotation" in
221+ let name = " assembly_variable_denotation" in
186222 let (tags,args) = assembly_variable_denotation_table#retrieve index in
187223 let t = t name tags in
188224 let a = a name args in
@@ -207,8 +243,9 @@ object (self)
207243 | FunctionPointer (s1 , s2 , a ) ->
208244 (tags @ [a], [bd#index_string s1; bd#index_string s2])
209245 | CallTargetValue t -> (tags, [id#index_call_target t])
210- | SideEffectValue (a , name , isglobal ) ->
211- (tags @ [a ], [bd#index_string name; (if isglobal then 1 else 0 )])
246+ | SideEffectValue (a , name , seloc ) ->
247+ (tags @ [a],
248+ [bd#index_string name; self#index_sideeffect_argument_location seloc])
212249 | BridgeVariable (a ,i ) -> (tags @ [a], [i])
213250 | FieldValue (sname ,offset ,fname ) ->
214251 (tags, [bd#index_string sname; offset; bd#index_string fname])
@@ -233,7 +270,9 @@ object (self)
233270 | "ev" -> SyscallErrorReturnValue (t 1 )
234271 | "fp" -> FunctionPointer (bd#get_string (a 0 ), bd#get_string (a 1 ), t 1 )
235272 | "ct" -> CallTargetValue (id#get_call_target (a 0 ))
236- | "se" -> SideEffectValue (t 1 , bd#get_string (a 0 ), (a 1 ) = 1 )
273+ | "se" ->
274+ SideEffectValue
275+ (t 1 , bd#get_string (a 0 ), self#get_sideeffect_argument_location (a 1 ))
237276 | "bv" -> BridgeVariable (t 1 , a 0 )
238277 | "fv" -> FieldValue (bd#get_string (a 0 ), a 1 , bd#get_string (a 2 ))
239278 | "sv" -> SymbolicValue (xd#get_xpr (a 0 ))
0 commit comments