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
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to