This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH V2 2/8] bpf: new GCC port
jose.marchesi@oracle.com (Jose E. Marchesi) writes:
> > +#undef TARGET_PASS_BY_REFERENCE
> > +#define TARGET_PASS_BY_REFERENCE bpf_pass_by_reference
>
> I might have misunderstood, but I thought from an earlier (IRC?)
> message, it wasn't possible for the callee to access the caller's
> frame, which was why you had the error about running out of argument
> registers. If so, won't passing by reference make the argument
> inaccessible in practice? I don't see what you gain by defining
> the hook, since I'd have assumed (at least after the fix above)
> that it would be better to pass by value and get an error about
> having no argument registers left.
>
> Yes. I added that hook before I had the restriction of number of
> arguments in place. Removing it.
>
> Happy auto correction :)
>
> A colleague (who actually _uses_ eBPF extensively, ahem) tells me that
> the kernel verifier allows to pass addresses of the caller's stack
> frame, tracking that it is a ptr to a stack location, and it knows which
> stack it came from. So it is indeed possible for the callee to access
> the caller's frame, and therefore to pass arguments by reference.
>
> On the downside, it is not possible for a callee to access the caller's
> frame applying an offset to its frame pointer, because the stacks are
> disjoint. This means that most probably I will have to dedicate a real,
> not eliminable register to act as the arg pointer, if I want to get rid
> of the annoying limitation on the number of arguments... and in order
> to keep ABI compatibility with llvm built objects, this register is
> gonna have to be %r5, i.e. the last register usable to pass arguments,
> but it should be only used for that purpose if the function gets more
> than 5 arguments... sounds messy, but there is hope, yay!
>
> However, unless someone comes with a magical macro to define or an
> existing target doing the same thing, I am deferring attacking this
> problem for later (TM) and for the time being I will keep both the
> ability of passing aggregates and other big arguments by reference, and
> the limit on number of arguments (this is what clang does.)
>
> I hope that's ok for you people.
Sounds good :-)