Build the includes dependency graph and name cache while parsing header files. Every header file is parsed only once for name caching and, while parsing these files, an includes dependency graph is built to determine reachability of one header file from another file.
Signed-off-by: Jaskaran Singh <jaskaran.si...@collabora.com> --- parsing_c/parse_c.ml | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/parsing_c/parse_c.ml b/parsing_c/parse_c.ml index 5574cb11b..3b250720f 100644 --- a/parsing_c/parse_c.ml +++ b/parsing_c/parse_c.ml @@ -17,6 +17,7 @@ open Common module TH = Token_helpers module LP = Lexer_parser +module IC = Includes_cache module Stat = Parsing_stat @@ -995,15 +996,29 @@ let rec _parse_print_error_heuristic2 saved_typedefs saved_macros and handle_include file wrapped_incl k = let incl = Ast_c.unwrap wrapped_incl.Ast_c.i_include in let parsing_style = Includes.get_parsing_style () in + let f = Includes.resolve file parsing_style incl in if Includes.should_parse parsing_style file incl then - match Includes.resolve file parsing_style incl with + match f with | Some header_filename when Common.lfile_exists header_filename -> - (if !Flag_parsing_c.verbose_includes - then pr2 ("including "^header_filename)); - let nonlocal = - match incl with Ast_c.NonLocal _ -> true | _ -> false in - ignore (k nonlocal header_filename) + if not (IC.has_been_parsed header_filename) + then begin + IC.add_to_parsed_files header_filename; + (if !Flag_parsing_c.verbose_includes + then pr2 ("including "^header_filename)); + let nonlocal = + match incl with Ast_c.NonLocal _ -> true | _ -> false in + let res = k nonlocal header_filename in + match res with + None -> () + | Some x -> + let pt = x.parse_trees in + let (p, _, _) = pt in + with_program2_unit + (IC.extract_names header_filename) + p + end; + IC.add_to_dependency_graph file header_filename; | _ -> () and _parse_print_error_heuristic2bis saved_typedefs saved_macros -- 2.21.3 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci