yonghong-song created this revision. yonghong-song added a reviewer: aaron.ballman. Herald added a subscriber: jdoerfert. yonghong-song requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Previously, btf_tag attribute supports record, field, global variable, function and function parameter ([1]). This patch added support for typedef. There are two reasons for this addition. First, to build linux kernel with btf_tag annotated user pointer, we have #define __user __attribute__((btf_tag("user"))) and the linux kernel contains code like below ([2]) typedef __signalfn_t __user *__sighandler_t; and the __user attribute applies to typedef type __sighandler_t. So clang needs to support btf_tag attribute with typedef type to avoid compilation error. Second, for typedef of an anonymous struct/union, we can only apply btf_tag attribute to the anonymous struct/union like below: typedef struct { ... } __btf_tag target_type In this case, the __btf_tag attribute applies to anonymous struct, which increases downstream implementation complexity. But if typedef with btf_tag attribute is supported, we can have typedef struct { ... } target_type __btf_tag which applies __btf_tag to typedef "target_type" which make it easier to directly associate btf_tag with a named type. This patch permitted btf_tag with typedef types due to the above two reasons. [1] https://reviews.llvm.org/D106614 [2] https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/signal-defs.h#L82 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D110127 Files: clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/test/Misc/pragma-attribute-supported-attributes-list.test clang/test/Sema/attr-btf_tag.c Index: clang/test/Sema/attr-btf_tag.c =================================================================== --- clang/test/Sema/attr-btf_tag.c +++ clang/test/Sema/attr-btf_tag.c @@ -25,18 +25,28 @@ enum e1 { E1 -} __tag1; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, and non-static data members}} +} __tag1; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, non-static data members, and typedefs}} enum e2 { E2 -} __tag_no_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, and non-static data members}} +} __tag_no_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, non-static data members, and typedefs}} enum e3 { E3 -} __tag_2_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, and non-static data members}} +} __tag_2_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, non-static data members, and typedefs}} int __tag1 __tag2 foo(struct t1 *arg, struct t2 *arg2); int __tag2 __tag3 foo(struct t1 *arg, struct t2 *arg2); int __tag1 foo(struct t1 *arg __tag1, struct t2 *arg2) { return arg->a + arg2->a; } + +typedef unsigned __tag1 * __u1; +__u1 convert1(long arg) { + return (__u1)arg; +} + +typedef struct { int a; int b; } __u2 __tag1; +__u2 * convert2(long arg) { + return (__u2 *)arg; +} Index: clang/test/Misc/pragma-attribute-supported-attributes-list.test =================================================================== --- clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -22,7 +22,7 @@ // CHECK-NEXT: Assumption (SubjectMatchRule_function, SubjectMatchRule_objc_method) // CHECK-NEXT: Availability ((SubjectMatchRule_record, SubjectMatchRule_enum, SubjectMatchRule_enum_constant, SubjectMatchRule_field, SubjectMatchRule_function, SubjectMatchRule_namespace, SubjectMatchRule_objc_category, SubjectMatchRule_objc_implementation, SubjectMatchRule_objc_interface, SubjectMatchRule_objc_method, SubjectMatchRule_objc_property, SubjectMatchRule_objc_protocol, SubjectMatchRule_record, SubjectMatchRule_type_alias, SubjectMatchRule_variable)) // CHECK-NEXT: BPFPreserveAccessIndex (SubjectMatchRule_record) -// CHECK-NEXT: BTFTag (SubjectMatchRule_variable, SubjectMatchRule_function, SubjectMatchRule_record, SubjectMatchRule_field) +// CHECK-NEXT: BTFTag (SubjectMatchRule_variable, SubjectMatchRule_function, SubjectMatchRule_record, SubjectMatchRule_field, SubjectMatchRule_type_alias) // CHECK-NEXT: BuiltinAlias (SubjectMatchRule_function) // CHECK-NEXT: CFAuditedTransfer (SubjectMatchRule_function) // CHECK-NEXT: CFConsumed (SubjectMatchRule_variable_is_parameter) Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -2016,9 +2016,10 @@ let Content = [{ Clang supports the ``__attribute__((btf_tag("ARGUMENT")))`` attribute for all targets. This attribute may be attached to a struct/union, struct/union field, -function, function parameter or variable declaration. If -g is specified, -the ``ARGUMENT`` info will be preserved in IR and be emitted to dwarf. -For BPF targets, the ``ARGUMENT`` info will be emitted to .BTF ELF section too. +function, function parameter, variable or typedef declaration. If -g is +specified, the ``ARGUMENT`` info will be preserved in IR and be emitted to +dwarf. For BPF targets, the ``ARGUMENT`` info will be emitted to .BTF ELF +section too. }]; } Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -1838,7 +1838,8 @@ def BTFTag : InheritableAttr { let Spellings = [Clang<"btf_tag">]; let Args = [StringArgument<"BTFTag">]; - let Subjects = SubjectList<[Var, Function, Record, Field], ErrorDiag>; + let Subjects = SubjectList<[Var, Function, Record, Field, TypedefName], + ErrorDiag>; let Documentation = [BTFTagDocs]; let LangOpts = [COnly]; }
Index: clang/test/Sema/attr-btf_tag.c =================================================================== --- clang/test/Sema/attr-btf_tag.c +++ clang/test/Sema/attr-btf_tag.c @@ -25,18 +25,28 @@ enum e1 { E1 -} __tag1; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, and non-static data members}} +} __tag1; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, non-static data members, and typedefs}} enum e2 { E2 -} __tag_no_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, and non-static data members}} +} __tag_no_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, non-static data members, and typedefs}} enum e3 { E3 -} __tag_2_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, and non-static data members}} +} __tag_2_arg; // expected-error {{'btf_tag' attribute only applies to variables, functions, structs, unions, classes, non-static data members, and typedefs}} int __tag1 __tag2 foo(struct t1 *arg, struct t2 *arg2); int __tag2 __tag3 foo(struct t1 *arg, struct t2 *arg2); int __tag1 foo(struct t1 *arg __tag1, struct t2 *arg2) { return arg->a + arg2->a; } + +typedef unsigned __tag1 * __u1; +__u1 convert1(long arg) { + return (__u1)arg; +} + +typedef struct { int a; int b; } __u2 __tag1; +__u2 * convert2(long arg) { + return (__u2 *)arg; +} Index: clang/test/Misc/pragma-attribute-supported-attributes-list.test =================================================================== --- clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -22,7 +22,7 @@ // CHECK-NEXT: Assumption (SubjectMatchRule_function, SubjectMatchRule_objc_method) // CHECK-NEXT: Availability ((SubjectMatchRule_record, SubjectMatchRule_enum, SubjectMatchRule_enum_constant, SubjectMatchRule_field, SubjectMatchRule_function, SubjectMatchRule_namespace, SubjectMatchRule_objc_category, SubjectMatchRule_objc_implementation, SubjectMatchRule_objc_interface, SubjectMatchRule_objc_method, SubjectMatchRule_objc_property, SubjectMatchRule_objc_protocol, SubjectMatchRule_record, SubjectMatchRule_type_alias, SubjectMatchRule_variable)) // CHECK-NEXT: BPFPreserveAccessIndex (SubjectMatchRule_record) -// CHECK-NEXT: BTFTag (SubjectMatchRule_variable, SubjectMatchRule_function, SubjectMatchRule_record, SubjectMatchRule_field) +// CHECK-NEXT: BTFTag (SubjectMatchRule_variable, SubjectMatchRule_function, SubjectMatchRule_record, SubjectMatchRule_field, SubjectMatchRule_type_alias) // CHECK-NEXT: BuiltinAlias (SubjectMatchRule_function) // CHECK-NEXT: CFAuditedTransfer (SubjectMatchRule_function) // CHECK-NEXT: CFConsumed (SubjectMatchRule_variable_is_parameter) Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -2016,9 +2016,10 @@ let Content = [{ Clang supports the ``__attribute__((btf_tag("ARGUMENT")))`` attribute for all targets. This attribute may be attached to a struct/union, struct/union field, -function, function parameter or variable declaration. If -g is specified, -the ``ARGUMENT`` info will be preserved in IR and be emitted to dwarf. -For BPF targets, the ``ARGUMENT`` info will be emitted to .BTF ELF section too. +function, function parameter, variable or typedef declaration. If -g is +specified, the ``ARGUMENT`` info will be preserved in IR and be emitted to +dwarf. For BPF targets, the ``ARGUMENT`` info will be emitted to .BTF ELF +section too. }]; } Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -1838,7 +1838,8 @@ def BTFTag : InheritableAttr { let Spellings = [Clang<"btf_tag">]; let Args = [StringArgument<"BTFTag">]; - let Subjects = SubjectList<[Var, Function, Record, Field], ErrorDiag>; + let Subjects = SubjectList<[Var, Function, Record, Field, TypedefName], + ErrorDiag>; let Documentation = [BTFTagDocs]; let LangOpts = [COnly]; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits