1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun/// Detect BQ27XXX_DATA structures with identical registers, dm registers or 3*4882a593Smuzhiyun/// properties. 4*4882a593Smuzhiyun//# Doesn't unfold macros used in register or property fields. 5*4882a593Smuzhiyun//# Requires OCaml scripting 6*4882a593Smuzhiyun/// 7*4882a593Smuzhiyun// Confidence: High 8*4882a593Smuzhiyun// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, 9*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/ 10*4882a593Smuzhiyun// Requires: 1.0.7 11*4882a593Smuzhiyun// Keywords: BQ27XXX_DATA 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunvirtual report 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun@initialize:ocaml@ 16*4882a593Smuzhiyun@@ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunlet print_report p msg = 19*4882a593Smuzhiyun let p = List.hd p in 20*4882a593Smuzhiyun Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun@str depends on report@ 23*4882a593Smuzhiyuntype t; 24*4882a593Smuzhiyunidentifier i,i1,i2; 25*4882a593Smuzhiyunexpression e1,e2; 26*4882a593Smuzhiyun@@ 27*4882a593Smuzhiyun 28*4882a593Smuzhiyunt i[] = { 29*4882a593Smuzhiyun ..., 30*4882a593Smuzhiyun [e1] = BQ27XXX_DATA(i1,...), 31*4882a593Smuzhiyun ..., 32*4882a593Smuzhiyun [e2] = BQ27XXX_DATA(i2,...), 33*4882a593Smuzhiyun ..., 34*4882a593Smuzhiyun}; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun@script:ocaml tocheck@ 37*4882a593Smuzhiyuni1 << str.i1; 38*4882a593Smuzhiyuni2 << str.i2; 39*4882a593Smuzhiyuni1regs; i2regs; 40*4882a593Smuzhiyuni1dmregs; i2dmregs; 41*4882a593Smuzhiyuni1props; i2props; 42*4882a593Smuzhiyun@@ 43*4882a593Smuzhiyun 44*4882a593Smuzhiyunif not(i1 = i2) 45*4882a593Smuzhiyunthen 46*4882a593Smuzhiyun begin 47*4882a593Smuzhiyun i1regs := make_ident (i1 ^ "_regs"); 48*4882a593Smuzhiyun i2regs := make_ident (i2 ^ "_regs"); 49*4882a593Smuzhiyun i1dmregs := make_ident (i1 ^ "_dm_regs"); 50*4882a593Smuzhiyun i2dmregs := make_ident (i2 ^ "_dm_regs"); 51*4882a593Smuzhiyun i1props := make_ident (i1 ^ "_props"); 52*4882a593Smuzhiyun i2props := make_ident (i2 ^ "_props") 53*4882a593Smuzhiyun end 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun(* ---------------------------------------------------------------- *) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun@getregs1@ 58*4882a593Smuzhiyuntypedef u8; 59*4882a593Smuzhiyunidentifier tocheck.i1regs; 60*4882a593Smuzhiyuninitializer list i1regs_vals; 61*4882a593Smuzhiyunposition p1; 62*4882a593Smuzhiyun@@ 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunu8 i1regs@p1[...] = { i1regs_vals, }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun@getregs2@ 67*4882a593Smuzhiyunidentifier tocheck.i2regs; 68*4882a593Smuzhiyuninitializer list i2regs_vals; 69*4882a593Smuzhiyunposition p2; 70*4882a593Smuzhiyun@@ 71*4882a593Smuzhiyun 72*4882a593Smuzhiyunu8 i2regs@p2[...] = { i2regs_vals, }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun@script:ocaml@ 75*4882a593Smuzhiyun(_,i1regs_vals) << getregs1.i1regs_vals; 76*4882a593Smuzhiyun(_,i2regs_vals) << getregs2.i2regs_vals; 77*4882a593Smuzhiyuni1regs << tocheck.i1regs; 78*4882a593Smuzhiyuni2regs << tocheck.i2regs; 79*4882a593Smuzhiyunp1 << getregs1.p1; 80*4882a593Smuzhiyunp2 << getregs2.p2; 81*4882a593Smuzhiyun@@ 82*4882a593Smuzhiyun 83*4882a593Smuzhiyunif i1regs < i2regs && 84*4882a593Smuzhiyun List.sort compare i1regs_vals = List.sort compare i2regs_vals 85*4882a593Smuzhiyunthen 86*4882a593Smuzhiyun let msg = 87*4882a593Smuzhiyun Printf.sprintf 88*4882a593Smuzhiyun "WARNING %s and %s (line %d) are identical\n" 89*4882a593Smuzhiyun i1regs i2regs (List.hd p2).line in 90*4882a593Smuzhiyun print_report p1 msg 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun(* ---------------------------------------------------------------- *) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun@getdmregs1@ 95*4882a593Smuzhiyunidentifier tocheck.i1dmregs; 96*4882a593Smuzhiyuninitializer list i1dmregs_vals; 97*4882a593Smuzhiyunposition p1; 98*4882a593Smuzhiyun@@ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyunstruct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun@getdmregs2@ 103*4882a593Smuzhiyunidentifier tocheck.i2dmregs; 104*4882a593Smuzhiyuninitializer list i2dmregs_vals; 105*4882a593Smuzhiyunposition p2; 106*4882a593Smuzhiyun@@ 107*4882a593Smuzhiyun 108*4882a593Smuzhiyunstruct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun@script:ocaml@ 111*4882a593Smuzhiyun(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals; 112*4882a593Smuzhiyun(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals; 113*4882a593Smuzhiyuni1dmregs << tocheck.i1dmregs; 114*4882a593Smuzhiyuni2dmregs << tocheck.i2dmregs; 115*4882a593Smuzhiyunp1 << getdmregs1.p1; 116*4882a593Smuzhiyunp2 << getdmregs2.p2; 117*4882a593Smuzhiyun@@ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyunif i1dmregs < i2dmregs && 120*4882a593Smuzhiyun List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals 121*4882a593Smuzhiyunthen 122*4882a593Smuzhiyun let msg = 123*4882a593Smuzhiyun Printf.sprintf 124*4882a593Smuzhiyun "WARNING %s and %s (line %d) are identical\n" 125*4882a593Smuzhiyun i1dmregs i2dmregs (List.hd p2).line in 126*4882a593Smuzhiyun print_report p1 msg 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun(* ---------------------------------------------------------------- *) 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun@getprops1@ 131*4882a593Smuzhiyunidentifier tocheck.i1props; 132*4882a593Smuzhiyuninitializer list[n1] i1props_vals; 133*4882a593Smuzhiyunposition p1; 134*4882a593Smuzhiyun@@ 135*4882a593Smuzhiyun 136*4882a593Smuzhiyunenum power_supply_property i1props@p1[] = { i1props_vals, }; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun@getprops2@ 139*4882a593Smuzhiyunidentifier tocheck.i2props; 140*4882a593Smuzhiyuninitializer list[n2] i2props_vals; 141*4882a593Smuzhiyunposition p2; 142*4882a593Smuzhiyun@@ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyunenum power_supply_property i2props@p2[] = { i2props_vals, }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun@script:ocaml@ 147*4882a593Smuzhiyun(_,i1props_vals) << getprops1.i1props_vals; 148*4882a593Smuzhiyun(_,i2props_vals) << getprops2.i2props_vals; 149*4882a593Smuzhiyuni1props << tocheck.i1props; 150*4882a593Smuzhiyuni2props << tocheck.i2props; 151*4882a593Smuzhiyunp1 << getprops1.p1; 152*4882a593Smuzhiyunp2 << getprops2.p2; 153*4882a593Smuzhiyun@@ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyunif i1props < i2props && 156*4882a593Smuzhiyun List.sort compare i1props_vals = List.sort compare i2props_vals 157*4882a593Smuzhiyunthen 158*4882a593Smuzhiyun let msg = 159*4882a593Smuzhiyun Printf.sprintf 160*4882a593Smuzhiyun "WARNING %s and %s (line %d) are identical\n" 161*4882a593Smuzhiyun i1props i2props (List.hd p2).line in 162*4882a593Smuzhiyun print_report p1 msg 163