On Thu, Apr 05, 2012 at 05:13:24PM -0600, Eric Blake wrote: > From: Laine Stump <laine@xxxxxxxxx> > > 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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list