Hi Ulrich, Please find attached the new patch. See 0001-Fix-call-functions-command-bug-in-64-bit-programs.patch. >It might not really be necessary to handle pointer and reference >types if those are always guaranteed to be word sized. But I >think enum, bool, and char types should be handled. You were right. Thank you for pointing out. I have attached the outputs below. It works fine now. >Also, it would probably be preferable to use reg_size instead >of tdep->wordsize to be consistent. This is changed.. >Finally, there are still white space issues (use tabs instead >of 8 spaces, if there's just a single statement inside an if >it is indented only 2 spaces, not 4). I took care of it. Kindly check.. If all is fine, kindly push this patch to the community. Let me know in case I missed something otherwise. Have a nice day ahead. Thanks and regards, Aditya. -------------------------------- PROGRAM #include "stdio.h" #include enum week {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} w; int num2print(long num, float num2, int num3, double num4, enum week w, char c1, bool b1, char *mystring) { printf("R%ld\n",num); printf("R%f\n",num2); printf("R%d\n",num3); printf("R%lf\n",num4); printf ("Day number passed is %d\n",w); printf ("R%c\n", c1); printf ("R%d\n", b1); printf ("FIFA winner is %s \n", mystring); return num; } int main(int argc, char** argv) { enum week today = Wednesday; char fifaWinner[] = "Germany"; bool x = false; printf("Hi Bangalore %x\n",num2print(27, 16, 13, 9.9, today, 'a', x, fifaWinner)); return 0; } -------------------------------------- 32 bit output before patch.. Reading symbols from /home/XYZ/gdb_tests... (gdb) b main Breakpoint 1 at 0x1000067c: file /home/XYZ/gdb_tests.c, line 19. (gdb) r Starting program: /home/XYZ/gdb_tests Breakpoint 1, main (argc=1, argv=0x2ff22bf0) at /home/aditya/XYZ.c:19 19 enum week today = Wednesday; (gdb) n 20 char fifaWinner[] = "Germany"; (gdb) 21 bool x = false; (gdb) call num2print $1 = {int (long, float, int, double, enum week, char, _Bool, char *)} 0x10000518 (gdb) call num2print (2, 3.4, 5, 6.7, Wednesday, 'c', 1, fifaWinner) R2 R3.400000 R5 R6.700000 Day number passed is 3 Rc R1 FIFA winner is Germany warning: (Internal error: pc 0x10000290 in read in psymtab, but not in symtab.) $2 = 2 ----------------------------------------------------------- 64 bit output before patch Reading symbols from /home/XYZ/gdb_tests... (gdb) b main Breakpoint 1 at 0x10000818: file /home/XYZ/gdb_tests.c, line 19. (gdb) r Starting program: /home/XYZ/gdb_tests BFD: /usr/lib/libc.a(/usr/lib/libc.a(shr_64.o)): wrong auxtype 0xff for storage class 0x2 BFD: /usr/lib/libc.a(/usr/lib/libc.a(shr_64.o)): wrong auxtype 0xff for storage class 0x6b Breakpoint 1, main (argc=1, argv=0xffffffffffffad0) at /home/XYZ/gdb_tests.c:19 19 enum week today = Wednesday; (gdb) n 20 char fifaWinner[] = "Germany"; (gdb) 21 bool x = false; (gdb) call num2print (2, 3.4, 5, 6.7, Wednesday, 'c', 1, fifaWinner) R2 R3.400000 R0 R6.700000 Day number passed is 0 R R0 FIFA winner is Germany $1 = 2 (gdb) ------------------------------------------------------------------------- 32-bit output after patch Reading symbols from /home/XYZ/gdb_tests... (gdb) b main Breakpoint 1 at 0x1000067c: file /home/XYZ/gdb_tests.c, line 19. (gdb) r Starting program: /home/XYZ/gdb_tests Breakpoint 1, main (argc=1, argv=0x2ff22bf0) at /home/XYZ/gdb_tests.c:19 19 enum week today = Wednesday; (gdb) n 20 char fifaWinner[] = "Germany"; (gdb) 21 bool x = false; (gdb) call num2print (2, 3.4, 5, 6.7, Wednesday, 'c', 1, fifaWinner) R2 R3.400000 R5 R6.700000 Day number passed is 3 Rc R1 FIFA winner is Germany $1 = 2 (gdb) ----------------------------------------------------- 64-bit output after patch Reading symbols from /home/XYZ/gdb_tests... (gdb) b main Breakpoint 1 at 0x10000818: file /home/XYZ/gdb_tests.c, line 19. (gdb) r Starting program: /home/XYZ/gdb_tests BFD: /usr/lib/libc.a(/usr/lib/libc.a(shr_64.o)): wrong auxtype 0xff for storage class 0x2 BFD: /usr/lib/libc.a(/usr/lib/libc.a(shr_64.o)): wrong auxtype 0xff for storage class 0x6b Breakpoint 1, main (argc=1, argv=0xffffffffffffad0) at /home/XYZ/gdb_tests.c:19 19 enum week today = Wednesday; (gdb) n 20 char fifaWinner[] = "Germany"; (gdb) n 21 bool x = false; (gdb) call num2print (2, 3.4, 5, 6.7, Wednesday, 'c', 1, fifaWinner) R2 R3.400000 R5 R6.700000 Day number passed is 3 Rc R1 FIFA winner is Germany $1 = 2 (gdb) call num2print (2, 3.4, 5, 6.7, Wednesday, 'e', 0, fifaWinner) R2 R3.400000 R5 R6.700000 Day number passed is 3 Re R0 FIFA winner is Germany warning: (Internal error: pc 0x100000480 in read in psymtab, but not in symtab.) $2 = 2 (gdb) ________________________________ From: Ulrich Weigand Sent: 16 November 2022 20:45 To: gdb-patches@sourceware.org ; Aditya Kamath1 ; simon.marchi@efficios.com Cc: Sangamesh Mallayya ; Sanket Rathi Subject: Re: [PATCH] Fix call functions command bug in 64-bit programs for AIX Aditya Kamath1 wrote: >In AIX for 64-bit programs, we need to zero extend variables of integer data type. This looks much more reasonable, thanks! Just a couple of remaining questions: > memset (word, 0, reg_size); >- memcpy (word, value_contents (arg).data (), len); >+ if (type->code () == TYPE_CODE_INT) >+ /* Sign or zero extend the "int" into a "word". */ >+ store_unsigned_integer (word, tdep->wordsize, 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); Is it correct to handle *only* TYPE_CODE_INT here? The corresponding code in the Linux ABI code has: else if ((type->code () == TYPE_CODE_INT || type->code () == TYPE_CODE_ENUM || type->code () == TYPE_CODE_BOOL || type->code () == TYPE_CODE_CHAR || type->code () == TYPE_CODE_PTR || TYPE_IS_REFERENCE (type)) It might not really be necessary to handle pointer and reference types if those are always guaranteed to be word sized. But I think enum, bool, and char types should be handled. Also, it would probably be preferable to use reg_size instead of tdep->wordsize to be consistent. Finally, there are still white space issues (use tabs instead of 8 spaces, if there's just a single statement inside an if it is indented only 2 spaces, not 4). Bye, Ulrich