mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Do not require memset elimination in explicit_bzero test
Some targets fail to apply dead store elimination to the memset call in setup_ordinary_clear. Before this commit, this causes the test case to fail. Instead, the test case now logs lack of memset elimination as an informational message.
This commit is contained in:
parent
525f803984
commit
8d71242eb7
@ -1,3 +1,12 @@
|
||||
2016-12-20 Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Do not require memset elimination in explicit_bzero test.
|
||||
* string/tst-xbzero-opt.c (prepare_test_buffer): Force inlining.
|
||||
(enum test_expectation): Add NO_EXPECTATIONS.
|
||||
(subtests): NO_EXPECTATIONS for ordinary clear.
|
||||
(check_test_buffer): Handle NO_EXPECTATIONS.
|
||||
* string/Makefile (CFLAGS-tst-xbzero-opt.c): Compile with -O3.
|
||||
|
||||
2016-12-20 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)]
|
||||
|
@ -71,6 +71,7 @@ CFLAGS-tst-strlen.c = -fno-builtin
|
||||
CFLAGS-stratcliff.c = -fno-builtin
|
||||
CFLAGS-test-ffs.c = -fno-builtin
|
||||
CFLAGS-tst-inlcall.c = -fno-builtin
|
||||
CFLAGS-tst-xbzero-opt.c = -O3
|
||||
|
||||
ifeq ($(run-built-tests),yes)
|
||||
$(objpfx)tst-svc-cmp.out: tst-svc.expect $(objpfx)tst-svc.out
|
||||
|
@ -88,19 +88,19 @@ static const unsigned char test_pattern[16] =
|
||||
between preparing it and letting it go out of scope, and we expect
|
||||
to find it. This confirms that the test buffer does get filled in
|
||||
and we can find it from the stack buffer. In the "ordinary_clear"
|
||||
case, we clear it using memset, and we expect to find it. This
|
||||
confirms that the compiler can optimize out block clears in this
|
||||
context; if it can't, the real test might be succeeding for the
|
||||
wrong reason. Finally, the "explicit_clear" case uses
|
||||
explicit_bzero and expects _not_ to find the test buffer, which is
|
||||
the real test. */
|
||||
case, we clear it using memset. Depending on the target, the
|
||||
compiler may not be able to apply dead store elimination to the
|
||||
memset call, so the test does not fail if the memset is not
|
||||
eliminated. Finally, the "explicit_clear" case uses explicit_bzero
|
||||
and expects _not_ to find the test buffer, which is the real
|
||||
test. */
|
||||
|
||||
static ucontext_t uc_main, uc_co;
|
||||
|
||||
/* Always check the test buffer immediately after filling it; this
|
||||
makes externally visible side effects depend on the buffer existing
|
||||
and having been filled in. */
|
||||
static void
|
||||
static inline __attribute__ ((always_inline)) void
|
||||
prepare_test_buffer (unsigned char *buf)
|
||||
{
|
||||
for (unsigned int i = 0; i < PATTERN_REPS; i++)
|
||||
@ -133,7 +133,10 @@ setup_explicit_clear (void)
|
||||
explicit_bzero (buf, TEST_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
enum test_expectation { EXPECT_NONE, EXPECT_SOME, EXPECT_ALL };
|
||||
enum test_expectation
|
||||
{
|
||||
EXPECT_NONE, EXPECT_SOME, EXPECT_ALL, NO_EXPECTATIONS
|
||||
};
|
||||
struct subtest
|
||||
{
|
||||
void (*setup_subtest) (void);
|
||||
@ -145,7 +148,9 @@ static const struct subtest *cur_subtest;
|
||||
static const struct subtest subtests[] =
|
||||
{
|
||||
{ setup_no_clear, "no clear", EXPECT_SOME },
|
||||
{ setup_ordinary_clear, "ordinary clear", EXPECT_SOME },
|
||||
/* The memset may happen or not, depending on compiler
|
||||
optimizations. */
|
||||
{ setup_ordinary_clear, "ordinary clear", NO_EXPECTATIONS },
|
||||
{ setup_explicit_clear, "explicit clear", EXPECT_NONE },
|
||||
{ 0, 0, -1 }
|
||||
};
|
||||
@ -225,6 +230,11 @@ check_test_buffer (enum test_expectation expected,
|
||||
}
|
||||
break;
|
||||
|
||||
case NO_EXPECTATIONS:
|
||||
printf ("INFO: %s/%s: found %d patterns%s\n", label, stage, cnt,
|
||||
cnt == 0 ? " (memset not eliminated)" : "");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("ERROR: %s/%s: invalid value for 'expected' = %d\n",
|
||||
label, stage, (int)expected);
|
||||
|
Loading…
Reference in New Issue
Block a user