[Linux-kernel-mentees] [RFC PATCH 08/25] parsing_c: parser: Add field declaration end attributes production

Jaskaran Singh jaskaransingh7654321 at gmail.com
Fri Apr 24 09:17:44 UTC 2020


As per GCC's C grammar, the struct-declarator rule has the following
productions:

	struct-declarator:
	  declarator gnu-attributes[opt]
	  declarator[opt] : constant-expression gnu-attributes[opt]

While these productions are handled in the struct_declarator rule of
Coccinelle's C grammar, end attributes are not.

Add productions for end attributes in the field_declaration rule of
Coccinelle's C parser. This parses the following C code from Linux
v5.6-rc7 successfully:

  kernel/sched/sched.h:

	struct task_group {
		...
		atomic_t load_avg __cacheline_aligned;
		...
	};

Signed-off-by: Jaskaran Singh <jaskaransingh7654321 at gmail.com>
---
 parsing_c/parser_c.mly | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly
index 1ff2fd87..8def5f0d 100644
--- a/parsing_c/parser_c.mly
+++ b/parsing_c/parser_c.mly
@@ -1847,6 +1847,22 @@ field_declaration:
           *)
      }
 
+ | spec_qualif_list struct_declarator_list end_attributes TPtVirg
+     {
+       let (attrs, ds) = $1 in
+       let (returnType,storage) = fixDeclSpecForDecl ds in
+       if fst (unwrap storage) <> NoSto
+       then internal_error "parsing don't allow this";
+
+       let iistart = Ast_c.fakeInfo () in (* for parallelism with DeclList *)
+       FieldDeclList ($2 +> (List.map (fun (f, iivirg) ->
+         f returnType, iivirg))
+                         ,[$4;iistart])
+         (* don't need to check if typedef or func initialised cos
+          * grammar don't allow typedef nor initialiser in struct
+          *)
+     }
+
  | spec_qualif_list TPtVirg
      {
        let (attrs, ds) = $1 in
@@ -1859,6 +1875,18 @@ field_declaration:
        FieldDeclList ([(Simple (None, returnType)) , []], [$2;iistart])
      }
 
+ | spec_qualif_list end_attributes TPtVirg
+     {
+       let (attrs, ds) = $1 in
+       (* gccext: allow empty elements if it is a structdef or enumdef *)
+       let (returnType,storage) = fixDeclSpecForDecl ds in
+       if fst (unwrap storage) <> NoSto
+       then internal_error "parsing don't allow this";
+
+       let iistart = Ast_c.fakeInfo () in (* for parallelism with DeclList *)
+       FieldDeclList ([(Simple (None, returnType)) , []], [$3;iistart])
+     }
+
 
 
 
-- 
2.21.1



More information about the Linux-kernel-mentees mailing list