[Mesa-dev] [PATCH 4/7] mesa: Convert some runtime asserts to static asserts.
Brian Paul
brian.e.paul at gmail.com
Sat Sep 21 07:57:21 PDT 2013
On Fri, Sep 20, 2013 at 7:52 PM, Eric Anholt <eric at anholt.net> wrote:
> Noticed while grepping through the code for something else.
> ---
> src/mesa/program/program.c | 36 ++++++++++++++++++++++--------------
> 1 file changed, 22 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c
> index 2529c13..5dd68d9 100644
> --- a/src/mesa/program/program.c
> +++ b/src/mesa/program/program.c
> @@ -55,27 +55,35 @@ _mesa_init_program(struct gl_context *ctx)
> * If this assertion fails, we need to increase the field
> * size for register indexes (see INST_INDEX_BITS).
> */
> - ASSERT(ctx->Const.VertexProgram.MaxUniformComponents / 4
> + STATIC_ASSERT(ctx->Const.VertexProgram.MaxUniformComponents / 4
> <= (1 << INST_INDEX_BITS));
> - ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents / 4
> + STATIC_ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents / 4
> <= (1 << INST_INDEX_BITS));
>
> - ASSERT(ctx->Const.VertexProgram.MaxTemps <= (1 << INST_INDEX_BITS));
> - ASSERT(ctx->Const.VertexProgram.MaxLocalParams <= (1 << INST_INDEX_BITS));
> - ASSERT(ctx->Const.FragmentProgram.MaxTemps <= (1 << INST_INDEX_BITS));
> - ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <= (1 << INST_INDEX_BITS));
> -
> - ASSERT(ctx->Const.VertexProgram.MaxUniformComponents <= 4 * MAX_UNIFORMS);
> - ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents <= 4 * MAX_UNIFORMS);
> -
> - ASSERT(ctx->Const.VertexProgram.MaxAddressOffset <= (1 << INST_INDEX_BITS));
> - ASSERT(ctx->Const.FragmentProgram.MaxAddressOffset <= (1 << INST_INDEX_BITS));
> + STATIC_ASSERT(ctx->Const.VertexProgram.MaxTemps <=
> + (1 << INST_INDEX_BITS));
> + STATIC_ASSERT(ctx->Const.VertexProgram.MaxLocalParams <=
> + (1 << INST_INDEX_BITS));
> + STATIC_ASSERT(ctx->Const.FragmentProgram.MaxTemps <=
> + (1 << INST_INDEX_BITS));
> + STATIC_ASSERT(ctx->Const.FragmentProgram.MaxLocalParams <=
> + (1 << INST_INDEX_BITS));
> +
> + STATIC_ASSERT(ctx->Const.VertexProgram.MaxUniformComponents <=
> + 4 * MAX_UNIFORMS);
> + STATIC_ASSERT(ctx->Const.FragmentProgram.MaxUniformComponents <=
> + 4 * MAX_UNIFORMS);
> +
> + STATIC_ASSERT(ctx->Const.VertexProgram.MaxAddressOffset <=
> + (1 << INST_INDEX_BITS));
> + STATIC_ASSERT(ctx->Const.FragmentProgram.MaxAddressOffset <=
> + (1 << INST_INDEX_BITS));
Are you sure about those? How does the compiler know the values of
ctx->Const.Foo at compile time?
It's worrisome that our STATIC_ASSERT macro is silent at compile time
when the expression isn't a compile-time constant. The problem with
our macro now is variable-sized arrays are OK at compile time.
I think a macro based on bitfield width might be better:
#define STATIC_ASSERT(COND) \
do { \
struct dummy { \
int static_assert_failed:(!!(COND)); \
}; \
} while (0)
-Brian
More information about the mesa-dev
mailing list