162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/// Find missing clk_puts.
362306a36Sopenharmony_ci///
462306a36Sopenharmony_ci//# This only signals a missing clk_put when there is a clk_put later
562306a36Sopenharmony_ci//# in the same function.
662306a36Sopenharmony_ci//# False positives can be due to loops.
762306a36Sopenharmony_ci//
862306a36Sopenharmony_ci// Confidence: Moderate
962306a36Sopenharmony_ci// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
1062306a36Sopenharmony_ci// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
1162306a36Sopenharmony_ci// URL: https://coccinelle.gitlabpages.inria.fr/website
1262306a36Sopenharmony_ci// Comments:
1362306a36Sopenharmony_ci// Options:
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_civirtual context
1662306a36Sopenharmony_civirtual org
1762306a36Sopenharmony_civirtual report
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci@clk@
2062306a36Sopenharmony_ciexpression e;
2162306a36Sopenharmony_cistatement S,S1;
2262306a36Sopenharmony_ciint ret;
2362306a36Sopenharmony_ciposition p1,p2,p3;
2462306a36Sopenharmony_ci@@
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cie = clk_get@p1(...)
2762306a36Sopenharmony_ci... when != clk_put(e)
2862306a36Sopenharmony_ciif (<+...e...+>) S
2962306a36Sopenharmony_ci... when any
3062306a36Sopenharmony_ci    when != clk_put(e)
3162306a36Sopenharmony_ci    when != if (...) { ... clk_put(e); ... }
3262306a36Sopenharmony_ci(
3362306a36Sopenharmony_ci if (ret == 0) S1
3462306a36Sopenharmony_ci|
3562306a36Sopenharmony_ciif (...)
3662306a36Sopenharmony_ci   { ...
3762306a36Sopenharmony_ci     return 0; }
3862306a36Sopenharmony_ci|
3962306a36Sopenharmony_ciif (...)
4062306a36Sopenharmony_ci   { ...
4162306a36Sopenharmony_ci     return <+...e...+>; }
4262306a36Sopenharmony_ci|
4362306a36Sopenharmony_ci*if@p2 (...)
4462306a36Sopenharmony_ci   { ... when != clk_put(e)
4562306a36Sopenharmony_ci         when forall
4662306a36Sopenharmony_ci     return@p3 ...; }
4762306a36Sopenharmony_ci)
4862306a36Sopenharmony_ci... when any
4962306a36Sopenharmony_ciclk_put(e);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci@script:python depends on org@
5262306a36Sopenharmony_cip1 << clk.p1;
5362306a36Sopenharmony_cip2 << clk.p2;
5462306a36Sopenharmony_cip3 << clk.p3;
5562306a36Sopenharmony_ci@@
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cicocci.print_main("clk_get",p1)
5862306a36Sopenharmony_cicocci.print_secs("if",p2)
5962306a36Sopenharmony_cicocci.print_secs("needed clk_put",p3)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci@script:python depends on report@
6262306a36Sopenharmony_cip1 << clk.p1;
6362306a36Sopenharmony_cip2 << clk.p2;
6462306a36Sopenharmony_cip3 << clk.p3;
6562306a36Sopenharmony_ci@@
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cimsg = "ERROR: missing clk_put; clk_get on line %s and execution via conditional on line %s" % (p1[0].line,p2[0].line)
6862306a36Sopenharmony_cicoccilib.report.print_report(p3[0],msg)
69