@@ -533,21 +533,10 @@ struct
533533 {st with apr = apr_local}
534534
535535 let escape node ask getg sideg (st :apron_components_t ) escaped : apron_components_t =
536- let apr = st.apr in
537- let esc_vars = List. filter (fun var -> match AV. find_metadata var with
538- | Some (Global _ ) -> false
539- | Some Local ->
540- (let fundec = Node. find_fundec node in
541- let r = AV. to_cil_varinfo fundec var in
542- match r with
543- | Some r -> EscapeDomain.EscapedVars. mem r escaped
544- | _ -> false )
545- | _ -> false
546- ) (AD. vars apr) in
547- let apr_side = AD. keep_vars apr esc_vars in
548- sideg V. mutex_inits apr_side;
549- let apr_local = AD. remove_vars apr esc_vars in
550- { st with apr = apr_local }
536+ let esc_vars = EscapeDomain.EscapedVars. elements escaped in
537+ let esc_vars = List. filter (fun v -> not v.vglob && AD. varinfo_tracked v && AD. mem_var st.apr (AV. local v)) esc_vars in
538+ let escape_one (x :varinfo ) st = write_global ask getg sideg st x x in
539+ List. fold_left (fun st v -> escape_one v st) st esc_vars
551540
552541 let threadenter ask getg (st : apron_components_t ): apron_components_t =
553542 {apr = AD. bot () ; priv = startstate () }
@@ -1066,24 +1055,10 @@ struct
10661055 st
10671056
10681057 let escape node ask getg sideg (st : apron_components_t ) escaped : apron_components_t =
1069- let apr = st.apr in
1070- let esc_vars = List. filter (fun var -> match AV. find_metadata var with
1071- | Some (Global _ ) -> false
1072- | Some Local ->
1073- (let fundec = Node. find_fundec node in
1074- let r = AV. to_cil_varinfo fundec var in
1075- match r with
1076- | Some r -> EscapeDomain.EscapedVars. mem r escaped
1077- | _ -> false )
1078- | _ -> false
1079- ) (AD. vars apr) in
1080- let apr_side = AD. keep_vars apr esc_vars in
1081- let apr_side = Cluster. unlock (W. top () ) apr_side in (* top W to avoid any filtering *)
1082- let tid = ThreadId. get_current ask in
1083- let sidev = GMutex. singleton tid apr_side in
1084- sideg V. mutex_inits (G. create_mutex sidev);
1085- let apr_local = AD. remove_vars apr esc_vars in
1086- { st with apr = apr_local }
1058+ let esc_vars = EscapeDomain.EscapedVars. elements escaped in
1059+ let esc_vars = List. filter (fun v -> not v.vglob && AD. varinfo_tracked v && AD. mem_var st.apr (AV. local v)) esc_vars in
1060+ let escape_one (x :varinfo ) st = write_global ask getg sideg st x x in
1061+ List. fold_left (fun st v -> escape_one v st) st esc_vars
10871062
10881063 let enter_multithreaded (ask :Q.ask ) getg sideg (st : apron_components_t ): apron_components_t =
10891064 let apr = st.apr in
0 commit comments