[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