diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -1835,7 +1835,7 @@ let LangOpts = [COnly]; } -def BTFTag : InheritableAttr { +def BTFTag : DeclOrTypeAttr { let Spellings = [Clang<"btf_tag">]; let Args = [StringArgument<"BTFTag">]; let Subjects = SubjectList<[Var, Function, Record, Field], ErrorDiag>; diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -2019,6 +2019,10 @@ 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. + +The attribute can also be used as a type qualifier. Right now it is accepted +and silently ignored in order to permit the linux kernel to build with the +attribute. }]; } diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -1704,6 +1704,7 @@ case attr::UPtr: case attr::AddressSpace: case attr::CmseNSCall: + case attr::BTFTag: llvm_unreachable("This attribute should have been handled already"); case attr::NSReturnsRetained: diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -8127,6 +8127,12 @@ case ParsedAttr::IgnoredAttribute: break; + case ParsedAttr::AT_BTFTag: + // FIXME: Linux kernel may also use this attribute for type casting check, + // which clang doesn's support for now. Let us ignore them so linux kernel + // build won't break. + attr.setUsedAsTypeAttr(); + break; case ParsedAttr::AT_MayAlias: // FIXME: This attribute needs to actually be handled, but if we ignore // it it breaks large amounts of Linux software. diff --git a/clang/test/Sema/attr-btf_tag.c b/clang/test/Sema/attr-btf_tag.c --- a/clang/test/Sema/attr-btf_tag.c +++ b/clang/test/Sema/attr-btf_tag.c @@ -40,3 +40,11 @@ int __tag1 foo(struct t1 *arg __tag1, struct t2 *arg2) { return arg->a + arg2->a; } + +void * convert(long arg) { + /* FIXME: the attribute __tag1 is accepted but didn't really do type conversion + * or enforce type checking. This is to permit linux kernel build with btf_tag + * attribute. + */ + return (void __tag1 *)arg; +}