[libvirt] [PATCHv2] test: fix build errors with gcc 4.7.0 and -O0

Daniel Veillard veillard at redhat.com
Fri Apr 6 03:20:42 UTC 2012


On Thu, Apr 05, 2012 at 05:13:24PM -0600, Eric Blake wrote:
> From: Laine Stump <laine at laine.org>
> 
> When building on Fedora 17 (which uses gcc 4.7.0) with -O0 in CFLAGS,
> three of the tests failed to compile.
> 
> cputest.c and qemuxml2argvtest.c had non-static structs defined
> inside the macro that was being repeatedly invoked. Due to some so-far
> unidentified change in gcc, the stack space used by variables defined
> inside { } is not recovered/re-used when the block ends, so all these
> structs have become additive (this is the same problem worked around
> in commit cf57d345b). Fortunately, these two files could be fixed with
> a single line addition of "static" to the struct definition in the
> macro.
> 
> virnettlscontexttest.c was a bit different, though. The problem structs
> were in the do/while loop of macros, and making the static required
> piecemeal initialization instead of member initialization.
> 
> In an ideal world, none of these changes should be necessary, but not
> knowing how long it will be until the gcc regressions are fixed, and
> since the code is just as correct after this patch as before, it makes
> sense to fix libvirt's build for -O0 while also reporting the gcc
> problem.
> ---
> 
> Since Laine didn't push v1 under the build-breaker rule, I won't
> push v2 for the same reason.  But this is a smaller solution for
> the same issue.
> 
>  tests/cputest.c              |    2 +-
>  tests/qemuxml2argvtest.c     |    2 +-
>  tests/virnettlscontexttest.c |   44 ++++++++++++++++++++++++++++-------------
>  3 files changed, 32 insertions(+), 16 deletions(-)
> 
> diff --git a/tests/cputest.c b/tests/cputest.c
> index 9928e5d..01db8f1 100644
> --- a/tests/cputest.c
> +++ b/tests/cputest.c
> @@ -512,7 +512,7 @@ mymain(void)
>  #define DO_TEST(arch, api, name, host, cpu,                             \
>                  models, nmodels, preferred, result)                     \
>      do {                                                                \
> -        struct data data = {                                            \
> +        static struct data data = {                                     \
>              arch, api, host, cpu, models,                               \
>              models == NULL ? NULL : #models,                            \
>              nmodels, preferred, result    \
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index 637ca50..fdbe95a 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -314,7 +314,7 @@ mymain(void)
>  # define DO_TEST_FULL(name, migrateFrom, migrateFd,                     \
>                        expectError, expectFailure, ...)                  \
>      do {                                                                \
> -        struct testInfo info = {                                        \
> +        static struct testInfo info = {                                 \
>              name, NULL, migrateFrom, migrateFd,                         \
>              expectError, expectFailure                                  \
>          };                                                              \
> diff --git a/tests/virnettlscontexttest.c b/tests/virnettlscontexttest.c
> index 8e805d8..e745487 100644
> --- a/tests/virnettlscontexttest.c
> +++ b/tests/virnettlscontexttest.c
> @@ -749,31 +749,47 @@ mymain(void)
>      if (virFileWriteStr(keyfile, PRIVATE_KEY, 0600) < 0)
>          return EXIT_FAILURE;
> 
> -# define DO_CTX_TEST(isServer, caReq, certReq, expectFail)              \
> +# define DO_CTX_TEST(_isServer, _caReq, _certReq, _expectFail)          \
>      do {                                                                \
> -        struct testTLSContextData data = {                              \
> -            isServer, caReq, certReq, expectFail,                       \
> -        };                                                              \
> +        static struct testTLSContextData data;                          \
> +        data.isServer = _isServer;                                      \
> +        data.careq = _caReq;                                            \
> +        data.certreq = _certReq;                                        \
> +        data.expectFail = _expectFail;                                  \
>          if (virtTestRun("TLS Context", 1, testTLSContextInit, &data) < 0) \
>              ret = -1;                                                   \
>      } while (0)
> 
> -# define DO_SESS_TEST(caReq, serverReq, clientReq, expectServerFail, expectClientFail, hostname, wildcards) \
> +# define DO_SESS_TEST(_caReq, _serverReq, _clientReq, _expectServerFail,\
> +                      _expectClientFail, _hostname, _wildcards)         \
>      do {                                                                \
> -        struct testTLSSessionData data = {                              \
> -            caReq, { 0 }, serverReq, clientReq,                         \
> -            expectServerFail, expectClientFail, hostname, wildcards     \
> -        };                                                              \
> +        static struct testTLSSessionData data;                          \
> +        static struct testTLSCertReq other;                             \
> +        data.careq = _caReq;                                            \
> +        data.othercareq = other;                                        \
> +        data.serverreq = _serverReq;                                    \
> +        data.clientreq = _clientReq;                                    \
> +        data.expectServerFail = _expectServerFail;                      \
> +        data.expectClientFail = _expectClientFail;                      \
> +        data.hostname = _hostname;                                      \
> +        data.wildcards = _wildcards;                                    \
>          if (virtTestRun("TLS Session", 1, testTLSSessionInit, &data) < 0) \
>              ret = -1;                                                   \
>      } while (0)
> 
> -# define DO_SESS_TEST_EXT(caReq, othercaReq, serverReq, clientReq, expectServerFail, expectClientFail, hostname, wildcards) \
> +# define DO_SESS_TEST_EXT(_caReq, _othercaReq, _serverReq, _clientReq,  \
> +                          _expectServerFail, _expectClientFail,         \
> +                          _hostname, _wildcards)                        \
>      do {                                                                \
> -        struct testTLSSessionData data = {                              \
> -            caReq, othercaReq, serverReq, clientReq,                    \
> -            expectServerFail, expectClientFail, hostname, wildcards     \
> -        };                                                              \
> +        static struct testTLSSessionData data;                          \
> +        data.careq = _caReq;                                            \
> +        data.othercareq = _othercaReq;                                  \
> +        data.serverreq = _serverReq;                                    \
> +        data.clientreq = _clientReq;                                    \
> +        data.expectServerFail = _expectServerFail;                      \
> +        data.expectClientFail = _expectClientFail;                      \
> +        data.hostname = _hostname;                                      \
> +        data.wildcards = _wildcards;                                    \
>          if (virtTestRun("TLS Session", 1, testTLSSessionInit, &data) < 0) \
>              ret = -1;                                                   \
>      } while (0)

  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list