[Linux-kernel-mentees] [RFC PATCH 11/25] parsing_c: parser: cpp_other end attributes production
Jaskaran Singh
jaskaransingh7654321 at gmail.com
Fri Apr 24 09:17:47 UTC 2020
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 <jaskaransingh7654321 at 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
More information about the Linux-kernel-mentees
mailing list