From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16397 invoked by alias); 16 Jan 2004 03:54:04 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 16083 invoked from network); 16 Jan 2004 03:54:03 -0000 Received: from unknown (HELO nevyn.them.org) (66.93.172.17) by sources.redhat.com with SMTP; 16 Jan 2004 03:54:03 -0000 Received: from drow by nevyn.them.org with local (Exim 4.30 #1 (Debian)) id 1AhL3a-0002kn-Ty; Thu, 15 Jan 2004 22:54:02 -0500 Date: Fri, 16 Jan 2004 03:54:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sources.redhat.com Cc: rearnsha@arm.com Subject: RFA/ARM: Switch mode when setting PC Message-ID: <20040116035402.GA3215@nevyn.them.org> Mail-Followup-To: gdb-patches@sources.redhat.com, rearnsha@arm.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.1i X-SW-Source: 2004-01/txt/msg00405.txt.bz2 This patch fixes several failures in virtfunc.exp for arm-sim/-mthumb. The problem is that the non-virtual thunk for pDe->vg() is emitted in ARM mode and called via _call_via_r2. But the rest of the program is Thumb mode, and nothing tells the simulator (or target; I haven't tested this on hardware yet but I expect the same result) to switch to ARM. So it gets very confused. This is somewhat suboptimal in that if you want, for some reason, to call something marked as an ARM function with Thumb mode enabled you will have to set $ps yourself _after_ setting $pc. I think it's still a good idea, though. OK? -- Daniel Jacobowitz MontaVista Software Debian GNU/Linux Developer 2004-01-15 Daniel Jacobowitz * arm-tdep.c (arm_write_pc): New function. (arm_gdbarch_init): Call set_gdbarch_write_pc. Index: arm-tdep.c =================================================================== RCS file: /big/fsf/rsync/src-cvs/src/gdb/arm-tdep.c,v retrieving revision 1.156 diff -u -p -r1.156 arm-tdep.c --- arm-tdep.c 13 Jan 2004 21:38:45 -0000 1.156 +++ arm-tdep.c 16 Jan 2004 03:37:46 -0000 @@ -2689,6 +2689,21 @@ arm_coff_make_msymbol_special(int val, s MSYMBOL_SET_SPECIAL (msym); } +static void +arm_write_pc (CORE_ADDR pc, ptid_t ptid) +{ + write_register_pid (ARM_PC_REGNUM, pc, ptid); + + /* If necessary, set the T bit. */ + if (arm_apcs_32) + { + CORE_ADDR val = read_register_pid (ARM_PS_REGNUM, ptid); + if (arm_pc_is_thumb (pc)) + write_register_pid (ARM_PS_REGNUM, val | 0x20, ptid); + else + write_register_pid (ARM_PS_REGNUM, val & ~(CORE_ADDR) 0x20, ptid); + } +} static enum gdb_osabi arm_elf_osabi_sniffer (bfd *abfd) @@ -2850,6 +2865,8 @@ arm_gdbarch_init (struct gdbarch_info in set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, 0); set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call); + + set_gdbarch_write_pc (gdbarch, arm_write_pc); /* Frame handling. */ set_gdbarch_unwind_dummy_id (gdbarch, arm_unwind_dummy_id);