[Intel-gfx] [PATCH] lib: Declare loop variable as volatile before setjmp
Daniel Vetter
daniel at ffwll.ch
Wed Apr 20 12:53:49 UTC 2016
On Fri, Apr 15, 2016 at 02:00:04PM +0200, Tomeu Vizoso wrote:
> The variable used as loop counter in the igt_fixture macro had
> unspecified value from the setjmp(3) man page quoted below. Because of
> that, in certain circumstances and with -O2 and -Os, the initialization
> of that variable would be eliminated and the compiler would complain of
> uninitialized usage. Below can be found a snippet that reproduces the
> problem with GCC 5.3.1 and 4.9.3 and the errors as printed by 5.3.1.
>
> "The compiler may optimize variables into registers, and longjmp() may
> restore the values of other registers in addition to the stack pointer
> and program counter. Consequently, the values of automatic variables
> are unspecified after a call to longjmp() if they meet all the following
> criteria:
>
> · they are local to the function that made the corresponding setjmp(3)
> call;
>
> · their values are changed between the calls to setjmp(3) and
> longjmp(); and
>
> · they are not declared as volatile."
>
> static void test(void)
> {
> igt_subtest_group {
> igt_fixture {
> }
>
> igt_subtest("foo") {
> }
>
> igt_fixture {
> }
> }
> }
>
> In file included from lib/intel_batchbuffer.h:8:0,
> from lib/drmtest.h:39,
> from lib/igt.h:27,
> from tests/kms_addfb_basic.c:28:
> tests/kms_addfb_basic.c: In function 'tiling_tests.isra.0':
> lib/igt_core.h:110:43: warning: '__tmpint245' is used uninitialized in
> this function [-Wuninitialized]
> #define igt_fixture for (int igt_tokencat(__tmpint,__LINE__) = 0; \
> ^
> lib/igt_core.h:110:43: note: '__tmpint245' was declared here
> #define igt_fixture for (int igt_tokencat(__tmpint,__LINE__) = 0; \
> ^
> lib/igt_core.h:148:31: note: in definition of macro '__igt_tokencat2'
> #define __igt_tokencat2(x, y) x ## y
> ^
> lib/igt_core.h:110:30: note: in expansion of macro 'igt_tokencat'
> #define igt_fixture for (int igt_tokencat(__tmpint,__LINE__) = 0; \
> ^
> tests/kms_addfb_basic.c:245:3: note: in expansion of macro 'igt_fixture'
> igt_fixture {
>
> Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Oh nice, I never figured this out. Ther's another char tmp in the
igt_subtest_f macro, maybe we should fix that up too, just for safety?
Meanwhile applied your patch, thanks.
-Daniel
> ---
> lib/igt_core.h | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index b3fa7356e473..1b62371a7138 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -107,7 +107,7 @@ void __igt_fixture_end(void) __attribute__((noreturn));
> * enumeration (e.g. when enumerating on systems without an intel gpu) such
> * blocks should be annotated with igt_fixture.
> */
> -#define igt_fixture for (int igt_tokencat(__tmpint,__LINE__) = 0; \
> +#define igt_fixture for (volatile int igt_tokencat(__tmpint,__LINE__) = 0; \
> igt_tokencat(__tmpint,__LINE__) < 1 && \
> __igt_fixture() && \
> (sigsetjmp(igt_subtest_jmpbuf, 1) == 0); \
> --
> 2.5.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the Intel-gfx
mailing list