[llvm-dev] 32-bit pointers, ARM and BPF

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 12 01:40:25 PDT 2017


I think your clang command line should have “-target bpf”. It needs to know
you’re targeting bpf instructions not ARM instructions.

On Thu, Oct 12, 2017 at 12:35 AM Adrian Szyndela via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi,
>
> We're trying to use BPF on a 32-bit ARM. However, we have issues with
> llvm.bpf.pseudo.
>
> Let's consider a simple program (t.c):
>
>    #include <uapi/linux/bpf.h>
>
>    typedef unsigned long long u64;
>
>    u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo");
>
>    static void *(*bpf_map_lookup_elem)(void *map, void *key) =
>      (void *) BPF_FUNC_map_lookup_elem;
>
>    int test_ok(void *ctx) {
>                           // 0s below are for example
>      void *v = bpf_map_lookup_elem(bpf_pseudo_fd(0,0), 0);
>      return 0;
>    }
>
> We put it into
> clang -O2 -target armv7l-unknown-linux-gnueabi -emit-llvm -S t.c
>
> to get
>
>    define i32 @test_ok(i8* nocapture readnone) local_unnamed_addr #0 {
>      %2 = tail call i64 @llvm.bpf.pseudo(i64 0, i64 0)
>      %3 = trunc i64 %2 to i32
>      %4 = inttoptr i32 %3 to i8*
>      %5 = tail call i8* inttoptr (i32 1 to i8* (i8*, i8*)*)(i8* %4, i8*
> null) #1
>      ret i32 0
>    }
>
> Note the 'trunc' instruction, which is there, because return type of
> llvm.bpf.pseudo is i64, and it is converted to 32-bit pointer.
>
> Now, after
> llc -march=bpf t.ll
>
> we get
>    test_ok:                                # @test_ok
>         ld_pseudo       r1, 0, 0
>         r1 <<= 32
>         r1 >>= 32
>         r2 = 0
>         call 1
>         r0 = 0
>         exit
>
> The return value of llvm.bpf.pseudo (u64) is truncated by shift-left +
> shift-right. After the operation BPF verifier does not consider the
> value in r1 as pointer anymore, and complains when it is passed as a
> pointer to bpf_map_lookup_elem (call 1).
>
> We have changed the return type of llvm.bpf.pseudo to pointer for our
> purposes (see below), but what is the "correct" way of handling it?
>
> include/llvm/IR/IntrinsicsBPF.td:
>       def int_bpf_pseudo : GCCBuiltin<"__builtin_bpf_pseudo">,
>    -              Intrinsic<[llvm_i64_ty], [llvm_i64_ty, llvm_i64_ty]>;
>    +              Intrinsic<[llvm_ptr_ty], [llvm_i64_ty, llvm_i64_ty]>;
>
> Thanks,
> Adrian
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-- 
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171012/b2480143/attachment.html>


More information about the llvm-dev mailing list