yonghong-song added a comment.
Yes, in the above, all three of them will be relocatable.
-bash-4.4$ cat t2.c
#define __reloc__ __attribute__((preserve_access_index))
struct S1;
struct S2 {
struct S1 *f;
} __reloc__;
struct S1 {
int i;
} __reloc__;
// access s2->f
// access s2->f->i
int test(struct S2 *arg) {
return arg->f->i;
}
-bash-4.4$ clang -target bpf -S -O2 -emit-llvm -g t2.c
...
%0 = tail call %struct.S1**
@llvm.preserve.struct.access.index.p0p0s_struct.S1s.p0s_struct.S2s(%struct.S2*
%arg, i32 0, i32 0
), !dbg !22, !llvm.preserve.access.index !12
%1 = load %struct.S1*, %struct.S1** %0, align 8, !dbg !22, !tbaa !23
%2 = tail call i32*
@llvm.preserve.struct.access.index.p0i32.p0s_struct.S1s(%struct.S1* %1, i32 0,
i32 0), !dbg !28, !llvm.pr
eserve.access.index !16
In clang, BPF routines will see the record definition if it has the attribute.
So in the above, the actual definition of
struct S1 and S2 will be seen and marked with attributes properly.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D69759/new/
https://reviews.llvm.org/D69759
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits