[IR] Adding support for variable attributes, adding __block for ObjC variables

Reviewed By: sblackshear

Differential Revision: D6424743

fbshipit-source-id: 409359a
master
Dulma Churchill 7 years ago committed by Facebook Github Bot
parent 9e2ecac204
commit 71fde88950

@ -36,6 +36,12 @@ type objc_accessor_type =
| Objc_setter of Typ.Struct.field | Objc_setter of Typ.Struct.field
[@@deriving compare] [@@deriving compare]
type var_attribute = Modify_in_block [@@deriving compare]
let var_attribute_equal = [%compare.equal : var_attribute]
type var_data = {name: Mangled.t; typ: Typ.t; attributes: var_attribute list} [@@deriving compare]
type t = type t =
{ access: PredSymb.access (** visibility access *) { access: PredSymb.access (** visibility access *)
; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *) ; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *)
@ -59,8 +65,8 @@ type t =
; is_synthetic_method: bool (** the procedure is a synthetic method *) ; is_synthetic_method: bool (** the procedure is a synthetic method *)
; loc: Location.t (** location of this procedure in the source code *) ; loc: Location.t (** location of this procedure in the source code *)
; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *) ; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *)
; mutable locals: (Mangled.t * Typ.t) list (** name and type of local variables *) ; mutable locals: var_data list (** name, type and attributes of local variables *)
; method_annotation: Annot.Method.t (** annotations for java methods *) ; method_annotation: Annot.Method.t (** annotations for all methods *)
; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *) ; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *)
; proc_flags: proc_flags (** flags of the procedure *) ; proc_flags: proc_flags (** flags of the procedure *)
; proc_name: Typ.Procname.t (** name of the procedure *) ; proc_name: Typ.Procname.t (** name of the procedure *)

@ -33,6 +33,16 @@ type objc_accessor_type =
| Objc_setter of Typ.Struct.field | Objc_setter of Typ.Struct.field
[@@deriving compare] [@@deriving compare]
type var_attribute =
| Modify_in_block
(* __block attribute of Objective-C variables, means that it will be modified inside a block *)
[@@deriving compare]
val var_attribute_equal : var_attribute -> var_attribute -> bool
(** Equality for var_attribute *)
type var_data = {name: Mangled.t; typ: Typ.t; attributes: var_attribute list} [@@deriving compare]
type t = type t =
{ access: PredSymb.access (** visibility access *) { access: PredSymb.access (** visibility access *)
; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *) ; captured: (Mangled.t * Typ.t) list (** name and type of variables captured in blocks *)
@ -56,8 +66,8 @@ type t =
; is_synthetic_method: bool (** the procedure is a synthetic method *) ; is_synthetic_method: bool (** the procedure is a synthetic method *)
; loc: Location.t (** location of this procedure in the source code *) ; loc: Location.t (** location of this procedure in the source code *)
; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *) ; translation_unit: SourceFile.t option (** translation unit to which the procedure belongs *)
; mutable locals: (Mangled.t * Typ.t) list (** name and type of local variables *) ; mutable locals: var_data list (** name, type and attributes of local variables *)
; method_annotation: Annot.Method.t (** annotations for java methods *) ; method_annotation: Annot.Method.t (** annotations for all methods *)
; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *) ; objc_accessor: objc_accessor_type option (** type of ObjC accessor, if any *)
; proc_flags: proc_flags (** flags of the procedure *) ; proc_flags: proc_flags (** flags of the procedure *)
; proc_name: Typ.Procname.t (** name of the procedure *) ; proc_name: Typ.Procname.t (** name of the procedure *)

@ -191,7 +191,9 @@ module Node = struct
let ret_type = proc_attributes.ret_type in let ret_type = proc_attributes.ret_type in
(Pvar.get_ret_pvar pname, ret_type) (Pvar.get_ret_pvar pname, ret_type)
in in
let construct_decl (x, typ) = (Pvar.mk x pname, typ) in let construct_decl (var_data: ProcAttributes.var_data) =
(Pvar.mk var_data.name pname, var_data.typ)
in
let ptl = ret_var :: List.map ~f:construct_decl locals in let ptl = ret_var :: List.map ~f:construct_decl locals in
let instr = Sil.Declare_locals (ptl, loc) in let instr = Sil.Declare_locals (ptl, loc) in
prepend_instrs node [instr] prepend_instrs node [instr]
@ -504,6 +506,22 @@ let is_loop_head pdesc (node: Node.t) =
NodeSet.mem node lh NodeSet.mem node lh
let pp_var_attributes fmt attrs =
let pp_attribute fmt attr =
match attr with ProcAttributes.Modify_in_block -> Format.fprintf fmt "__block"
in
if List.is_empty attrs then () else F.fprintf fmt "(%a)" (Pp.seq ~sep:"," pp_attribute) attrs
let pp_local fmt (var_data: ProcAttributes.var_data) =
Format.fprintf fmt " %a:%a%a" Mangled.pp var_data.name (Typ.pp_full Pp.text) var_data.typ
pp_var_attributes var_data.attributes
let pp_locals_list fmt etl =
if List.is_empty etl then Format.fprintf fmt "None" else List.iter ~f:(pp_local fmt) etl
let pp_variable_list fmt etl = let pp_variable_list fmt etl =
if List.is_empty etl then Format.fprintf fmt "None" if List.is_empty etl then Format.fprintf fmt "None"
else else
@ -531,7 +549,7 @@ let pp_signature fmt pdesc =
defined_string defined_string
(Typ.to_string (get_ret_type pdesc)) (Typ.to_string (get_ret_type pdesc))
pp_objc_accessor attributes.ProcAttributes.objc_accessor pp_variable_list (get_formals pdesc) pp_objc_accessor attributes.ProcAttributes.objc_accessor pp_variable_list (get_formals pdesc)
pp_variable_list (get_locals pdesc) ; pp_locals_list (get_locals pdesc) ;
if not (List.is_empty (get_captured pdesc)) then if not (List.is_empty (get_captured pdesc)) then
Format.fprintf fmt ", Captured: %a" pp_variable_list (get_captured pdesc) ; Format.fprintf fmt ", Captured: %a" pp_variable_list (get_captured pdesc) ;
let method_annotation = attributes.ProcAttributes.method_annotation in let method_annotation = attributes.ProcAttributes.method_annotation in
@ -549,12 +567,15 @@ let is_specialized pdesc =
let is_captured_var procdesc pvar = let is_captured_var procdesc pvar =
let procname = get_proc_name procdesc in let procname = get_proc_name procdesc in
let pvar_name = Pvar.get_name pvar in let pvar_name = Pvar.get_name pvar in
let pvar_local_matches (var_data: ProcAttributes.var_data) =
Mangled.equal var_data.name pvar_name
in
let pvar_matches (name, _) = Mangled.equal name pvar_name in let pvar_matches (name, _) = Mangled.equal name pvar_name in
let is_captured_var_cpp_lambda = let is_captured_var_cpp_lambda =
(* var is captured if the procedure is a lambda and the var is not in the locals or formals *) (* var is captured if the procedure is a lambda and the var is not in the locals or formals *)
Typ.Procname.is_cpp_lambda procname Typ.Procname.is_cpp_lambda procname
&& not && not
( List.exists ~f:pvar_matches (get_locals procdesc) ( List.exists ~f:pvar_local_matches (get_locals procdesc)
|| List.exists ~f:pvar_matches (get_formals procdesc) ) || List.exists ~f:pvar_matches (get_formals procdesc) )
in in
let is_captured_var_objc_block = let is_captured_var_objc_block =
@ -562,3 +583,14 @@ let is_captured_var procdesc pvar =
Typ.Procname.is_objc_block procname && List.exists ~f:pvar_matches (get_captured procdesc) Typ.Procname.is_objc_block procname && List.exists ~f:pvar_matches (get_captured procdesc)
in in
is_captured_var_cpp_lambda || is_captured_var_objc_block is_captured_var_cpp_lambda || is_captured_var_objc_block
let has_modify_in_block_attr procdesc pvar =
let pvar_name = Pvar.get_name pvar in
let pvar_local_matches (var_data: ProcAttributes.var_data) =
Mangled.equal var_data.name pvar_name
&& List.exists var_data.attributes ~f:(fun attr ->
ProcAttributes.var_attribute_equal attr ProcAttributes.Modify_in_block )
in
List.exists ~f:pvar_local_matches (get_locals procdesc)

@ -41,7 +41,7 @@ module Node : sig
val throw_kind : nodekind val throw_kind : nodekind
(** kind of Stmt_node for a throw instruction. *) (** kind of Stmt_node for a throw instruction. *)
val add_locals_ret_declaration : t -> ProcAttributes.t -> (Mangled.t * Typ.t) list -> unit val add_locals_ret_declaration : t -> ProcAttributes.t -> ProcAttributes.var_data list -> unit
(** Add declarations for local variables and return variable to the node *) (** Add declarations for local variables and return variable to the node *)
val append_instrs : t -> Sil.instr list -> unit val append_instrs : t -> Sil.instr list -> unit
@ -136,7 +136,7 @@ module NodeSet : Caml.Set.S with type elt = Node.t
(** proc description *) (** proc description *)
type t [@@deriving compare] type t [@@deriving compare]
val append_locals : t -> (Mangled.t * Typ.t) list -> unit val append_locals : t -> ProcAttributes.var_data list -> unit
(** append a list of new local variables to the existing list of local variables *) (** append a list of new local variables to the existing list of local variables *)
val compute_distance_to_exit_node : t -> unit val compute_distance_to_exit_node : t -> unit
@ -183,8 +183,8 @@ val get_formals : t -> (Mangled.t * Typ.t) list
val get_loc : t -> Location.t val get_loc : t -> Location.t
(** Return loc information for the procedure *) (** Return loc information for the procedure *)
val get_locals : t -> (Mangled.t * Typ.t) list val get_locals : t -> ProcAttributes.var_data list
(** Return name and type of local variables *) (** Return name and type and attributes of local variables *)
val get_nodes : t -> Node.t list val get_nodes : t -> Node.t list
@ -248,8 +248,12 @@ val is_loop_head : t -> Node.t -> bool
val pp_signature : Format.formatter -> t -> unit val pp_signature : Format.formatter -> t -> unit
val pp_local : Format.formatter -> ProcAttributes.var_data -> unit
val is_specialized : t -> bool val is_specialized : t -> bool
(* true if pvar is a captred variable of a cpp lambda or obcj block *) (* true if pvar is a captred variable of a cpp lambda or obcj block *)
val is_captured_var : t -> Pvar.t -> bool val is_captured_var : t -> Pvar.t -> bool
val has_modify_in_block_attr : t -> Pvar.t -> bool

@ -8,7 +8,9 @@
*) *)
open! IStd open! IStd
let get_name_of_local (curr_f: Procdesc.t) (x, _) = Pvar.mk x (Procdesc.get_proc_name curr_f) let get_name_of_local (curr_f: Procdesc.t) (var_data: ProcAttributes.var_data) =
Pvar.mk var_data.name (Procdesc.get_proc_name curr_f)
(* returns a list of local static variables (ie local variables defined static) in a proposition *) (* returns a list of local static variables (ie local variables defined static) in a proposition *)
let get_name_of_objc_static_locals (curr_f: Procdesc.t) p = let get_name_of_objc_static_locals (curr_f: Procdesc.t) p =

@ -1152,12 +1152,14 @@ let pp_etlist byvals fmt etl =
etl etl
let pp_local_list fmt etl = let pp_var_list fmt etl =
List.iter List.iter
~f:(fun (id, ty) -> Format.fprintf fmt " %a:%a" Mangled.pp id (Typ.pp_full Pp.text) ty) ~f:(fun (id, ty) -> Format.fprintf fmt " %a:%a" Mangled.pp id (Typ.pp_full Pp.text) ty)
etl etl
let pp_local_list fmt etl = List.iter ~f:(Procdesc.pp_local fmt) etl
let pp_cfgnodelabel pdesc fmt (n: Procdesc.Node.t) = let pp_cfgnodelabel pdesc fmt (n: Procdesc.Node.t) =
let pp_label fmt n = let pp_label fmt n =
match Procdesc.Node.get_kind n with match Procdesc.Node.get_kind n with
@ -1168,7 +1170,7 @@ let pp_cfgnodelabel pdesc fmt (n: Procdesc.Node.t) =
Format.fprintf fmt "Start %s\\nFormals: %a\\nLocals: %a" pname_string (pp_etlist byvals) Format.fprintf fmt "Start %s\\nFormals: %a\\nLocals: %a" pname_string (pp_etlist byvals)
(Procdesc.get_formals pdesc) pp_local_list (Procdesc.get_locals pdesc) ; (Procdesc.get_formals pdesc) pp_local_list (Procdesc.get_locals pdesc) ;
if List.length (Procdesc.get_captured pdesc) <> 0 then if List.length (Procdesc.get_captured pdesc) <> 0 then
Format.fprintf fmt "\\nCaptured: %a" pp_local_list (Procdesc.get_captured pdesc) ; Format.fprintf fmt "\\nCaptured: %a" pp_var_list (Procdesc.get_captured pdesc) ;
let method_annotation = attributes.ProcAttributes.method_annotation in let method_annotation = attributes.ProcAttributes.method_annotation in
if not (Annot.Method.is_empty method_annotation) then if not (Annot.Method.is_empty method_annotation) then
Format.fprintf fmt "\\nAnnotation: %a" (Annot.Method.pp pname_string) method_annotation Format.fprintf fmt "\\nAnnotation: %a" (Annot.Method.pp pname_string) method_annotation

@ -207,10 +207,10 @@ module Analyzer =
let get_locals cfg tenv pdesc = let get_locals cfg tenv pdesc =
List.fold List.fold
~f:(fun acc (name, t) -> ~f:(fun acc (var_data: ProcAttributes.var_data) ->
let pvar = Pvar.mk name (Procdesc.get_proc_name pdesc) in let pvar = Pvar.mk var_data.name (Procdesc.get_proc_name pdesc) in
let base_ap = ((Var.of_pvar pvar, t), []) in let base_ap = ((Var.of_pvar pvar, var_data.typ), []) in
match t.Typ.desc with match var_data.typ.Typ.desc with
| Typ.Tstruct qual_name -> ( | Typ.Tstruct qual_name -> (
match Tenv.lookup tenv qual_name with match Tenv.lookup tenv qual_name with
| Some {fields} -> | Some {fields} ->

@ -210,7 +210,8 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
let context = trans_state.context in let context = trans_state.context in
let procdesc = context.CContext.procdesc in let procdesc = context.CContext.procdesc in
let pvar, typ = mk_temp_sil_var_for_expr context.CContext.tenv procdesc var_name expr_info in let pvar, typ = mk_temp_sil_var_for_expr context.CContext.tenv procdesc var_name expr_info in
Procdesc.append_locals procdesc [(Pvar.get_name pvar, typ)] ; let var_data : ProcAttributes.var_data = {name= Pvar.get_name pvar; typ; attributes= []} in
Procdesc.append_locals procdesc [var_data] ;
(Exp.Lvar pvar, typ) (Exp.Lvar pvar, typ)
@ -231,7 +232,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
| _ -> | _ ->
let procdesc = trans_state.context.CContext.procdesc in let procdesc = trans_state.context.CContext.procdesc in
let pvar = mk_temp_sil_var procdesc "__temp_return_" in let pvar = mk_temp_sil_var procdesc "__temp_return_" in
Procdesc.append_locals procdesc [(Pvar.get_name pvar, return_type)] ; let var_data : ProcAttributes.var_data =
{name= Pvar.get_name pvar; typ= return_type; attributes= []}
in
Procdesc.append_locals procdesc [var_data] ;
Exp.Lvar pvar Exp.Lvar pvar
in in
(* It is very confusing - same expression has two different types in two contexts:*) (* It is very confusing - same expression has two different types in two contexts:*)
@ -1083,7 +1087,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
let procdesc = trans_state.context.CContext.procdesc in let procdesc = trans_state.context.CContext.procdesc in
let pvar = Pvar.mk_tmp "__temp_construct_" (Procdesc.get_proc_name procdesc) in let pvar = Pvar.mk_tmp "__temp_construct_" (Procdesc.get_proc_name procdesc) in
let class_type = CType_decl.get_type_from_expr_info ei context.CContext.tenv in let class_type = CType_decl.get_type_from_expr_info ei context.CContext.tenv in
Procdesc.append_locals procdesc [(Pvar.get_name pvar, class_type)] ; let var_data : ProcAttributes.var_data =
{name= Pvar.get_name pvar; typ= class_type; attributes= []}
in
Procdesc.append_locals procdesc [var_data] ;
(Exp.Lvar pvar, class_type) (Exp.Lvar pvar, class_type)
in in
let this_type = CType.add_pointer_to_typ class_type in let this_type = CType.add_pointer_to_typ class_type in
@ -1461,7 +1468,10 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
let join_node = create_node Procdesc.Node.Join_node [] sil_loc context in let join_node = create_node Procdesc.Node.Join_node [] sil_loc context in
Procdesc.node_set_succs_exn context.procdesc join_node succ_nodes [] ; Procdesc.node_set_succs_exn context.procdesc join_node succ_nodes [] ;
let pvar = mk_temp_sil_var procdesc "SIL_temp_conditional___" in let pvar = mk_temp_sil_var procdesc "SIL_temp_conditional___" in
Procdesc.append_locals procdesc [(Pvar.get_name pvar, var_typ)] ; let var_data : ProcAttributes.var_data =
{name= Pvar.get_name pvar; typ= var_typ; attributes= []}
in
Procdesc.append_locals procdesc [var_data] ;
let continuation' = mk_cond_continuation trans_state.continuation in let continuation' = mk_cond_continuation trans_state.continuation in
let trans_state' = {trans_state with continuation= continuation'; succ_nodes= []} in let trans_state' = {trans_state with continuation= continuation'; succ_nodes= []} in
let res_trans_cond = let res_trans_cond =
@ -2781,7 +2791,8 @@ module CTrans_funct (F : CModule_type.CFrontend) : CModule_type.CTranslation = s
let var_exp_typ = (Exp.Lvar pvar, typ_tmp) in let var_exp_typ = (Exp.Lvar pvar, typ_tmp) in
let res_trans = init_expr_trans trans_state var_exp_typ stmt_info (Some temp_exp) in let res_trans = init_expr_trans trans_state var_exp_typ stmt_info (Some temp_exp) in
let _, typ = extract_exp_from_list res_trans.exps "MaterializeExpr initializer missing@\n" in let _, typ = extract_exp_from_list res_trans.exps "MaterializeExpr initializer missing@\n" in
Procdesc.append_locals procdesc [(Pvar.get_name pvar, typ)] ; let var_data : ProcAttributes.var_data = {name= Pvar.get_name pvar; typ; attributes= []} in
Procdesc.append_locals procdesc [var_data] ;
res_trans res_trans

@ -59,12 +59,23 @@ let sil_var_of_decl_ref context decl_ref procname =
decl_ref decl_ref
let add_var_to_locals procdesc var_decl sil_typ pvar = let get_var_attribute decl_info =
let open Clang_ast_t in
let has_block_attribute =
List.exists decl_info.Clang_ast_t.di_attributes ~f:(fun attr ->
match attr with BlocksAttr _ -> true | _ -> false )
in
if has_block_attribute then [ProcAttributes.Modify_in_block] else []
let add_var_to_locals procdesc var_decl typ pvar =
let open Clang_ast_t in let open Clang_ast_t in
match var_decl with match var_decl with
| VarDecl (_, _, _, vdi) -> | VarDecl (decl_info, _, _, vdi) ->
if not vdi.Clang_ast_t.vdi_is_global then if not vdi.Clang_ast_t.vdi_is_global then
Procdesc.append_locals procdesc [(Pvar.get_name pvar, sil_typ)] let attributes = get_var_attribute decl_info in
let var_data : ProcAttributes.var_data = {name= Pvar.get_name pvar; typ; attributes} in
Procdesc.append_locals procdesc [var_data]
| _ -> | _ ->
assert false assert false

@ -925,9 +925,9 @@ let analyze_procedure {Callbacks.proc_desc; get_proc_desc; tenv; summary} =
then ThreadsDomain.AnyThread then ThreadsDomain.AnyThread
else ThreadsDomain.NoThread else ThreadsDomain.NoThread
in in
let add_owned_local acc (name, typ) = let add_owned_local acc (var_data: ProcAttributes.var_data) =
let pvar = Pvar.mk name (Procdesc.get_proc_name proc_desc) in let pvar = Pvar.mk var_data.name (Procdesc.get_proc_name proc_desc) in
let base = AccessPath.base_of_pvar pvar typ in let base = AccessPath.base_of_pvar pvar var_data.typ in
OwnershipDomain.add (base, []) OwnershipAbstractValue.owned acc OwnershipDomain.add (base, []) OwnershipAbstractValue.owned acc
in in
(* Add ownership to local variables. In cpp, stack-allocated local (* Add ownership to local variables. In cpp, stack-allocated local

@ -358,7 +358,11 @@ let create_cm_procdesc source_file program linereader icfg cm proc_name skip_imp
let bytecode, jbir_code = get_implementation cm in let bytecode, jbir_code = get_implementation cm in
let procdesc = let procdesc =
let formals = translate_formals program tenv cn jbir_code in let formals = translate_formals program tenv cn jbir_code in
let locals = translate_locals program tenv formals bytecode jbir_code in let locals_ = translate_locals program tenv formals bytecode jbir_code in
let locals =
List.map locals_ ~f:(fun (name, typ) ->
({name; typ; attributes= []} : ProcAttributes.var_data) )
in
let loc_start = let loc_start =
let loc = get_location source_file jbir_code 0 in let loc = get_location source_file jbir_code 0 in
fix_method_definition_line linereader proc_name loc fix_method_definition_line linereader proc_name loc

@ -33,6 +33,15 @@
return sharedInstance; return sharedInstance;
} }
+ (int)block_attribute {
static dispatch_once_t once;
__block DispatchA* a = [DispatchA new];
dispatch_once(&once, ^{
a->_x = 10;
});
return a->_x;
}
+ (instancetype)trans { + (instancetype)trans {
static id sharedInstance; static id sharedInstance;
void (^dummy_block)() = ^{ void (^dummy_block)() = ^{

@ -26,120 +26,139 @@ digraph iCFG {
"objc_blockDispatchA_sharedInstance_1.0b8803e75b6a82e1a4530bcb953490e2_3" -> "objc_blockDispatchA_sharedInstance_1.0b8803e75b6a82e1a4530bcb953490e2_2" ; "objc_blockDispatchA_sharedInstance_1.0b8803e75b6a82e1a4530bcb953490e2_3" -> "objc_blockDispatchA_sharedInstance_1.0b8803e75b6a82e1a4530bcb953490e2_2" ;
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" [label="1: Start DispatchA_trans\nFormals: \nLocals: dummy_block:_fn_(*) \n DECLARE_LOCALS(&return,&dummy_block); [line 36, column 1]\n " color=yellow style=filled] "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_1" [label="1: Start DispatchA_block_attribute\nFormals: \nLocals: a:DispatchA*(__block) \n DECLARE_LOCALS(&return,&a); [line 36, column 1]\n " color=yellow style=filled]
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_1" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_5" ;
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_2" [label="2: Exit DispatchA_block_attribute \n " color=yellow style=filled]
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_3" [label="3: Return Stmt \n n$4=*&a:DispatchA* [line 42, column 10]\n n$5=*n$4._x:int [line 42, column 10]\n *&return:int=n$5 [line 42, column 3]\n " shape="box"]
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_3" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_2" ;
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_4" [label="4: Call _fun__dispatch_once \n n$6=*&a:DispatchA* [line 39, column 24]\n _fun__dispatch_once(&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_block_attribute_once:long*,(_fun_objc_blockDispatchA_block_attribute_2,n$6):_fn_(*)) block_params [line 39, column 3]\n " shape="box"]
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_4" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_3" ;
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_5" [label="5: DeclStmt \n n$8=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 38, column 26]\n n$9=_fun_NSObject_init(n$8:DispatchA*) virtual [line 38, column 26]\n *&a:DispatchA*=n$9 [line 38, column 3]\n " shape="box"]
"block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_5" -> "block_attribute#DispatchA#class.df997e345dbf19ec3438c667c942e14a_4" ;
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" [label="1: Start DispatchA_trans\nFormals: \nLocals: dummy_block:_fn_(*) \n DECLARE_LOCALS(&return,&dummy_block); [line 45, column 1]\n " color=yellow style=filled]
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" ; "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_1" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" ;
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_2" [label="2: Exit DispatchA_trans \n " color=yellow style=filled] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_2" [label="2: Exit DispatchA_trans \n " color=yellow style=filled]
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" [label="3: Return Stmt \n n$4=*&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_trans_sharedInstance:objc_object* [line 42, column 10]\n *&return:objc_object*=n$4 [line 42, column 3]\n " shape="box"] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" [label="3: Return Stmt \n n$10=*&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_trans_sharedInstance:objc_object* [line 51, column 10]\n *&return:objc_object*=n$10 [line 51, column 3]\n " shape="box"]
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_2" ; "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_2" ;
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" [label="4: Call n$5 \n n$5=*&dummy_block:_fn_(*) [line 41, column 3]\n n$5() [line 41, column 3]\n " shape="box"] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" [label="4: Call n$11 \n n$11=*&dummy_block:_fn_(*) [line 50, column 3]\n n$11() [line 50, column 3]\n " shape="box"]
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" ; "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_3" ;
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" [label="5: DeclStmt \n *&dummy_block:_fn_(*)=(_fun_objc_blockDispatchA_trans_2) [line 38, column 3]\n " shape="box"] "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" [label="5: DeclStmt \n *&dummy_block:_fn_(*)=(_fun_objc_blockDispatchA_trans_3) [line 47, column 3]\n " shape="box"]
"trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" ; "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_5" -> "trans#DispatchA#class.23f9d908a87deca79c235bc76ca6e941_4" ;
"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_1" [label="1: Start objc_blockDispatchA_trans_2\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 38, column 27]\n " color=yellow style=filled] "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_1" [label="1: Start objc_blockDispatchA_trans_3\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 47, column 27]\n " color=yellow style=filled]
"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_1" -> "objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_3" ; "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_1" -> "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_3" ;
"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_2" [label="2: Exit objc_blockDispatchA_trans_2 \n " color=yellow style=filled] "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_2" [label="2: Exit objc_blockDispatchA_trans_3 \n " color=yellow style=filled]
"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_3" [label="3: BinaryOperatorStmt: Assign \n n$6=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 39, column 23]\n n$7=_fun_DispatchA_init(n$6:DispatchA*) virtual [line 39, column 22]\n *&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_trans_sharedInstance:objc_object*=n$7 [line 39, column 5]\n " shape="box"] "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_3" [label="3: BinaryOperatorStmt: Assign \n n$12=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 48, column 23]\n n$13=_fun_DispatchA_init(n$12:DispatchA*) virtual [line 48, column 22]\n *&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_trans_sharedInstance:objc_object*=n$13 [line 48, column 5]\n " shape="box"]
"objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_3" -> "objc_blockDispatchA_trans_2.3e9844ebda3bff9e63047261f5667152_2" ; "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_3" -> "objc_blockDispatchA_trans_3.80c09fe69dc0d5591de63a0c525de29b_2" ;
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" [label="1: Start DispatchA_dispatch_a_block_variable\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 45, column 1]\n " color=yellow style=filled] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" [label="1: Start DispatchA_dispatch_a_block_variable\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 54, column 1]\n " color=yellow style=filled]
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" ; "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_1" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" ;
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_2" [label="2: Exit DispatchA_dispatch_a_block_variable \n " color=yellow style=filled] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_2" [label="2: Exit DispatchA_dispatch_a_block_variable \n " color=yellow style=filled]
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" [label="3: Return Stmt \n n$8=*&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_static_storage__:objc_object* [line 52, column 10]\n *&return:objc_object*=n$8 [line 52, column 3]\n " shape="box"] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" [label="3: Return Stmt \n n$14=*&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_static_storage__:objc_object* [line 61, column 10]\n *&return:objc_object*=n$14 [line 61, column 3]\n " shape="box"]
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_2" ; "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_2" ;
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" [label="4: Call _fun__dispatch_once \n n$9=*&initialization_block__:_fn_(*) [line 51, column 32]\n _fun__dispatch_once(&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_once_token__:long*,n$9:_fn_(*)) [line 51, column 3]\n " shape="box"] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" [label="4: Call _fun__dispatch_once \n n$15=*&initialization_block__:_fn_(*) [line 60, column 32]\n _fun__dispatch_once(&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_once_token__:long*,n$15:_fn_(*)) [line 60, column 3]\n " shape="box"]
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" ; "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_3" ;
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_3) [line 47, column 3]\n " shape="box"] "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_4) [line 56, column 3]\n " shape="box"]
"dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" ; "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_5" -> "dispatch_a_block_variable#DispatchA#class.3cc12dd22127281b8293b7c046d21bb2_4" ;
"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_3\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 47, column 38]\n " color=yellow style=filled] "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_4\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 56, column 38]\n " color=yellow style=filled]
"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_1" -> "objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_3" ; "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_1" -> "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_3" ;
"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_3 \n " color=yellow style=filled] "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_4 \n " color=yellow style=filled]
"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_3" [label="3: BinaryOperatorStmt: Assign \n n$10=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 48, column 25]\n n$11=_fun_DispatchA_init(n$10:DispatchA*) virtual [line 48, column 25]\n *&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_static_storage__:objc_object*=n$11 [line 48, column 5]\n " shape="box"] "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_3" [label="3: BinaryOperatorStmt: Assign \n n$16=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 57, column 25]\n n$17=_fun_DispatchA_init(n$16:DispatchA*) virtual [line 57, column 25]\n *&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_static_storage__:objc_object*=n$17 [line 57, column 5]\n " shape="box"]
"objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_3" -> "objc_blockDispatchA_dispatch_a_block_variable_3.09c6b14692ef67057c46de6cee569440_2" ; "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_3" -> "objc_blockDispatchA_dispatch_a_block_variable_4.2eedc45fca2c35e6e8c11937ba7a2df8_2" ;
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 55, column 1]\n " color=yellow style=filled] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro\nFormals: \nLocals: initialization_block__:_fn_(*) \n DECLARE_LOCALS(&return,&initialization_block__); [line 64, column 1]\n " color=yellow style=filled]
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" ; "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_1" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" ;
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_2" [label="2: Exit DispatchA_dispatch_a_block_variable_from_macro \n " color=yellow style=filled] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_2" [label="2: Exit DispatchA_dispatch_a_block_variable_from_macro \n " color=yellow style=filled]
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" [label="3: Fallback node \n n$12=*&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object* [line 63, column 5]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" [label="3: Fallback node \n n$18=*&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object* [line 72, column 5]\n " shape="box"]
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" ; "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" ;
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" [label="4: Call _fun__dispatch_once \n n$13=*&initialization_block__:_fn_(*) [line 62, column 34]\n _fun__dispatch_once(&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_from_macro_once_token__:long*,n$13:_fn_(*)) [line 62, column 5]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" [label="4: Call _fun__dispatch_once \n n$19=*&initialization_block__:_fn_(*) [line 71, column 34]\n _fun__dispatch_once(&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_from_macro_once_token__:long*,n$19:_fn_(*)) [line 71, column 5]\n " shape="box"]
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" ; "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_3" ;
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_from_macro_4) [line 58, column 5]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" [label="5: DeclStmt \n *&initialization_block__:_fn_(*)=(_fun_objc_blockDispatchA_dispatch_a_block_variable_from_macro_5) [line 67, column 5]\n " shape="box"]
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" ; "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_5" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_4" ;
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" [label="6: Return Stmt \n *&return:objc_object*=n$12 [line 56, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" [label="6: Return Stmt \n *&return:objc_object*=n$18 [line 65, column 3]\n " shape="box"]
"dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_2" ; "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_6" -> "dispatch_a_block_variable_from_macro#DispatchA#class.92567a38d5ab3cf637f72030b1097441_2" ;
"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_from_macro_4\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 58, column 40]\n " color=yellow style=filled] "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_1" [label="1: Start objc_blockDispatchA_dispatch_a_block_variable_from_macro_5\nFormals: \nLocals: \n DECLARE_LOCALS(&return); [line 67, column 40]\n " color=yellow style=filled]
"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_1" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_3" ; "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_1" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_3" ;
"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_from_macro_4 \n " color=yellow style=filled] "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_2" [label="2: Exit objc_blockDispatchA_dispatch_a_block_variable_from_macro_5 \n " color=yellow style=filled]
"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_3" [label="3: BinaryOperatorStmt: Assign \n n$14=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 59, column 27]\n n$15=_fun_DispatchA_init(n$14:DispatchA*) virtual [line 59, column 27]\n *&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object*=n$15 [line 59, column 7]\n " shape="box"] "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_3" [label="3: BinaryOperatorStmt: Assign \n n$20=_fun___objc_alloc_no_fail(sizeof(t=DispatchA):unsigned long) [line 68, column 27]\n n$21=_fun_DispatchA_init(n$20:DispatchA*) virtual [line 68, column 27]\n *&#GB<codetoanalyze/objc/shared/block/dispatch.m>$DispatchA_dispatch_a_block_variable_from_macro_static_storage__:objc_object*=n$21 [line 68, column 7]\n " shape="box"]
"objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_3" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_4.cdb7f792f8c2689b337db5fca633647f_2" ; "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_3" -> "objc_blockDispatchA_dispatch_a_block_variable_from_macro_5.e4f37df69df9d95138cb008e85eedab8_2" ;
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object\nFormals: \nLocals: a:DispatchA* \n DECLARE_LOCALS(&return,&a); [line 67, column 1]\n " color=yellow style=filled] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" [label="1: Start DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object\nFormals: \nLocals: a:DispatchA* \n DECLARE_LOCALS(&return,&a); [line 76, column 1]\n " color=yellow style=filled]
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" ; "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_1" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" ;
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_2" [label="2: Exit DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object \n " color=yellow style=filled] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_2" [label="2: Exit DispatchA_dispatch_a_block_variable_from_macro_delivers_initialised_object \n " color=yellow style=filled]
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" [label="3: Return Stmt \n n$16=*&a:DispatchA* [line 70, column 15]\n n$17=*n$16._x:int [line 70, column 15]\n *&return:int=(1 / (n$17 - 5)) [line 70, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" [label="3: Return Stmt \n n$22=*&a:DispatchA* [line 79, column 15]\n n$23=*n$22._x:int [line 79, column 15]\n *&return:int=(1 / (n$23 - 5)) [line 79, column 3]\n " shape="box"]
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_2" ; "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_2" ;
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" [label="4: BinaryOperatorStmt: Assign \n n$18=*&a:DispatchA* [line 69, column 3]\n *n$18._x:int=5 [line 69, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" [label="4: BinaryOperatorStmt: Assign \n n$24=*&a:DispatchA* [line 78, column 3]\n *n$24._x:int=5 [line 78, column 3]\n " shape="box"]
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" ; "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_3" ;
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" [label="5: DeclStmt \n n$19=_fun_DispatchA_dispatch_a_block_variable_from_macro() [line 68, column 18]\n *&a:DispatchA*=n$19 [line 68, column 3]\n " shape="box"] "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" [label="5: DeclStmt \n n$25=_fun_DispatchA_dispatch_a_block_variable_from_macro() [line 77, column 18]\n *&a:DispatchA*=n$25 [line 77, column 3]\n " shape="box"]
"dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" ; "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_5" -> "dispatch_a_block_variable_from_macro_delivers_initialised_object#DispatchA#class.a58ef5afb5e1e9480b49788e2400c52c_4" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" [label="1: Start DispatchMain\nFormals: \nLocals: p:int* b:DispatchA* \n DECLARE_LOCALS(&return,&p,&b); [line 75, column 1]\n " color=yellow style=filled] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" [label="1: Start DispatchMain\nFormals: \nLocals: p:int* b:DispatchA* \n DECLARE_LOCALS(&return,&p,&b); [line 84, column 1]\n " color=yellow style=filled]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_1" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" ;
@ -154,32 +173,32 @@ digraph iCFG {
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_4" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_4" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" [label="5: BinaryOperatorStmt: EQ \n n$0=*&b:DispatchA* [line 78, column 7]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" [label="5: BinaryOperatorStmt: EQ \n n$0=*&b:DispatchA* [line 87, column 7]\n " shape="box"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" [label="6: Prune (true branch) \n PRUNE((n$0 == null), true); [line 78, column 7]\n " shape="invhouse"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" [label="6: Prune (true branch) \n PRUNE((n$0 == null), true); [line 87, column 7]\n " shape="invhouse"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_6" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" [label="7: Prune (false branch) \n PRUNE(!(n$0 == null), false); [line 78, column 7]\n " shape="invhouse"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" [label="7: Prune (false branch) \n PRUNE(!(n$0 == null), false); [line 87, column 7]\n " shape="invhouse"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_7" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" [label="8: Return Stmt \n n$1=*&p:int* [line 79, column 13]\n n$2=*n$1:int [line 79, column 12]\n *&return:int=n$2 [line 79, column 5]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" [label="8: Return Stmt \n n$1=*&p:int* [line 88, column 13]\n n$2=*n$1:int [line 88, column 12]\n *&return:int=n$2 [line 88, column 5]\n " shape="box"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_8" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" [label="9: Return Stmt \n *&return:int=0 [line 81, column 5]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" [label="9: Return Stmt \n *&return:int=0 [line 90, column 5]\n " shape="box"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_9" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_2" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" [label="10: DeclStmt \n *&p:int*=null [line 77, column 3]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" [label="10: DeclStmt \n *&p:int*=null [line 86, column 3]\n " shape="box"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_5" ;
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" [label="11: DeclStmt \n n$3=_fun_DispatchA_sharedInstance() [line 76, column 18]\n *&b:DispatchA*=n$3 [line 76, column 3]\n " shape="box"] "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" [label="11: DeclStmt \n n$3=_fun_DispatchA_sharedInstance() [line 85, column 18]\n *&b:DispatchA*=n$3 [line 85, column 3]\n " shape="box"]
"DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" ; "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_11" -> "DispatchMain.f6461dbdaeaf9a114cbe40f5f72fbb3f_10" ;
@ -194,4 +213,15 @@ digraph iCFG {
"init#DispatchA#instance.ff6c7b9a5a49bb46493519a4290a6582_3" -> "init#DispatchA#instance.ff6c7b9a5a49bb46493519a4290a6582_2" ; "init#DispatchA#instance.ff6c7b9a5a49bb46493519a4290a6582_3" -> "init#DispatchA#instance.ff6c7b9a5a49bb46493519a4290a6582_2" ;
"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_1" [label="1: Start objc_blockDispatchA_block_attribute_2\nFormals: a:DispatchA*\nLocals: \nCaptured: a:DispatchA* \n DECLARE_LOCALS(&return); [line 39, column 24]\n " color=yellow style=filled]
"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_1" -> "objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_3" ;
"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_2" [label="2: Exit objc_blockDispatchA_block_attribute_2 \n " color=yellow style=filled]
"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_3" [label="3: BinaryOperatorStmt: Assign \n n$7=*&a:DispatchA* [line 40, column 5]\n *n$7._x:int=10 [line 40, column 5]\n " shape="box"]
"objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_3" -> "objc_blockDispatchA_block_attribute_2.871f06a0b12b5767153a5d30f3798261_2" ;
} }

Loading…
Cancel
Save