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

Reply via email to