Fix call functions command bug in 64 bits programs for AIX
authorAditya Vidyadhar Kamath <Aditya.Kamath1@ibm.com>
Thu, 17 Nov 2022 12:50:35 +0000 (13:50 +0100)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Thu, 17 Nov 2022 12:51:37 +0000 (13:51 +0100)
In AIX for 64 bit programs we need to zero extend variables
of integer or enum or char data type.

Otherwise a zero will get dumped in the register as we memset
our word to 0 and we copy non zero extended contents to the cache.

gdb/rs6000-aix-tdep.c

index d47974b51d1843c8100dfb82e6ce06441ab5bf18..3efafbd10abf3575b04d94cb3cd5a78117880388 100644 (file)
@@ -400,7 +400,15 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
          gdb_byte word[PPC_MAX_REGISTER_SIZE];
 
          memset (word, 0, reg_size);
-         memcpy (word, value_contents (arg).data (), len);
+         if (type->code () == TYPE_CODE_INT
+            || type->code () == TYPE_CODE_ENUM
+            || type->code () == TYPE_CODE_BOOL
+            || type->code () == TYPE_CODE_CHAR)
+           /* Sign or zero extend the "int" into a "word".  */
+           store_unsigned_integer (word, reg_size, byte_order,
+                                   unpack_long (type, value_contents (arg).data ()));
+         else
+           memcpy (word, value_contents (arg).data (), len);
          regcache->cooked_write (tdep->ppc_gp0_regnum + 3 +ii, word);
        }
       ++argno;