[cfe-dev] [RFC] Handling implementation limits
Mark de Wever via cfe-dev
cfe-dev at lists.llvm.org
Thu Jan 2 11:58:24 PST 2020
On Wed, Jan 01, 2020 at 11:14:16PM -0500, John McCall wrote:
> On 1 Jan 2020, at 11:16, Mark de Wever wrote:
> > At the moment the implementation limits of the Clang compiler are hidden
> > in magic numbers in the code. These numbers sometimes differ between the
> > frontend and the backend. They are not always properly guarded by
> > compiler
> > warnings, instead they trigger assertion failures.
>
> *Technically*, crashing is still a valid way of indicating non-acceptance,
> although obviously I agree that we should diagnose these things properly.
> (They can’t just be warnings, though.)
Agreed I should have used the word diagnostic instead. If the limit is
exceeded it will give an error.
> > The compiler has several limitations often 'hidden' as the width of a
> > bit-field in a structure. This makes it hard to find these limits. Not
> > only for our users but also for developers. While looking at a proper
> > limit for the maximum width of a bit-field in the frontend I discovered
> > it didn't matter what the frontend picked, the backend already had a
> > limit [D71142]. To fix this issue the frontend and backend should have
> > the same limit. To avoid duplicating the value it should be in a header
> > available to the frontend and backend.
>
> FWIW, we don’t generally refer to IRGen as the “backend”.
>
> In many cases, the right code change will probably be to introduce a
> static assertion linking the implementation limit to some value in code,
> rather than using the limit directly. For example, many limits will
> be absolute numbers, and it is probably better to
> `static_assert(IQ_MaxWidgets < (1ULL << SomeBitFieldWidth))` than to
> try to make that bit-field have the exact right width. This is also
> a pattern that works even if the limit is stored in a normal field
> of type (say) `unsigned`; such places should also have a `static_assert`
> in order to remind the reader/maintainer that there’s an implementation
> limit affected.
If the field SomeBitField is limited by a bit-field width it will also
create the constant SomeBitFieldMax which contains the maximum value. So
that would make it easier to directly use the maximum.
-Mark
More information about the cfe-dev
mailing list