[llvm-dev] [RFC] A proposal for byval in a world with opaque pointers
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Tue Jan 19 22:49:05 PST 2016
----- Original Message -----
> From: "Eddy B. via llvm-dev" <llvm-dev at lists.llvm.org>
> To: llvm-dev at lists.llvm.org
> Sent: Tuesday, January 19, 2016 4:47:56 PM
> Subject: [llvm-dev] [RFC] A proposal for byval in a world with opaque pointers
>
> Hi,
>
> In the past months, several options have been presented for making
> byval
> (and similar attributes, such as inalloca or sret) work with opaque
> pointers.
>
> The main two I've seen were byval(T) and byval(N) where N is the size
> of T.
>
> They both have their upsides and downsides, for example: byval(T)
> would be
> a type-parametric attribute, which, AFAIK, does not already exist and
> may
> complicate the attribute system significantly, while byval(N) would
> be hard
> to introduce in tests as computing N from T requires LLVM's
> DataLayout.
>
>
> Also, this would have to be done for inalloca and sret as well - sret
> only
> needs it when targeting SPARC, although still generally useful in
> analysis.
>
> To sidestep some of the concerns and allow a smooth transition
> towards a
> byval that works with opaque pointers, I've come up with a new
> approach:
>
> Reuse dereferenceable(S) and align A for the size and alignment of
> byval.
>
> That is, a byval dereferenceable(S) align A argument is guaranteed to
> have
> S bytes available to read from, *and only S*, aligned to a multiple
> of A.
> Reading past that size is UB, as LLVM will not copy more than S
> bytes.
>
> An API can be provided to add the attribute alongside dereferenceable
> and align attributes, for a given Type* and DataLayout.
This sounds like a reasonable plan to me.
-Hal
>
> A preliminary implementation (w/o sret) can be found at:
> https://github.com/eddyb/llvm/compare/2579466...65ac99b
>
> To maintain compatibility with existing code, dereferenceable and
> align
> attributes are automatically injected as soon as a non-default
> DataLayout
> is available. The "injection" mechanism could potentially be replaced
> with
> a pass, although it was easier to experiment with it being
> guaranteed.
>
> This works out pretty well in practice, as analysis already
> understands
> dereferenceable and can make decisions based on it.
>
> The verifier checks that for byval & friends, dereferenceable(S) and
> align A are present (clang always adds align, but not all tests have
> it)
> and that S is the exact size of the pointee type (while we still know
> that).
>
> That last bit is very important, because it allows a script to do the
> following:
>
> 1. Find all byval arguments in tests that are missing
> dereferenceable, e.g.
> ... i32* byval align 4 ...
> .... {i8, i64}* byval ...
> 2. Add a bogus dereferenceable(unique ID) to each of them, i.e.
> ... i32* byval dereferenceable(123400001) align 4 ...
> .... {i8, i16}* byval dereferenceable(123400002) ...
> 3. Run the tests and record the errors, which may look like:
>
> Attribute 'byval' expects 'dereferenceable(4)' for type i32*,
> found 'dereferenceable(123400001)'
>
> Attribute 'byval' expects 'dereferenceable(16) align 8' for type {i8,
> i64}*,
> found 'dereferenceable(123400002)'
>
> 4. Use the verifier error messages to replace the bogus attributes
> with the proper ones, which include align A when it is missing:
> ... i32* byval dereferenceable(4) align 4 ...
> .... {i8, i16}* byval dereferenceable(16) align 8 ...
>
> For what is worth, the same scheme would also work for byval(N), and
> would be entirely unnecessary for byval(T).
>
> I would love to know your thoughts on this, and more specifically:
> Which of the 3 (byval(T), byval(N) and byval + dereferenceable +
> align)
> do you think would provide the easiest transition path for
> front-ends?
>
> Thank you,
> - eddyb
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list