Alexei Starovoitov
2015-Aug-05 07:11 UTC
[llvm-dev] [LLVMdev] Cc llvmdev: Re: llvm bpf debug info. Re: [RFC PATCH v4 3/3] bpf: Introduce function for outputing data to perf event
On 8/4/15 11:51 PM, Wangnan (F) wrote:> void bpf_store_half(void *skb, int off, int val) > asm("llvm.bpf.store.half"); > int func() > { > bpf_store_half(0, 0, 0); > return 0; > } > > Compiled with: > > $ clang -g -target bpf -O2 -S -c test.c > > And get this: > > .text > .globl func > .align 8 > func: # @func > # BB#0: # %entry > mov r1, 0 > mov r2, 0 > mov r3, 0 > call llvm.bpf.store.halfit didn't work because number and types of args were incompatible. Every samples/bpf/sockex[0-9]_kern.c is using llvm.bpf.load.* intrinsics. the typeid changing ids with order is surprising. I think the assertion in ExtractTypeInfo() is not hard. Just there were no such use cases. May be we can do something similar to what LowerIntrinsicCall() does and lower it differently in the backend.
Wangnan (F)
2015-Aug-05 08:28 UTC
[llvm-dev] [LLVMdev] Cc llvmdev: Re: llvm bpf debug info. Re: [RFC PATCH v4 3/3] bpf: Introduce function for outputing data to perf event
On 2015/8/5 15:11, Alexei Starovoitov wrote:> On 8/4/15 11:51 PM, Wangnan (F) wrote: >> void bpf_store_half(void *skb, int off, int val) >> asm("llvm.bpf.store.half"); >> int func() >> { >> bpf_store_half(0, 0, 0); >> return 0; >> } >> >> Compiled with: >> >> $ clang -g -target bpf -O2 -S -c test.c >> >> And get this: >> >> .text >> .globl func >> .align 8 >> func: # @func >> # BB#0: # %entry >> mov r1, 0 >> mov r2, 0 >> mov r3, 0 >> call llvm.bpf.store.half > > it didn't work because number and types of args were incompatible. > Every samples/bpf/sockex[0-9]_kern.c is using llvm.bpf.load.* intrinsics. >Make it work. Thank you. It doesn't work for me at first since in my llvm there's only llvm.bpf.load.*. I think llvm.bpf.store.* belone to some patches you haven't posted yet?> the typeid changing ids with order is surprising. > I think the assertion in ExtractTypeInfo() is not hard. > Just there were no such use cases. May be we can do something > similar to what LowerIntrinsicCall() does and lower it differently > in the backend. >But in backend can we still get type information? I thought type is meaningful in frontend only, and backend behaviors is unable to affect DWARF generation, right? Thank you.
Alexei Starovoitov
2015-Aug-06 03:22 UTC
[llvm-dev] [LLVMdev] Cc llvmdev: Re: llvm bpf debug info. Re: [RFC PATCH v4 3/3] bpf: Introduce function for outputing data to perf event
On Wed, Aug 05, 2015 at 04:28:13PM +0800, Wangnan (F) wrote:> > It doesn't work for me at first since in my llvm there's only > llvm.bpf.load.*. > > I think llvm.bpf.store.* belone to some patches you haven't posted yet?nope. only loads have special instructions ld_abs/ld_ind which are represented by these intrinsics. stores, so far, are done via single bpf_store_bytes() helper function.> >the typeid changing ids with order is surprising. > >I think the assertion in ExtractTypeInfo() is not hard. > >Just there were no such use cases. May be we can do something > >similar to what LowerIntrinsicCall() does and lower it differently > >in the backend. > > > But in backend can we still get type information? I thought type is > meaningful in frontend only, and backend behaviors is unable to affect > DWARF generation, right?why do we need to affect type generation? we just need to know dwarf type id in the backend, so we can emit it as a constant. I still think lowering eh_typeid_for differently may work. Like instead of doing GV = ExtractTypeInfo(I.getArgOperand(0)) followed by getMachineFunction().getMMI().getTypeIDFor(GV) we can get dwarf type id from I.getArgOperand(0) if it's any pointer to struct type. I'm not familiar with dwarf handling part of llvm, but feels possible.