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