This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: RFC: Optimization to write_register_bytes()


We had a long thread on this that end up turning in what we are doing in
the future to improve the API etc.

Somehow the down to Earth patch below was forgotten, and without this the
code to show MMX registers does not work.

Can I check it in?

Thanks,
Fernando



Fernando Nasser wrote:
> 
> Andrew Cagney wrote:
> >
> (...) Register fix plan skipped
> >
> > PS: Fernando, sorry to hit you with this as a response.  You're simply
> > the latest in a long list of people (me included) that have had to
> > wrestle with the current register-cache design.  For as long as I can
> > remember people have been comming to grief with this code (just changing
> > REGISTER_NAMES[] to REGISTER_NAME() was a radical breakthrough :-).  I
> > would really like to set out something that is going to finally fix the
> > problem.
> 
> No problem.  I agree with you that all this code needs a redesign and I
> believe the answer is some abstraction as you described.  It is a good thing to add it to the TODO
> list so we eventually get someone to implement it.
> 
> Unfortunately I won't be able to work on this at this time, but I still want/need to have the MMX
> registers available as soon as possible.  And adding the few lines below would allow me to do that
> very easily.
> 
> Fernando
> 
> Index: findvar.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/findvar.c,v
> retrieving revision 1.9
> diff -c -p -r1.9 findvar.c
> *** findvar.c   2000/04/27 15:33:01     1.9
> --- findvar.c   2000/05/05 07:58:51
> *************** write_register_bytes (myregstart, myaddr
> *** 829,840 ****
>     int regno;
> 
>     target_prepare_to_store ();
> 
>     /* Scan through the registers updating any that are covered by the range
>        myregstart<=>myregend using write_register_gen, which does nice things
>        like handling threads, and avoiding updates when the new and old contents
> !      are the same.  */
> 
>     for (regno = 0; regno < NUM_REGS; regno++)
>       {
>         int regstart, regend;
> --- 829,846 ----
>     int regno;
> 
>     target_prepare_to_store ();
> +
> 
>     /* Scan through the registers updating any that are covered by the range
>        myregstart<=>myregend using write_register_gen, which does nice things
>        like handling threads, and avoiding updates when the new and old contents
> !      are the same.
> 
> +      We only update a contiguous range of registers, stopping when the
> +      byte at myregend is written.  This avoids writting to aliased registers
> +      twice (note that aliased register numbers must be higher than the
> +      real registers they share memory with).  */
> +
>     for (regno = 0; regno < NUM_REGS; regno++)
>       {
>         int regstart, regend;
> *************** write_register_bytes (myregstart, myaddr
> *** 848,854 ****
> 
>         /* Is this register completely within the range the user is writing?  */
>         else if (myregstart <= regstart && regend <= myregend)
> !       write_register_gen (regno, myaddr + (regstart - myregstart));
> 
>         /* The register partially overlaps the range being written.  */
>         else
> --- 854,864 ----
> 
>         /* Is this register completely within the range the user is writing?  */
>         else if (myregstart <= regstart && regend <= myregend)
> !         {
> !         write_register_gen (regno, myaddr + (regstart - myregstart));
> !         if (regend >= myregend)
> !           break;
> !         }
> 
>         /* The register partially overlaps the range being written.  */
>         else
> *************** write_register_bytes (myregstart, myaddr
> *** 868,873 ****
> --- 878,886 ----
>                   overlapend - overlapstart);
> 
>           target_store_registers (regno);
> +
> +         if (regend >= myregend)
> +           break;
>         }
>       }
>   }
> 

-- 
Fernando Nasser
Cygnus Solutions (a Red Hat company)    E-Mail:  fnasser@cygnus.com
2323 Yonge Street, Suite #300           Tel:  416-482-2661 ext. 311
Toronto, Ontario   M4P 2C9              Fax:  416-482-6299

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]