Module Name: src Committed By: joerg Date: Thu Jun 6 17:40:09 UTC 2013
Modified Files: src/tests/lib/libexecinfo: t_backtrace.c Log Message: Make back trace more robust. At least on i386, one of the intermediate functions in ATF is not replaced by tail recursion elimination, so mark it as optional. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libexecinfo/t_backtrace.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libexecinfo/t_backtrace.c diff -u src/tests/lib/libexecinfo/t_backtrace.c:1.5 src/tests/lib/libexecinfo/t_backtrace.c:1.6 --- src/tests/lib/libexecinfo/t_backtrace.c:1.5 Sat Jun 2 14:52:28 2012 +++ src/tests/lib/libexecinfo/t_backtrace.c Thu Jun 6 17:40:09 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: t_backtrace.c,v 1.5 2012/06/02 14:52:28 njoly Exp $ */ +/* $NetBSD: t_backtrace.c,v 1.6 2013/06/06 17:40:09 joerg Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_backtrace.c,v 1.5 2012/06/02 14:52:28 njoly Exp $"); +__RCSID("$NetBSD: t_backtrace.c,v 1.6 2013/06/06 17:40:09 joerg Exp $"); #include <atf-c.h> #include <atf-c/config.h> @@ -45,13 +45,23 @@ static void __attribute__((__noinline__) myfunc3(size_t ncalls) { static const char *top[] = { "myfunc", "atfu_backtrace_fmt_basic_body", - "atf_tc_run", "atf_tp_main", "main", "___start" }; - size_t j, nptrs; + "atf_tc_run", "atf_tp_run", "atf_tp_main", "main", "___start" }; + static bool optional_frame[] = { false, false, false, true, false, false, false }; + size_t j, nptrs, min_frames, max_frames; void *buffer[ncalls + 10]; char **strings; + __CTASSERT(__arraycount(top) == __arraycount(optional_frame)); + min_frames = 0; + max_frames = 0; + for (j = 0; j < __arraycount(optional_frame); ++j) { + if (!optional_frame[j]) + ++min_frames; + ++max_frames; + } nptrs = backtrace(buffer, __arraycount(buffer)); - ATF_REQUIRE_EQ(nptrs, ncalls + 8); + ATF_REQUIRE(nptrs >= ncalls + 2 + min_frames); + ATF_REQUIRE(nptrs <= ncalls + 2 + max_frames); strings = backtrace_symbols_fmt(buffer, nptrs, "%n"); @@ -62,8 +72,13 @@ myfunc3(size_t ncalls) for (j = 2; j < ncalls + 2; j++) ATF_CHECK_STREQ(strings[j], "myfunc1"); - for (size_t i = 0; j < nptrs; i++, j++) + for (size_t i = 0; j < nptrs; i++, j++) { + if (optional_frame[i] && strcmp(strings[j], top[i])) { + --i; + continue; + } ATF_CHECK_STREQ(strings[j], top[i]); + } free(strings); }