binutils-gdb/gdb/testsuite/gdb.python/py-format-string.c
Andreas Arnez 9ef62df072 gdb/testsuite: Fix py-format-string.exp on big-endian platforms
GDB's py-format-string test case depends on endianness.  In particular it
relies on the first byte of the machine representation of 42 (as an int)
to be 42 as well.  While this is indeed the case for little-endian
machines, big-endian machines store a zero in the first byte instead.  The
wrong assumption leads to lots of FAILs on such architectures.

Fix this by filling the affected union with bytes of the same value, such
that endianness does not matter.  Use the value 42, to keep the character
in the first byte unchanged.

gdb/testsuite/ChangeLog:

	* gdb.python/py-format-string.c (string.h): New include.
	(main): Fill a_struct_with_union.the_union.an_int with bytes of
	the same value, for endianness-independence.
	* gdb.python/py-format-string.exp (default_regexp_dict)
	(test_pretty_structs, test_format): Adjust expected output to the
	changed initialization.
2019-10-02 20:01:44 +02:00

122 lines
2.5 KiB
C

/* This testcase is part of GDB, the GNU debugger.
Copyright 2019 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 <string.h>
typedef struct point
{
int x;
int y;
} point_t;
typedef union
{
int an_int;
char a_char;
} union_t;
typedef struct
{
union_t the_union;
} struct_union_t;
typedef enum
{
ENUM_FOO,
ENUM_BAR,
} enum_t;
typedef void (*function_t) (int);
static void
my_function(int n)
{
}
#ifdef __cplusplus
struct Base
{
Base (int a_) : a (a_) {}
virtual int get_number () { return a; }
int a;
static int a_static_member;
};
int Base::a_static_member = 2019;
struct Deriv : Base
{
Deriv (int b_) : Base (42), b (b_) {}
virtual int get_number () { return b; }
int b;
};
#endif
int global_symbol = 42;
int
main ()
{
point_t a_point_t = { 42, 12 };
point_t *a_point_t_pointer = &a_point_t;
#ifdef __cplusplus
point_t &a_point_t_ref = a_point_t;
#endif
struct point another_point = { 123, 456 };
struct_union_t a_struct_with_union;
/* Fill the union in an endianness-independent way. */
memset (&a_struct_with_union.the_union, 42,
sizeof (a_struct_with_union.the_union));
enum_t an_enum = ENUM_BAR;
const char *a_string = "hello world";
const char *a_binary_string = "hello\0world";
const char a_binary_string_array[] = "hello\0world";
const int letters_repeat = 10;
char a_big_string[26 * letters_repeat + 1];
a_big_string[26 * letters_repeat] = '\0';
for (int i = 0; i < letters_repeat; i++)
for (char c = 'A'; c <= 'Z'; c++)
a_big_string[i * 26 + c - 'A'] = c;
int an_array[] = { 2, 3, 5 };
int an_array_with_repetition[] = {
1, /* 1 time. */
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 12 times. */
5, 5, 5, /* 3 times */
};
int *a_symbol_pointer = &global_symbol;
#ifdef __cplusplus
Deriv a_deriv (123);
Base &a_base_ref = a_deriv;
#endif
return 0; /* break here */
}