
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.
122 lines
2.5 KiB
C
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 */
|
|
}
|