[all-commits] [llvm/llvm-project] 6e6c1e: [BPF] Handle anon record for CO-RE relocations
yonghong-song via All-commits
all-commits at lists.llvm.org
Wed Jul 13 15:17:01 PDT 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 6e6c1efe04d45b717091e06eec94f0eef64839b1
https://github.com/llvm/llvm-project/commit/6e6c1efe04d45b717091e06eec94f0eef64839b1
Author: Yonghong Song <yhs at fb.com>
Date: 2022-07-13 (Wed, 13 Jul 2022)
Changed paths:
M llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
A llvm/test/CodeGen/BPF/CORE/anon-struct-argument-pragma.ll
A llvm/test/CodeGen/BPF/CORE/anon-union-localvar-attr.ll
A llvm/test/CodeGen/BPF/CORE/anon-union-localvar-pragma.ll
Log Message:
-----------
[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
More information about the All-commits
mailing list