dblaikie added a comment. In D74572#2042931 <https://reviews.llvm.org/D74572#2042931>, @yonghong-song wrote:
> @dblaikie I can revert but let me first understand the alternative way to do > the work, at least in high level. > > [ > I do believe my commit message, esp. the first couple of lines is badly > inaccurate. I suspect this is the one causing your confusion as well. > specially, In the beginning of commit message, I said: > > u32 btf_type_id = __builtin_btf_type_id(param) > > But later on, I also said: > > In the above example, the second argument for __builtin_btf_type_id() is 0, > which means a relocation for local adjustment, i.e., w.r.t. bpf program BTF > change, will be generated. The value 1 for the second argument means a > relocation for remote adjustment, e.g., against vmlinux. > > > The above statement implies two arguments. > The actually builtin signature should be > > u32 btf_type_id = __builtin_btf_type_id(expr, reloc_type) > > The first parameter is not necessary a parameter and it can be any expression. > This is my fault as this patch go through several revision and I forgot to > change that. I am happy to revert and rework the commit message to make it > more clear. > ] Appreciate the clarification - thanks! > Maybe, the description not clear or too BPF specific. Let me try again to > describe the purpose of this builtin. > The interface of this builtin likes below: > > __builtin_btf_type_id(expr, reloc_type) > > The goal is to: > > - the expression here can be a variable (like "a" int "struct { ...} a", or > any valid C expression, e.g., &a, a->field_b). > - return the type_id, and generates a reloc_type based on user input (the > relocation is generated in .BTF.ext section). > - here, the relocation is against the return value, e.g., unsigned btf_id = > __builtin_btf_type_id(expr, reloc_type) a relocation against the BPF > instruction bpf_id = ... needs to be generated. > > What is the use case for this builtin? Currently, various uses are all for > pretty-print. Pass some data together with btf_id so kernel or use space can > pretty-print it. For example struct {void *p, uint32_t bpf_id} v = {a->b->c, > __builtin_btf_type_id(a->b->c, 1)}; printk("....%pT...", ..., &v, ...); here > a->b->c might be a type "struct abc", and the kernel will be able to print > out the object pointed by a->b->c in a pretty format based on "struct abc". > Here, the second parameter "1" means the ressulted btf_id will be relocated > against kernel BTF. The linux kernel target is x64, arm64, etc. > > In the future, we may have other use cases. > > The reason we need relocation is later BTF debug info may be merged > (linked) with other bpf program and you need to adjust btf_id, or it may try > to match against types against vmlinux. > > The type associated with the expression may be local which user has control > or maybe in a header user does not have control. > > The following is what I understand the possible alternative: > - Keep or the retained type for the expression, so we do not need the IR > builtin. I guess, in order to do this, we need: > - We still need to annotate the expression somehow so we later on we can > generate proper relocation later on. > - If we do have a variable here, we might be able to annotate the variable > (special attributes?) so we do not carry debuginfo types. But for > expressions, we would still need to carry debuginfo. Otherwise, it is very > hard to get debug info in backend. > > Hopefully this is more clear with the interface/intention of this builtin. > Please let me know in high level whether we could do better. Thanks! Thanks for the explanation (& sorry for my very delayed response). BPF uses its own debug info format, right? I guess it might be far enough out of my wheelhouse that I don't have a lot of understanding/experience to impart into your situation there. I think the explanation makes some sense to me as to why you're using an intrinsic like this, and I was a bit quick to call for a revert/suggest this wasn't the right direction - sorry about that. It might be worth having an extra test that's just IR->IR to test the BPFPreserveDIType pass in a more isolated fashion. Or would it be reasonable to have Clang generate the IR in the post-BPFPreserveDIType form to begin with, and avoid the need for that pass to run later? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D74572/new/ https://reviews.llvm.org/D74572 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits