[PATCH] D111199: [POC][BTF] support btf_type_tag attribute

Yonghong Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 5 17:29:30 PDT 2021


yonghong-song created this revision.
yonghong-song added a reviewer: aaron.ballman.
Herald added subscribers: dexonsmith, hiraditya.
yonghong-song requested review of this revision.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

Commit [1] introduced btf_tag attribute which
is used for declarations. Later we tried to compile
linux kernel by simply replacing __user definition
from attribute address_space to attribute btf_tag,
we hit two major issues:

  (1). btf_tag won't support type conversion, and 
  (2). btf_tag is not supported for typedef.

Commit [2] changed btf_tag attribute to be a
decl or type, i.e., can be applied to either declaration
or type, but actually does not do anything meaningful
for those type conversions. But typedef is still not 
resolved.

Patch [3] intended to address typedef issue. But through
discussion making btf_tag for both declaration and type
is not desirable. For example, making attributes in

  typedef int __user *__intp;
  int foo(int __user *arg, ...)

applying to declaration (__intp or arg) is not really
desirable. Further, we have code in kernel like:

  static int do_execve(struct filename *filename,
          const char __user *const __user *__argv,
          const char __user *const __user *__envp)

If __user is applied to declaration, we will lose
information that second-level dereference is also
user memory.

So it looks like it is good idea to introduce
a new type attribute. This patch introduced
btf_type_tag applying to type only. In the current
implementation, I only focus on pointers which is what
kernel is needed. Please see an dwarf generation example
in the patch.

If this approach is desirable, we can do the following:

  step 1: revert commit [2].
  step 2: I would like to rename current btf_tag
     to be btf_decl_tag to make it clear it is for 
     declaration.
  step 3: Introduce btf_type_tag as a type attribute.

This patch contains a hack in AttributedType to store
the btf_type_tag string. It is certainly not an acceptable
way. It would be great if I can get some advice on
where to store btf_type_tag string in AST.

  [1] https://reviews.llvm.org/D106614
  [2] https://reviews.llvm.org/D110116
  [3] https://reviews.llvm.org/D110127


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111199

Files:
  clang/include/clang/AST/ASTContext.h
  clang/include/clang/AST/Type.h
  clang/include/clang/Basic/Attr.td
  clang/lib/AST/ASTContext.cpp
  clang/lib/AST/TypePrinter.cpp
  clang/lib/CodeGen/CGDebugInfo.cpp
  clang/lib/Sema/SemaType.cpp
  clang/test/CodeGen/attr-btf_type_tag-conv-var.c
  clang/test/CodeGen/attr-btf_type_tag-typedef-field.c
  clang/test/Sema/attr-btf_type_tag.c
  llvm/include/llvm/IR/DIBuilder.h
  llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
  llvm/lib/IR/DIBuilder.cpp
  llvm/test/DebugInfo/attr-btf_type_tag.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111199.377397.patch
Type: text/x-patch
Size: 19673 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211006/b10134b5/attachment-0001.bin>


More information about the llvm-commits mailing list