RFC: patch to refresh prev_pc

J. Johnston jjohnstn@redhat.com
Wed May 7 18:37:00 GMT 2003


Andrew Cagney wrote:
>> The following patch solves a problem on the ia64.  The problem
>> exists because of a generic problem to reset the prev_pc value
>> after an inferior function call or after a return command.
>>
>> Because the value is not properly set, the line number used to
>> initialize the ecs is incorrect.  On the ia64 this causes a problem
>> because there are extraneous linetable entries generated by the compiler
>> that are within the line (i.e. they don't change the line number).
>> When we apply "next" logic which uses the ecs line number, we end up 
>> stopping
>> at the first line table entry past our start position.  This often ends
>> up being just a few insns farther in the same line.  A specific example
>> of this problem is the next to 1237 test inside call-ar-st.exp.  An
>> inferior call is made on line 1236 and upon return we issue a next.
>>
>> I discussed this topic on the gdb forum and a number of attempts were
>> made to ensure the prev_pc value was up to date in 
>> init_execution_control_state()
>> in infrun.c.  Those attempts failed because the inferior was not 
>> guaranteed to
>> be stopped and so we weren't guaranteed that a ptrace to fetch the pc 
>> would work.
>>
>> This patch attempts to refresh the prev_pc value just before resuming 
>> in proceed().
>> It works for the ia64 problems cited above and also I have tested it 
>> on the x86.
>>
>> Is this patch ok?
> 
> 
> Yes, definitly a better strategy.  Two some tweaks:
> 
> - That new single line assignment needs some sort of big jucy 
> stand-alone comment that explains the rationale for the change, mention 
> where it was before, and where else was tried (and why both failed). The 
> more details the better, but something based on the above would do the 
> trick.
> 
> - the old (now redundant) code in stop_stepping vis:
> 
>   if (target_has_execution)
>     {
>       /* Assuming the inferior still exists, set these up for next
>          time, just like we did above if we didn't break out of the
>          loop.  */
>       prev_pc = read_pc ();
>     }
> 
> should be deleted (but check that it really does still work).
> 
> With those changes made, consider it approved.
> 

Revised patch checked in.  Thanks.

-- Jeff J.

2003-05-07  Jeff Johnston  <jjohnstn@redhat.com>

         * infrun.c (prev_pc): Move declaration ahead of proceed().
         (proceed): Refresh prev_pc value before resuming.
         (stop_stepping): Remove code to refresh prev_pc.

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: infrun.patch
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20030507/5f1a3caf/attachment.ksh>


More information about the Gdb-patches mailing list