[Linux-kernel-mentees] [PATCH v4 10/14] parsing_c: parser: Handle struct/union/enum end attributes
Jaskaran Singh
jaskaransingh7654321 at gmail.com
Fri Jun 5 13:43:18 UTC 2020
As per GCC's C grammar, the struct-or-union-specifier and enum-specifier
have the following productions:
struct-or-union-specifier:
struct-or-union attribute-specifier-sequence[opt] gnu-attributes[opt]
identifier[opt] { struct-contents } gnu-attributes[opt]
enum-specifier:
enum gnu-attributes[opt] identifier[opt] { enumerator-list }
gnu-attributes[opt]
enum gnu-attributes[opt] identifier[opt] { enumerator-list , }
gnu-attributes[opt]
Add a production to the decl2 rule of Coccinelle's C parser to handle
the end attributes here (i.e. gnu-attributes after the } ). This parses
the following C code from Linux v5.6-rc7:
drivers/net/wireless/broadcom/b43legacy/b43legacy.h
struct b43legacy_iv {
__be16 offset_size;
union {
__be16 d16;
__be32 d32;
} data __packed;
} __packed;
drivers/scsi/myrs.h:
enum myrs_cmd_opcode {
MYRS_CMD_OP_MEMCOPY = 0x01,
MYRS_CMD_OP_SCSI_10_PASSTHRU = 0x02,
MYRS_CMD_OP_SCSI_255_PASSTHRU = 0x03,
MYRS_CMD_OP_SCSI_10 = 0x04,
MYRS_CMD_OP_SCSI_256 = 0x05,
MYRS_CMD_OP_IOCTL = 0x20,
} __packed;
Signed-off-by: Jaskaran Singh <jaskaransingh7654321 at gmail.com>
---
parsing_c/parser_c.mly | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly
index 5b7e1faf..3412c34e 100644
--- a/parsing_c/parser_c.mly
+++ b/parsing_c/parser_c.mly
@@ -1542,16 +1542,16 @@ abstract_declaratort:
/*(*************************************************************************)*/
decl2:
- | decl_spec TPtVirg
+ | decl_spec end_attributes_opt TPtVirg
{ function local ->
let (returnType,storage) = fixDeclSpecForDecl (snd $1) in
let iistart = Ast_c.fakeInfo () in
DeclList ([{v_namei = None; v_type = returnType;
v_storage = unwrap storage; v_local = local;
- v_attr = fst $1; v_endattr = Ast_c.noattr;
+ v_attr = fst $1; v_endattr = $2;
v_type_bis = ref None;
},[]],
- ($2::iistart::snd storage))
+ ($3::iistart::snd storage))
}
| decl_spec init_declarator_list TPtVirg
{ function local ->
--
2.21.1
More information about the Linux-kernel-mentees
mailing list