On Thu, 10 Sep 2020, Jaskaran Singh wrote:

> This patch series aims to optimize performance for recursively parsing
> header files in Coccinelle.
>
> Coccinelle's C parsing subsystem has an option called --recursive-includes
> to recursively parse header files. This is used for type
> inference/annotation.
>
> Previously, using --recursive-includes on the entire Linux kernel source
> code would take far too long. On my computer with the following specs,
>       - Processor: AMD Ryzen 5 3550H
>       - RAM: 8 GB
> it would take close to 7 hours to complete.  The optimization that this
> patch series implements reduces that time to 1 hour.
>
> The following is a high-level description of what has been implemented:
> - As header files are recursively parsed, they are scanned for the
>   following:
>       - fields of structs/unions/enums
>       - typedefs
>       - function prototypes
>       - global variables
>   The names of the above are stored in a "name cache", i.e. a hashtable to
>   map the name to the files it is declared in.
> - A dependency graph is built to determine dependencies between all the
>   files in the codebase.
> - In the type annotation phase of the C subsystem, if a function call,
>   struct/union field or identifier is encountered, the type of which is
>   not known to the annoter, the name cache is checked for the name.
> - The name cache gives a list of files that the name is declared/defined
>   in.  These files are cross checked with the dependency graph to
>   determine if any of these are reachable by the file that the annoter is
>   working on.
> - If a reachable header file is found, that file is parsed and the type
>   associated to the name is returned.
>
> Different approaches that were attempted to alleviate this issue, and the
> problems with each are as follows:
> - Caching the most recently used files: A LRU cache to store ASTs of the
>   most recently encountered header files. The problem with this approach
>   is the amount of memory it takes to cache the header file ASTs.
> - Caching the most troublesome files: A pseudo-LFU cache to store files
>   that cumulatively take the longest to parse, and thus bloat the time
>   taken. The problem with this approach is the amount of memory it takes
>   to cache the header file ASTs.
> - Skipping unparsable locations in header files: Skipping top-level items
>   in a header file that cannot be parsed. This approach does not produce
>   even close to the amount of optimization needed.
>
> The next step from here would be:
> - Maintain a small but persistent cache of header files in groups of
>   directories. Leverage multiprocessing for parsing these header files.
> - Leverage multiprocessing to parse header files initially for name
>   extraction.
> - Performing some initial matching with the semantic patch to determine if
>   a C file matches. If matches are found, call the annoter and recursively
>   parse header files for type annotation.
> - Recursively parse all header files only once and build a large type
>   environment. Use the dependency graph to determine reachability. This
>   has potential memory usage issues though.

Applied.


>
>
> Changes in v2:
> --------------
> - Change occurences of 'begin' and 'match' on the same line with something 
> else
>   to the next line for better readability.
>
>
>  Makefile                     |    2
>  parsing_c/includes_cache.ml  |  286 
> +++++++++++++++++++++++++++++++++++++++++++
>  parsing_c/includes_cache.mli |   47 +++++++
>  parsing_c/parse_c.ml         |   27 +++-
>  parsing_c/type_annoter_c.ml  |  130 ++++++++++++++++---
>  5 files changed, 466 insertions(+), 26 deletions(-)
>
>
>
_______________________________________________
Cocci mailing list
Cocci@systeme.lip6.fr
https://systeme.lip6.fr/mailman/listinfo/cocci

Reply via email to