aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/ExtractAPI/Serialization
diff options
context:
space:
mode:
authorYonghong Song <yhs@fb.com>2022-07-12 12:21:11 -0700
committerYonghong Song <yhs@fb.com>2022-07-13 15:16:16 -0700
commit6e6c1efe04d45b717091e06eec94f0eef64839b1 (patch)
tree5661abc50a03858a0d292c8ce4093e84793b16b5 /clang/lib/ExtractAPI/Serialization
parent21f72c05c4e4aa4827e23f943c5b419974448fcd (diff)
downloadllvm-6e6c1efe04d45b717091e06eec94f0eef64839b1.zip
llvm-6e6c1efe04d45b717091e06eec94f0eef64839b1.tar.gz
llvm-6e6c1efe04d45b717091e06eec94f0eef64839b1.tar.bz2
[BPF] Handle anon record for CO-RE relocations
When doing experiment in kernel, for kernel data structure sockptr_t in CO-RE operation, I hit an assertion error. The sockptr_t definition and usage look like below: #pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record) typedef struct { union { void *kernel; void *user; }; unsigned is_kernel : 1; } sockptr_t; #pragma clang attribute pop int test(sockptr_t *arg) { return arg->is_kernel; } The assertion error looks like clang: ../lib/Target/BPF/BPFAbstractMemberAccess.cpp:878: llvm::Value* {anonymous}::BPFAbstractMemberAccess::computeBaseAndAccessKey(llvm::CallInst*, {anonymous}::BPFAbstractMemberAccess::CallInfo&, std::__cxx11::string&, llvm::MDNode*&): Assertion `TypeName.size()' failed. In this particular, the clang frontend attach the debuginfo metadata associated with anon structure with the preserve_access_info IR intrinsic. But the first debuginfo type has to be a named type so libbpf can have a sound start to do CO-RE relocation. Besides the above approach using pragma to push attribute, the below typedef/struct definition can have preserve_access_index directly applying to the anon struct. typedef struct { union { void *kernel; void *user; }; unsigned is_kernel : 1; } __attribute__((preserve_access_index) sockptr_t; This patch fixed the issue by preprocessing function argument/return types and local variable types used by other CO-RE intrinsics. For any typedef struct/union { ... } typedef_name an association of <anon struct/union, typedef> is recorded to replace the IR intrinsic metadata 'anon struct/union' to 'typedef'. It is possible that two different 'typedef' types may have identical anon struct/union type. For such a case, the association will be <anon struct/union, nullptr> to indicate the invalid case. Differential Revision: https://reviews.llvm.org/D129621
Diffstat (limited to 'clang/lib/ExtractAPI/Serialization')
0 files changed, 0 insertions, 0 deletions