From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13792 invoked by alias); 24 Apr 2002 03:41:36 -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 13785 invoked from network); 24 Apr 2002 03:41:35 -0000 Received: from unknown (HELO igw3.watson.ibm.com) (198.81.209.18) by sources.redhat.com with SMTP; 24 Apr 2002 03:41:35 -0000 Received: from sp1n293en1.watson.ibm.com (sp1n293en1.watson.ibm.com [9.2.112.57]) by igw3.watson.ibm.com (8.11.4/8.11.4) with ESMTP id g3O3fYQ23538 for ; Tue, 23 Apr 2002 23:41:34 -0400 Received: from makai.watson.ibm.com (makai.watson.ibm.com [9.2.216.144]) by sp1n293en1.watson.ibm.com (8.11.4/8.11.4) with ESMTP id g3O3fYd27592 for ; Tue, 23 Apr 2002 23:41:34 -0400 Received: from watson.ibm.com (localhost [127.0.0.1]) by makai.watson.ibm.com (AIX4.3/8.9.3/8.9.3/01-10-2000) with ESMTP id XAA30704 for ; Tue, 23 Apr 2002 23:41:34 -0400 Message-Id: <200204240341.XAA30704@makai.watson.ibm.com> To: gdb-patches@sources.redhat.com Subject: PowerPC64 skip_prologue patch Date: Tue, 23 Apr 2002 20:41:00 -0000 From: David Edelsohn X-SW-Source: 2002-04/txt/msg00901.txt.bz2 What is the status of the PowerPC64 skip_prologue patch? Without this patch, GDB does not recognize standard PowerPC64 prologue instructions which makes debugging very difficult. Thanks, David diff -Naur -X Diffs/diffX binGDB.orig/gdb/rs6000-tdep.c binGDB/gdb/rs6000-tdep.c --- binGDB.orig/gdb/rs6000-tdep.c Wed Feb 27 12:24:06 2002 +++ binGDB/gdb/rs6000-tdep.c Wed Mar 6 12:48:10 2002 @@ -444,6 +438,7 @@ int minimal_toc_loaded = 0; int prev_insn_was_prologue_insn = 1; int num_skip_non_prologue_insns = 0; + int wordsize = TDEP->wordsize; /* Attempt to find the end of the prologue when no limit is specified. Note that refine_prologue_limit() has been written so that it may @@ -489,13 +484,13 @@ if ((op & 0xfc1fffff) == 0x7c0802a6) { /* mflr Rx */ - lr_reg = (op & 0x03e00000) | 0x90010000; + lr_reg = (op & 0x03e00000); continue; } else if ((op & 0xfc1fffff) == 0x7c000026) { /* mfcr Rx */ - cr_reg = (op & 0x03e00000) | 0x90010000; + cr_reg = (op & 0x03e00000); continue; } @@ -521,7 +516,7 @@ { fdata->saved_gpr = reg; if ((op & 0xfc1f0003) == 0xf8010000) - op = (op >> 1) << 1; + op &= ~3UL; fdata->gpr_offset = SIGNED_SHORT (op) + offset; } continue; @@ -553,19 +548,49 @@ continue; } - else if (lr_reg != -1 && (op & 0xffff0000) == lr_reg) - { /* st Rx,NUM(r1) - where Rx == lr */ - fdata->lr_offset = SIGNED_SHORT (op) + offset; + else if (lr_reg != -1 && + /* std Rx || stdu Rx */ + (((op & 0xffff0000) == (lr_reg | 0xf8010000)) || + /* stw Rx */ + ((op & 0xffff0000) == (lr_reg | 0x90010000)) || + /* stwu Rx */ + ((op & 0xffff0000) == (lr_reg | 0x94010000)))) + { /* where Rx == lr */ + fdata->lr_offset = offset; fdata->nosavedpc = 0; lr_reg = 0; + if ((op & 0xfc000003) == 0xf8000000 || /* std Rx */ + (op & 0xfc000000) == 0x90000000) /* stw Rx */ + { + /* does not update r1 add d to lr_offset */ + fdata->lr_offset = SIGNED_SHORT (op); + } continue; } - else if (cr_reg != -1 && (op & 0xffff0000) == cr_reg) - { /* st Rx,NUM(r1) + else if (cr_reg != -1 && + /* std Rx || stdu Rx */ + (((op & 0xffff0000) == (cr_reg | 0xf8010000)) || + /* stw Rx */ + ((op & 0xffff0000) == (cr_reg | 0x90010000)) || + /* stwu Rx */ + ((op & 0xffff0000) == (cr_reg | 0x94010000)))) + { /* where Rx == cr */ + fdata->cr_offset = offset; + cr_reg = 0; + if ((op & 0xfc000003) == 0xf8000000 || + (op & 0xfc000000) == 0x90000000) + { + /* does not update r1 add d to cr_offset */ + fdata->cr_offset += SIGNED_SHORT (op); + } + continue; + + } + else if (cr_reg != -1 && (op & 0xffff0003) == cr_reg) + { /* std Rx,NUM(r1) || stdu Rx,NUM(r1) where Rx == cr */ - fdata->cr_offset = SIGNED_SHORT (op) + offset; + fdata->cr_offset = SIGNED_SHORT (op & ~3UL) + offset; cr_reg = 0; continue; @@ -619,30 +644,41 @@ this branch */ continue; - /* update stack pointer */ } - else if ((op & 0xffff0000) == 0x94210000 || /* stu r1,NUM(r1) */ - (op & 0xffff0003) == 0xf8210001) /* stdu r1,NUM(r1) */ - { + /* update stack pointer */ + else if ((op & 0xfc1f0000) == 0x94010000) + { /* stu rX,NUM(r1) || stwu rX,NUM(r1) */ fdata->frameless = 0; - if ((op & 0xffff0003) == 0xf8210001) - op = (op >> 1) << 1; fdata->offset = SIGNED_SHORT (op); offset = fdata->offset; continue; - } - else if (op == 0x7c21016e) - { /* stwux 1,1,0 */ + else if ((op & 0xfc1f016a) == 0x7c01016e) + { /* stwux rX,r1,rY */ + /* no way to figure out what r1 is going to be */ fdata->frameless = 0; offset = fdata->offset; continue; - - /* Load up minimal toc pointer */ } - else if ((op >> 22) == 0x20f + else if ((op & 0xfc1f0003) == 0xf8010001) + { /* stdu rX,NUM(r1) */ + fdata->frameless = 0; + fdata->offset = SIGNED_SHORT (op & ~3UL); + offset = fdata->offset; + continue; + } + else if ((op & 0xfc1f016a) == 0x7c01016a) + { /* stdux rX,r1,rY */ + /* no way to figure out what r1 is going to be */ + fdata->frameless = 0; + offset = fdata->offset; + continue; + } + /* Load up minimal toc pointer */ + else if (((op >> 22) == 0x20f || /* l r31,... or l r30,... */ + (op >> 22) == 0x3af) /* ld r31,... or ld r30,... */ && !minimal_toc_loaded) - { /* l r31,... or l r30,... */ + { minimal_toc_loaded = 1; continue; @@ -842,9 +878,6 @@ int nargs, struct value **args, struct type *type, int gcc_p) { -#define TOC_ADDR_OFFSET 20 -#define TARGET_ADDR_OFFSET 28 - int ii; CORE_ADDR target_addr; @@ -975,7 +1008,8 @@ ran_out_of_registers_for_arguments: saved_sp = read_sp (); -#ifndef ELF_OBJECT_FORMAT + +#if !defined (ELF_OBJECT_FORMAT) || defined (ELF64_OBJECT_FORMAT) /* location for 8 parameters are always reserved. */ sp -= wordsize * 8; @@ -984,7 +1018,7 @@ /* stack pointer must be quadword aligned */ sp &= -16; -#endif +#endif /* ! ELF_OBJECT_FORMAT || ELF64_OBJECT_FORMAT */ /* if there are more arguments, allocate space for them in the stack, then push them starting from the ninth one. */ @@ -1284,6 +1318,16 @@ if (fi->next->signal_handler_caller) return read_memory_addr (fi->next->frame + SIG_FRAME_LR_OFFSET, wordsize); + else if (wordsize == 8) + { + /* FIXME: If this is ever called, cause skip prologue should + get it right, then on a 64-bit target DEFAULT_LR_SAVE is + different (should be 16 not 8), if target is 32 bits then + we let the definition decide since it is ABI + dependent. */ + return read_memory_addr (FRAME_CHAIN (fi) + 16, + wordsize); + } else return read_memory_addr (FRAME_CHAIN (fi) + DEFAULT_LR_SAVE, wordsize);