Add a production for a macro call in the cpp_other rule of Coccinelle's C parser. This parses the following C code from Linux v5.6-rc7 successfully:
arch/x86/kernel/irq_64.c: DEFINE_PER_CPU_PAGE_ALIGNED(struct irq_stack, irq_stack_backing_store) __visible; Signed-off-by: Jaskaran Singh <jaskaransingh7654...@gmail.com> --- parsing_c/parser_c.mly | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly index eb22cbcf..da6b9c7b 100644 --- a/parsing_c/parser_c.mly +++ b/parsing_c/parser_c.mly @@ -2262,6 +2262,37 @@ cpp_other: (* old: MacroTop (fst $1, $3, [snd $1;$2;$4;$5]) *) } + | identifier TOPar argument_list TCPar end_attributes TPtVirg + { + if args_are_params $3 + then + (* if all args are params, assume it is a prototype of a function + with no return type *) + let parameters = args_to_params $3 None in + let paramlist = (parameters, (false, [])) in (* no varargs *) + let id = RegularName (mk_string_wrap $1) in + let ret = + warning "type defaults to 'int'" + (mk_ty defaultInt [fakeInfo fake_pi]) in + let ty = + fixOldCDecl (mk_ty (FunctionType (ret, paramlist)) [$2;$4]) in + let attrs = Ast_c.noattr in + let sto = (NoSto, false), [] in + let iistart = Ast_c.fakeInfo () in + Declaration( + DeclList ([{v_namei = Some (id,NoInit); v_type = ty; + v_storage = unwrap sto; v_local = NotLocalDecl; + v_attr = attrs; v_endattr = $5; + v_type_bis = ref None; + },[]], + ($6::iistart::snd sto))) + else + Declaration + (MacroDecl((NoSto, fst $1, $3, true), [snd $1;$2;$4;$6;fakeInfo()])) + (* old: MacroTop (fst $1, $3, [snd $1;$2;$4;$5]) *) + } + + /* cheap solution for functions with no return type. Not really a cpp_other, but avoids conflicts */ | identifier TOPar argument_list TCPar compound { -- 2.21.1 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci