From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26541 invoked by alias); 8 Mar 2013 16:22:59 -0000 Received: (qmail 26511 invoked by uid 22791); 8 Mar 2013 16:22:58 -0000 X-SWARE-Spam-Status: No, hits=-7.2 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 08 Mar 2013 16:22:44 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r28GMgkD001779 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 8 Mar 2013 11:22:43 -0500 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r28GMfmo028193 for ; Fri, 8 Mar 2013 11:22:42 -0500 Subject: [RFC PATCH] hppa-hpux-tdep.c: Fix host dependency. To: gdb-patches@sourceware.org From: Pedro Alves Date: Fri, 08 Mar 2013 16:22:00 -0000 Message-ID: <20130308162241.32137.86462.stgit@brno.lan> User-Agent: StGit/0.16 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-03/txt/msg00381.txt.bz2 $ make WERROR_CFLAGS="-Wpointer-sign -Werror" hppa-hpux-tdep.o -k 2>&1 1>/dev/null ../../src/gdb/hppa-hpux-tdep.c: In function ‘hppa_hpux_push_dummy_code’: ../../src/gdb/hppa-hpux-tdep.c:1225:7: error: pointer targets in passing argument 2 of ‘write_memory’ differ in signedness [-Werror=pointer-sign] In file included from ../../src/gdb/hppa-hpux-tdep.c:22:0: ../../src/gdb/gdbcore.h:85:13: note: expected ‘const gdb_byte *’ but argument is of type ‘char *’ ../../src/gdb/hppa-hpux-tdep.c:1251:7: error: pointer targets in passing argument 2 of ‘write_memory’ differ in signedness [-Werror=pointer-sign] In file included from ../../src/gdb/hppa-hpux-tdep.c:22:0: ../../src/gdb/gdbcore.h:85:13: note: expected ‘const gdb_byte *’ but argument is of type ‘char *’ ../../src/gdb/hppa-hpux-tdep.c: In function ‘hppa_hpux_supply_save_state’: ../../src/gdb/hppa-hpux-tdep.c:1354:9: error: pointer targets in passing argument 1 of ‘extract_unsigned_integer’ differ in signedness [-Werror=pointer-sign] In file included from ../../src/gdb/hppa-hpux-tdep.c:20:0: ../../src/gdb/defs.h:675:22: note: expected ‘const gdb_byte *’ but argument is of type ‘const char *’ Casting to gdb_byte would fix it, however, writing an unsigned int array like this static unsigned int hppa64_tramp[] = { 0xeac0f000, /* bve,l (r22),%r2 */ 0x0fdf12d1, /* std r31,-8(,sp) */ 0x0fd110c2, /* ldd -8(,sp),rp */ 0xe840d002, /* bve,n (rp) */ 0x08000240 /* nop */ ... directly to target memory assumes the host endianness is the same as the target's. hppa is big endian, so I believe this patch should be correct -- it defines the array as a gdb_byte array. It uses a macro to make the insn bytes a little more readable. I thought of using write_memory_unsigned_integer once for each element of the unsigned int array, but this way keeps issuing a single target memory write / roundtrip for the whole trampoline. I have no way to test this though, other than making sure it compiles. I'm inclined to just go ahead and put it in, if nobody's up for testing it. Comments? 2013-03-08 Pedro Alves * hppa-hpux-tdep.c (hppa_hpux_push_dummy_code): Define INSN macro, use it to rewrite the trampoline buffers with type gdb_byte[], and undefine the macro. Remove char* cast. --- gdb/hppa-hpux-tdep.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c index aacb0a3..9948e9b 100644 --- a/gdb/hppa-hpux-tdep.c +++ b/gdb/hppa-hpux-tdep.c @@ -1201,17 +1201,18 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, if (IS_32BIT_TARGET (gdbarch)) { - static unsigned int hppa32_tramp[] = { - 0x0fdf1291, /* stw r31,-8(,sp) */ - 0x02c010a1, /* ldsid (,r22),r1 */ - 0x00011820, /* mtsp r1,sr0 */ - 0xe6c00000, /* be,l 0(sr0,r22),%sr0,%r31 */ - 0x081f0242, /* copy r31,rp */ - 0x0fd11082, /* ldw -8(,sp),rp */ - 0x004010a1, /* ldsid (,rp),r1 */ - 0x00011820, /* mtsp r1,sr0 */ - 0xe0400000, /* be 0(sr0,rp) */ - 0x08000240 /* nop */ +#define INSN(I1, I2, I3, I4) 0x ## I1, 0x ## I2, 0x ## I3, 0x ## I4 + static const gdb_byte hppa32_tramp[] = { + INSN(0f,df,12,91), /* stw r31,-8(,sp) */ + INSN(02,c0,10,a1), /* ldsid (,r22),r1 */ + INSN(00,01,18,20), /* mtsp r1,sr0 */ + INSN(e6,c0,00,00), /* be,l 0(sr0,r22),%sr0,%r31 */ + INSN(08,1f,02,42), /* copy r31,rp */ + INSN(0f,d1,10,82), /* ldw -8(,sp),rp */ + INSN(00,40,10,a1), /* ldsid (,rp),r1 */ + INSN(00,01,18,20), /* mtsp r1,sr0 */ + INSN(e0,40,00,00), /* be 0(sr0,rp) */ + INSN(08,00,02,40) /* nop */ }; /* for hppa32, we must call the function through a stub so that on @@ -1222,7 +1223,7 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, "(no import stub).\n")); regcache_cooked_write_unsigned (regcache, 22, stubaddr); - write_memory (sp, (char *)&hppa32_tramp, sizeof (hppa32_tramp)); + write_memory (sp, hppa32_tramp, sizeof (hppa32_tramp)); *bp_addr = hppa_hpux_find_dummy_bpaddr (pc); regcache_cooked_write_unsigned (regcache, 31, *bp_addr); @@ -1237,18 +1238,19 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, } else { - static unsigned int hppa64_tramp[] = { - 0xeac0f000, /* bve,l (r22),%r2 */ - 0x0fdf12d1, /* std r31,-8(,sp) */ - 0x0fd110c2, /* ldd -8(,sp),rp */ - 0xe840d002, /* bve,n (rp) */ - 0x08000240 /* nop */ + static const gdb_byte hppa64_tramp[] = { + INSN(ea,c0,f0,00), /* bve,l (r22),%r2 */ + INSN(0f,df,12,d1), /* std r31,-8(,sp) */ + INSN(0f,d1,10,c2), /* ldd -8(,sp),rp */ + INSN(e8,40,d0,02), /* bve,n (rp) */ + INSN(08,00,02,40) /* nop */ }; +#undef INSN /* for hppa64, we don't need to call through a stub; all functions return via a bve. */ regcache_cooked_write_unsigned (regcache, 22, funcaddr); - write_memory (sp, (char *)&hppa64_tramp, sizeof (hppa64_tramp)); + write_memory (sp, hppa64_tramp, sizeof (hppa64_tramp)); *bp_addr = pc - 4; regcache_cooked_write_unsigned (regcache, 31, *bp_addr);