[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