binutils-gdb/gdb/testsuite/gdb.arch/i386-mpx-call.c
Tom de Vries 3f94e58859 [gdb/testsuite] Add have_mpx in lib/gdb.exp
The sources for the test-cases gdb.arch/i386-mpx*.exp contain have_mpx
functions that test whether the processor supports mpx instructions.

OTOH, the test-cases are compiled using -mmpx -fcheck-pointer-bounds, which
instrument all functions with mpx instructions.

So, the function that is supposed to test whether mpx instruction are
supported contains mpx instructions, which is a bit odd.

We could fix this by:
- factoring out the have_mpx function into a single source file, and
- compiling it without "-mmpx -fcheck-pointer-bounds".

But having the mpx support test as part of the test-cases seems like an
unnecessary complication that makes the test-cases more difficult to analyze,
reason about and modify.

So we go one step further and factor out the mpx support test in into a
gdb_caching_proc.

Tested on x86_64-linux.

gdb/testsuite/ChangeLog:

2021-01-12  Tom de Vries  <tdevries@suse.de>

	* gdb.arch/i386-mpx-call.c (have_mpx): Remove.
	(main): Remove call to have_mpx.
	* gdb.arch/i386-mpx-call.exp: Use have_mpx.
	* gdb.arch/i386-mpx-map.c (have_mpx): Remove.
	(main): Remote call to have_mpx.
	* gdb.arch/i386-mpx-map.exp: Use have_mpx.
	* gdb.arch/i386-mpx-sigsegv.c (have_mpx): Remove.
	(main): Remove call to have_mpx.
	* gdb.arch/i386-mpx-sigsegv.exp: Use have_mpx.
	* gdb.arch/i386-mpx-simple_segv.c (have_mpx): Remove.
	(main): Remove call to have_mpx.
	* gdb.arch/i386-mpx-simple_segv.exp: Use have_mpx.
	* gdb.arch/i386-mpx.c (have_mpx): Remove.
	(main): Remote call to have_mpx.
	* gdb.arch/i386-mpx.exp: Use have_mpx.
	* lib/gdb.exp (have_mpx): New proc.
2021-01-12 17:36:51 +01:00

106 lines
2.0 KiB
C

/* Test for inferior function calls MPX context.
Copyright (C) 2017-2021 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <stdlib.h>
#include <string.h>
/* Defined size for arrays. */
#define ARRAY_LENGTH 5
int
upper (int *a, int *b, int *c, int *d, int len)
{
int value;
value = *(a + len);
value = *(b + len);
value = *(c + len);
value = *(d + len);
value = value - *a + 1;
return value;
}
int
lower (int *a, int *b, int *c, int *d, int len)
{
int value;
value = *(a - len);
value = *(b - len);
value = *(c - len);
value = *(d - len);
value = value - *a + 1;
return value;
}
char
char_upper (char *str, int length)
{
char ch;
ch = *(str + length);
return ch;
}
char
char_lower (char *str, int length)
{
char ch;
ch = *(str - length);
return ch;
}
int
main (void)
{
int sa[ARRAY_LENGTH];
int sb[ARRAY_LENGTH];
int sc[ARRAY_LENGTH];
int sd[ARRAY_LENGTH];
int *x, *a, *b, *c, *d;
char mchar;
char hello[] = "Hello";
x = malloc (sizeof (int) * ARRAY_LENGTH);
a = malloc (sizeof (int) * ARRAY_LENGTH);
b = malloc (sizeof (int) * ARRAY_LENGTH);
c = malloc (sizeof (int) * ARRAY_LENGTH);
d = malloc (sizeof (int) * ARRAY_LENGTH);
*x = upper (sa, sb, sc, sd, 0); /* bkpt 1. */
*x = lower (a, b, c, d, 0);
mchar = char_upper (hello, 10);
mchar = char_lower (hello, 10);
free (x);
free (a);
free (b);
free (c);
free (d);
return 0;
}