On Wed, 9 Sep 2020, Jaskaran Singh wrote:

> 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.

So you really parse the whole file here?  Could you avoid that?  Is it
that you need to parse something to find the end of it?

julia

>
> 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

Reply via email to