diff --git a/src/util/cilfacade.ml b/src/util/cilfacade.ml index be478622cc..5387c11b57 100644 --- a/src/util/cilfacade.ml +++ b/src/util/cilfacade.ml @@ -445,6 +445,8 @@ let varinfo_roles: varinfo_role VarinfoH.t ResettableLazy.t = VarinfoH.replace h fd.svar Function; (* function itself can be used as a variable (function pointer) *) List.iter (fun vi -> VarinfoH.replace h vi (Formal fd)) fd.sformals; List.iter (fun vi -> VarinfoH.replace h vi (Local fd)) fd.slocals + | GVarDecl (vi, _) when Cil.isFunctionType vi.vtype -> + VarinfoH.replace h vi Function | GVar (vi, _, _) | GVarDecl (vi, _) -> VarinfoH.replace h vi Global diff --git a/src/util/server.ml b/src/util/server.ml index 7a9c793e33..3c99d44cb7 100644 --- a/src/util/server.ml +++ b/src/util/server.ml @@ -389,6 +389,45 @@ let () = | None -> Response.Error.(raise (make ~code:RequestFailed ~message:"not analyzed" ())) end); + register (module struct + let name = "cil/varinfos" + type params = unit [@@deriving of_yojson] + type varinfo_data = { + vid: int; + name: string; + original_name: string option; + role: string; + function_: CilType.Fundec.t option [@key "function"] [@default None]; + } [@@deriving to_yojson] + type response = varinfo_data list [@@deriving to_yojson] + let process () serv = + Cilfacade.VarinfoH.fold (fun vi role acc -> + let role_str = match role with + | Cilfacade.Formal _ -> "formal" + | Local _ -> "local" + | Function -> "function" + | Global -> "global" + in + let function_ = match role with + | Cilfacade.Formal fd + | Local fd -> + Some fd + | Function + | Global -> + None + in + let data = { + vid = vi.vid; + name = vi.vname; + original_name = Cilfacade.find_original_name vi; + role = role_str; + function_; + } + in + data :: acc + ) (ResettableLazy.force Cilfacade.varinfo_roles) [] + end); + register (module struct let name = "cfg" type params = { fname: string } [@@deriving of_yojson]