gdb/testsuite: Fix py-format-string.exp on big-endian platforms
authorAndreas Arnez <arnez@linux.ibm.com>
Wed, 2 Oct 2019 18:01:44 +0000 (20:01 +0200)
committerAndreas Arnez <arnez@linux.ibm.com>
Wed, 2 Oct 2019 18:01:44 +0000 (20:01 +0200)
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.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-format-string.c
gdb/testsuite/gdb.python/py-format-string.exp

index b6667f0df73fccbcd3f7f33213fc942a756a0c5e..8f01b878f8aeac737720153ddc49c2d29d8a2248 100644 (file)
@@ -1,3 +1,12 @@
+2019-10-02  Andreas Arnez  <arnez@linux.ibm.com>
+
+       * 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  Tom Tromey  <tromey@adacore.com>
 
        * gdb.ada/catch_ex_std.exp: Add $_ada_exception test.
index 120ecce989ccb17a9b4de6cc7307c3338f8f37e1..017f92080b6c85d72c972743d9942876ac727026 100644 (file)
@@ -15,6 +15,8 @@
    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;
@@ -84,7 +86,9 @@ main ()
   struct point another_point = { 123, 456 };
 
   struct_union_t a_struct_with_union;
-  a_struct_with_union.the_union.an_int = 42;
+  /* 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;
 
index ebb2074ce87f781e4c430a3b38f5ae8bf3426e2e..ad71fe0e51b69ff5312d3c39d179a8792e8efd49 100644 (file)
@@ -124,7 +124,7 @@ set default_regexp_dict [dict create \
   "a_point_t_pointer"          $default_pointer_regexp \
   "a_point_t_ref"              "Pretty Point \\(42, 12\\)" \
   "another_point"              "Pretty Point \\(123, 456\\)" \
-  "a_struct_with_union"                "\\{the_union = \\{an_int = 42, a_char = 42 '\\*'\\}\\}" \
+  "a_struct_with_union"                "\\{the_union = \\{an_int = 707406378, a_char = 42 '\\*'\\}\\}" \
   "an_enum"                    "ENUM_BAR" \
   "a_string"                   "${default_pointer_regexp} \"hello world\"" \
   "a_binary_string"            "${default_pointer_regexp} \"hello\"" \
@@ -333,7 +333,7 @@ proc test_pretty_structs {} {
   global current_lang
 
   set a_struct_with_union_pretty \
-    "\\{\[\r\n\]+  the_union = \\{\[\r\n\]+    an_int = 42,\[\r\n\]+    a_char = 42 '\\*'\[\r\n\]+  \\}\[\r\n\]+\\}"
+    "\\{\[\r\n\]+  the_union = \\{\[\r\n\]+    an_int = 707406378,\[\r\n\]+    a_char = 42 '\\*'\[\r\n\]+  \\}\[\r\n\]+\\}"
 
   check_var_with_bool_opt "pretty_structs" "a_point_t"
   check_var_with_bool_opt "pretty_structs" "a_point_t_pointer"
@@ -814,7 +814,7 @@ proc test_format {} {
     check_format_string "a_point_t_pointer" $opts
     check_format_string "another_point" $opts
     check_format_string "a_struct_with_union" $opts \
-      "\\{the_union = \\{an_int = 0x2a, a_char = 0x2a\\}\\}"
+      "\\{the_union = \\{an_int = 0x2a2a2a2a, a_char = 0x2a\\}\\}"
     check_format_string "an_enum" $opts \
       "0x1"
     check_format_string "a_string" $opts \
@@ -851,7 +851,7 @@ proc test_format {} {
       $decimal_pointer_regexp
     check_format_string "another_point" $opts
     check_format_string "a_struct_with_union" $opts \
-      "\\{the_union = \\{an_int = 42, a_char = 42\\}\\}"
+      "\\{the_union = \\{an_int = 707406378, a_char = 42\\}\\}"
     check_format_string "an_enum" $opts \
       "1"
     check_format_string "a_string" $opts \