Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Re: [RFC] Notes on QUIT and STREQ et.al.
       [not found] <38CCC819.1071F28E@cygnus.com>
@ 2000-03-13  8:28 ` Kevin Buettner
  2000-03-13 11:50   ` J.T. Conklin
  2000-04-01  0:00 ` Andrew Cagney
       [not found] ` <5m1z5emy7b.fsf@jtc.redbacknetworks.com>
  2 siblings, 1 reply; 5+ messages in thread
From: Kevin Buettner @ 2000-03-13  8:28 UTC (permalink / raw)
  To: Andrew Cagney, GDB Patches

On Mar 13,  9:51pm, Andrew Cagney wrote:

> The attatched spells out the long term prospects of both STREQ et.al.
> and QUIT.
> Look OK to everyone?

[...]

>   /* Gdb does *lots* of string compares.  Use macros to speed them up by
>      avoiding function calls if the first characters are not the same. */
>   
> + /* NOTE: cagney/2000-03-13: There is no reason for using these macros
> +    in new code (which is just short of marking them as deprecated).
> +    While old code can continue to refer to them, new code is better
> +    off using the more familar strcmp(). */
> + 
>   #define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
>   #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
>   #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)

I haven't looked to see how often (or where) STREQ and STRCMP are
used, but these macros compare the first characters inline in an
attempt to improve performance.  Have you assessed the benefits of
doing this?  (If these optimizations significantly improve
performance, I think they should stay.)

It seems to me that a decent STREQ macro should also test to see
if the pointers are equal.  I.e,

   #define STREQ(a,b) ((a == b) || (*(a) == *(b) ? !strcmp ((a), (b)) : 0))

Kevin
From dan@cgsoftware.com Mon Mar 13 08:52:00 2000
From: Daniel Berlin <dan@cgsoftware.com>
To: Kevin Buettner <kevinb@cygnus.com>
Cc: Andrew Cagney <ac131313@cygnus.com>, GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: [RFC] Notes on QUIT and STREQ et.al.
Date: Mon, 13 Mar 2000 08:52:00 -0000
Message-id: <Pine.LNX.4.10.10003130829420.6968-100000@localhost.localdomain>
References: <1000313162754.ZM28984@ocotillo.lan>
X-SW-Source: 2000-03/msg00231.html
Content-length: 631

> 
> I haven't looked to see how often (or where) STREQ and STRCMP are
> used, but these macros compare the first characters inline in an
> attempt to improve performance.  Have you assessed the benefits of
> doing this?  (If these optimizations significantly improve
> performance, I think they should stay.)

 I'll check out the performance.
I know GCC has a strlen expander, but no strcmp expander, so it might be a
benefit.


> 
> It seems to me that a decent STREQ macro should also test to see
> if the pointers are equal.  I.e,
> 
>    #define STREQ(a,b) ((a == b) || (*(a) == *(b) ? !strcmp ((a), (b)) : 0))
> 
> Kevin
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] Notes on QUIT and STREQ et.al.
  2000-03-13  8:28 ` [RFC] Notes on QUIT and STREQ et.al Kevin Buettner
@ 2000-03-13 11:50   ` J.T. Conklin
  0 siblings, 0 replies; 5+ messages in thread
From: J.T. Conklin @ 2000-03-13 11:50 UTC (permalink / raw)
  To: Kevin Buettner; +Cc: Andrew Cagney, GDB Patches

>>>>> "Kevin" == Kevin Buettner <kevinb@cygnus.com> writes:
Kevin> I haven't looked to see how often (or where) STREQ and STRCMP are
Kevin> used, but these macros compare the first characters inline in an
Kevin> attempt to improve performance.  Have you assessed the benefits of
Kevin> doing this?  (If these optimizations significantly improve
Kevin> performance, I think they should stay.)

I've found attempts to increase performance don't always accomplish
what they set out to do.  Testing the first characters inline avoids
function call overhead at the expense of increased code size.  If it
ends up thrashing the icache, overall performance could actually
signifcantly decrease.

Kevin> It seems to me that a decent STREQ macro should also test to see
Kevin> if the pointers are equal.  I.e,
Kevin>
Kevin>    #define STREQ(a,b) ((a == b) || (*(a) == *(b) ? !strcmp ((a), (b)) : 0))

Only if you expect that comparing identical strings has a high likelyhood.

        --jtc

-- 
J.T. Conklin
RedBack Networks
From jtc@redback.com Mon Mar 13 12:06:00 2000
From: jtc@redback.com (J.T. Conklin)
To: Andrew Cagney <ac131313@cygnus.com>
Cc: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: [RFC] Notes on QUIT and STREQ et.al.
Date: Mon, 13 Mar 2000 12:06:00 -0000
Message-id: <5m1z5emy7b.fsf@jtc.redbacknetworks.com>
References: <38CCC819.1071F28E@cygnus.com>
X-SW-Source: 2000-03/msg00237.html
Content-length: 814

>>>>> "Andrew" == Andrew Cagney <ac131313@cygnus.com> writes:
Andrew> Look OK to everyone?

Fine with me.

In fact, I've wondered to myself whether the performance improvement
(or reduction, it's not clear that these types of optimizations will
pay off) justified the existance of the STR*() macros.  I suspect that
some of the assumptions have been invalidated since they were written.
Function call overhead isn't as bad on modern processors as it was on
the VAX and 68020, compilers can recognize str*() and emit their own
inline versions, etc.

Even if the testing the first character does have a modest performance
improvement, I'd rather that whenever a performance issue is found that
we spend the effort on algorithmic optimizations than micro-optimizing.

        --jtc

-- 
J.T. Conklin
RedBack Networks
From jtc@redback.com Mon Mar 13 12:13:00 2000
From: jtc@redback.com (J.T. Conklin)
To: Daniel Berlin <dan@cgsoftware.com>
Cc: Kevin Buettner <kevinb@cygnus.com>, Andrew Cagney <ac131313@cygnus.com>, GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: [RFC] Notes on QUIT and STREQ et.al.
Date: Mon, 13 Mar 2000 12:13:00 -0000
Message-id: <5mwvn6ljbd.fsf@jtc.redbacknetworks.com>
References: <Pine.LNX.4.10.10003130829420.6968-100000@localhost.localdomain>
X-SW-Source: 2000-03/msg00238.html
Content-length: 640

>>>>> "Daniel" == Daniel Berlin <dan@cgsoftware.com> writes:

>> 
>> I haven't looked to see how often (or where) STREQ and STRCMP are
>> used, but these macros compare the first characters inline in an
>> attempt to improve performance.  Have you assessed the benefits of
>> doing this?  (If these optimizations significantly improve
>> performance, I think they should stay.)

Daniel> I'll check out the performance.  I know GCC has a strlen
Daniel> expander, but no strcmp expander, so it might be a benefit.

I thought that GCC can expand strcmp() if the target has a cmpstrsi
pattern.

        --jtc

-- 
J.T. Conklin
RedBack Networks
From ac131313@cygnus.com Mon Mar 13 15:55:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: Jim Kingdon <kingdon@redhat.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [RFC] Notes on QUIT and STREQ et.al.
Date: Mon, 13 Mar 2000 15:55:00 -0000
Message-id: <38CD7F9E.206D9351@cygnus.com>
References: <200003131412.PAA16094@landau.wins.uva.nl> <b4saaq07p.fsf@rtl.cygnus.com>
X-SW-Source: 2000-03/msg00239.html
Content-length: 938

Jim Kingdon wrote:

> > I'm not sure if we want STREQ to go.  I think that `STREQ (a, b)' is
> > both easier to read and easier to type than `strcmp (a, b) == 0'.
> 
> Well, perhaps it is because I have gotten used to the strcmp == 0
> idiom, but I find it to be pretty annoying to have to look up a macro
> like this (sure, it _probably_ is defined in the obvious way, but you
> don't know that for sure when digging into a new program).  Granted
> strcmp == 0 is hard to understand until/unless you know the standard C
> library well enough for it to be second nature.

Well I personally prefer the forms:

	strcmp() == 0 (read: strcmp () equal)
and	strcmp() != 0 (read: strcmp () not-equal)

over ``strcmp()'' and ``!strcmp()'' as they offer a queue to the
programer but even then that style isn't a requirement.

Like you, the one I don't trust is STREQ().  I'm never 100% certain what
that macro is doing behind my back :-)

	Andrew
From ac131313@cygnus.com Mon Mar 13 15:59:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: jtc@redback.com
Cc: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: [RFC] Notes on QUIT and STREQ et.al.
Date: Mon, 13 Mar 2000 15:59:00 -0000
Message-id: <38CD809E.86938653@cygnus.com>
References: <38CCC819.1071F28E@cygnus.com> <5m1z5emy7b.fsf@jtc.redbacknetworks.com>
X-SW-Source: 2000-03/msg00240.html
Content-length: 285

"J.T. Conklin" wrote:

> Even if the testing the first character does have a modest performance
> improvement, I'd rather that whenever a performance issue is found that
> we spend the effort on algorithmic optimizations than micro-optimizing.

Mind if I lift this paragraph?

	Andrew
From ac131313@cygnus.com Mon Mar 13 16:51:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: "H . J . Lu" <hjl@valinux.com>
Cc: binutils@sourceware.cygnus.com, egcs-patches@egcs.cygnus.com, GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: A patch for toplevel Makefile.in
Date: Mon, 13 Mar 2000 16:51:00 -0000
Message-id: <38CD8CF3.CA81E01@cygnus.com>
References: <20000310125542.A6624@valinux.com>
X-SW-Source: 2000-03/msg00241.html
Content-length: 446

"H . J . Lu" wrote:
> 
> Hi,
> 
> I checked in the patch enclosed here into binutils. The detailed
> discussions can be found at
> 
> http://sourceware.cygnus.com/ml/binutils/2000-03/msg00116.html
> http://sourceware.cygnus.com/ml/binutils/2000-03/msg00133.html
> 
> and their followups. I suggest gcc should also consider this patch.

(To flog a dead horse...)
Please cross post this sort of change to
gdb-patches@sourceware.cygnus.com

	Andrew
From shebs@apple.com Mon Mar 13 18:17:00 2000
From: Stan Shebs <shebs@apple.com>
To: Andrew Cagney <ac131313@cygnus.com>
Cc: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: [PATCH] Fix C++ overloading, add support for seeing through references.
Date: Mon, 13 Mar 2000 18:17:00 -0000
Message-id: <38CDA138.AFEA050E@apple.com>
References: <38CCBD3A.35459C1C@cygnus.com>
X-SW-Source: 2000-03/msg00242.html
Content-length: 529

Andrew Cagney wrote:
> 
> FYI,
> 
> I've committed the attatched from Daniel Berlin (except for minor
> edits).  It has a very interesting effect on the arm-elf -> arm-sim
> testsuite results:

Yup, that's why I was excited to have these changes in!  (I know, only the
geekiest of geeks would be excited about testsuite passes...)  I'd like
to vote a big thanks to Dan Berlin for doing this work - it will make
a real difference to our C++ users.

(Now we just need someone to tweak the expected testsuite results... :-) )

Stan
From dan@cgsoftware.com Mon Mar 13 18:25:00 2000
From: Daniel Berlin <dan@cgsoftware.com>
To: Fernando Nasser <fnasser@cygnus.com>
Cc: Daniel Berlin <dan@cgsoftware.com>, gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH]: add set/show debug, move gdb debugging flags into it
Date: Mon, 13 Mar 2000 18:25:00 -0000
Message-id: <1z5emgnu.fsf@dan.resnet.rochester.edu>
References: <Pine.LNX.4.10.10003130852170.6968-200000@localhost.localdomain> <38CD37F8.D1B20C40@cygnus.com>
X-SW-Source: 2000-03/msg00243.html
Content-length: 4597

Fernando Nasser <fnasser@cygnus.com> writes:

> Daniel,
> 
> Your patch is something we've been looking forward to.  In the perspective of the CLI (which I am the maintainer) I am
> eager to see it checked in.  It touches other files though, so I would rather wait for Andrew to see them overnight (his
> day).
> 
Sounds fine by me.

> However...  your patch is removing the old command formats.  I have not yet checked in David Whedon patch for
> deprecating commands (I've been *real* busy these days) so we can't
>use it yet.

Okay.
> 
> This leaves us with two choices: we wait a week or so and use David deprecating thing, or just leave the old commands
> alive for now.  In either case you would have to adjust your patch,
> I hope you don't mind.
No problem for me either way. I'm happy to adjust it.

I think it would make more sense to deprecate rather than remove, IMHO.
> 
> Thank you very much for doing this.  This "set xyxsdert$#@%$debug"
> commands were really weird.

Yeah.
I really like it much better this way.
--Dan
> 
> Best regards,
> Fernando
> 
> Daniel Berlin wrote:
> > 
> > Attached is a patch to add "set debug" and "show debug", and move the gdb
> > debugging stuff (targetdebug,expressiondebug,etc) into those lists.
> > 
> > I renamed targetdebug,expressiondebug,etc (all the debug settings i
> > moved), to remove the "debug" from their name, so you do "set debug target
> > 1" rather than "set debug targetdebug 1".
> > 
> > The new command lists are named setdebuglist/showdebuglist, and are in
> > command.c.
> > I put set_debug and show_debug into command.c, for lack of a better place.
> > The point of all this is to make it much easier to see what debugging
> > flags you can set for GDB, and what they were set to. It also declutters
> > the set list.
> > I also enabled monitordebug, since it said int he comment it was waiting
> > for "set debug".
> > 
> > I have no idea who needs to approve this, since it touches a bunch of
> > stuff, but is only related to one domain so to speak.
> > 
> > I'm working on a changelog entry,  i wanted to get comments first.
> > 
> > Example of what you get with the patch installed:
> > (gdb) help set debug
> > Generic command for setting gdb debugging flags
> > List of set debug subcommands:
> > set debug arch -- Set architecture debugging
> > set debug event -- Set event debugging
> > set debug expression -- Set expression debugging
> > set debug remote -- Set debugging of remote protocol
> > set debug serial -- Set serial debugging
> > set debug target -- Set target debugging
> > set debug varobj -- Set varobj debugging
> > Type "help set debug" followed by set debug subcommand name for full
> > documentation.
> > Command name abbreviations are allowed if unambiguous.
> > (gdb)
> > 
> > (gdb) help show debug
> > Generic command for showing gdb debugging flags
> > List of show debug subcommands:
> > show debug arch -- Show architecture debugging
> > show debug event -- Show event debugging
> > show debug expression -- Show expression debugging
> > show debug remote -- Show debugging of remote protocol
> > show debug serial -- Show serial debugging
> > show debug target -- Show target debugging
> > show debug varobj -- Show varobj debugging
> > Type "help show debug" followed by show debug subcommand name for full
> > documenta
> > tion.
> > Command name abbreviations are allowed if unambiguous.
> > (gdb)
> > (gdb) show debug
> > arch:  Architecture debugging is 0.
> > event:  Event debugging is 0.
> > expression:  Expression debugging is 0.
> > remote:  Debugging of remote protocol is 0.
> > serial:  Serial debugging is 0.
> > target:  Target debugging is 0.
> > varobj:  Varobj debugging is 0.
> > (gdb) set debug
> > "set debug" must be followed by the name of a print subcommand.
> > List of set debug subcommands:
> > set debug arch -- Set architecture debugging
> > set debug event -- Set event debugging
> > set debug expression -- Set expression debugging
> > set debug remote -- Set debugging of remote protocol
> > set debug serial -- Set serial debugging
> > set debug target -- Set target debugging
> > set debug varobj -- Set varobj debugging
> > Type "help set debug" followed by set debug subcommand name for full
> > documentati
> > on.
> > Command name abbreviations are allowed if unambiguous.
> > (gdb)
> > 
> >   ------------------------------------------------------------------------------------------------------------------------
> >                     Name: setdebug.diff
> >    setdebug.diff    Type: Plain Text (TEXT/PLAIN)
> >                 Encoding: BASE64
From ac131313@cygnus.com Mon Mar 13 18:36:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: Re: [RFC] Notes on QUIT and STREQ et.al.
Date: Mon, 13 Mar 2000 18:36:00 -0000
Message-id: <38CDA55E.6C6C3918@cygnus.com>
References: <38CCC819.1071F28E@cygnus.com>
X-SW-Source: 2000-03/msg00244.html
Content-length: 2882

Andrew Cagney wrote:
> 
> The attatched spells out the long term prospects of both STREQ et.al.
> and QUIT.

FYI, I checked in the attatched.

I resisted the temptation to rewrite the macros eliminating ``?:'' :-)
Knowing my luck, I'd firstly get it wrong and  secondly it would turn
out that some code somewhere relied on the existing behavour.

	enjoy,
		Andrew
Mon Mar 13 21:21:41 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* defs.h (STREQ, STRCMP, STREQN): Document that these macros are
 	somewhat redundant.
	(QUIT): Note that this can probably be replaced by a function.

Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.11
diff -p -r1.11 defs.h
*** defs.h	2000/03/13 07:30:00	1.11
--- defs.h	2000/03/14 02:27:37
*************** extern int core_addr_greaterthan (CORE_A
*** 117,125 ****
  #define max(a, b) ((a) > (b) ? (a) : (b))
  #endif
  
! /* Gdb does *lots* of string compares.  Use macros to speed them up by
!    avoiding function calls if the first characters are not the same. */
  
  #define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
  #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
  #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
--- 117,140 ----
  #define max(a, b) ((a) > (b) ? (a) : (b))
  #endif
  
! /* Macros to do string compares.
  
+    NOTE: cagney/2000-03-14:
+ 
+    While old code can continue to refer to these macros, new code is
+    probably better off using strcmp() directly vis: ``strcmp() == 0''
+    and ``strcmp() != 0''.
+ 
+    This is because modern compilers can directly inline strcmp()
+    making the original justification for these macros - avoid function
+    call overhead by pre-testing the first characters
+    (``*X==*Y?...:0'') - redundant.
+ 
+    ``Even if [...] testing the first character does have a modest
+    performance improvement, I'd rather that whenever a performance
+    issue is found that we spend the effort on algorithmic
+    optimizations than micro-optimizing.'' J.T. */
+ 
  #define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
  #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
  #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
*************** extern int immediate_quit;
*** 152,157 ****
--- 167,179 ----
  extern int sevenbit_strings;
  
  extern void quit (void);
+ 
+ /* FIXME: cagney/2000-03-13: It has been suggested that the peformance
+    benefits of having a ``QUIT'' macro rather than a function are
+    marginal.  If the overhead of a QUIT function call is proving
+    significant then its calling frequency should probably be reduced
+    [kingdon].  A profile analyzing the current situtation is
+    needed. */
  
  #ifdef QUIT
  /* do twice to force compiler warning */
From ac131313@cygnus.com Mon Mar 13 20:35:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: James Ingham <jingham@cygnus.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: RFA: Patch to add "auto-evaluate" variables to varobj package.
Date: Mon, 13 Mar 2000 20:35:00 -0000
Message-id: <38CDC165.1B53F521@cygnus.com>
References: <mf3dpygz5v.fsf@leda.cygnus.com>
X-SW-Source: 2000-03/msg00245.html
Content-length: 835

James Ingham wrote:
> What do you think?

Don't forget that there isn't any need to use PARAMS and K&R in new code
:-)

> *************** varobj_list (struct varobj ***varlist)
> *** 845,850 ****
> --- 863,872 ----
>      expression to see if it's changed.  Then go all the way
>      through its children, reconstructing them and noting if they've
>      changed.
> +    Return value:
> +     -1 if there was an error updating the varobj
> +     -2 if the type changed
> +     Otherwise it is the number of children + parent changed
> 
>      Only root variables can be updated... */

This is beginning to sound like something that desperately needs an
interface cleanup.
Perhaps the nr of children as an argument and an enum for the return
value.

And wow!  Going through the MI tests must have been a real ordeal!

	enjoy,
		Andrew
From ac131313@cygnus.com Mon Mar 13 21:01:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: [PATCH] Add change-log variables to more MI files
Date: Mon, 13 Mar 2000 21:01:00 -0000
Message-id: <38CDC788.D9C8FE12@cygnus.com>
X-SW-Source: 2000-03/msg00246.html
Content-length: 1269

Just FYI,

I've checked in the attatched.  It should help keep ChangeLog entries
local.

	Andrew
Tue Mar 14 15:54:57 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* basics.c: Add EMACS local variable pointing change-log at this
 	file.
	* Makefile.in: Ditto

Index: testsuite/gdb.mi/Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/Makefile.in,v
retrieving revision 1.1
diff -p -r1.1 Makefile.in
*** Makefile.in	2000/02/23 00:25:43	1.1
--- Makefile.in	2000/03/14 04:58:58
*************** distclean maintainer-clean realclean: cl
*** 18,20 ****
--- 18,24 ----
  
  Makefile: $(srcdir)/Makefile.in $(srcdir)/configure.in
  	$(SHELL) ./config.status --recheck
+ 
+ # Local variables: 
+ # change-log-default-name: "ChangeLog-mi"
+ # End: 
Index: testsuite/gdb.mi/basics.c
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/basics.c,v
retrieving revision 1.2
diff -p -r1.2 basics.c
*** basics.c	2000/03/06 21:33:38	1.2
--- basics.c	2000/03/14 04:58:58
*************** main ()
*** 37,41 ****
    return 0;
  }
  
! 
  
--- 37,45 ----
    return 0;
  }
  
! /*
! Local variables: 
! change-log-default-name: "ChangeLog-mi"
! End: 
! */
  
From ac131313@cygnus.com Mon Mar 13 23:15:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: Elena Zannoni <ezannoni@cygnus.com>
Cc: Eli Zaretskii <eliz@is.elta.co.il>, gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH] GDB command-line switches and annotations docs
Date: Mon, 13 Mar 2000 23:15:00 -0000
Message-id: <38CDE6E6.3AF7FAE5@cygnus.com>
References: <200003101347.IAA21898@indy.delorie.com> <14537.5048.99180.910863@kwikemart.cygnus.com>
X-SW-Source: 2000-03/msg00247.html
Content-length: 597

Elena Zannoni wrote:
> 
> Eli Zaretskii writes:
>  >
>  > Here are patches to gdb.texinfo and annotate.texi which add indexing
>  > to command-line switches, document some switches that were not in the
>  > manual, and make annotate.texi part of GDB manual.
>  >
>  > (Are there plans to make gdbmi.texi be part of the manual as well?)
>  >
> 
> Eventually yes (Andrew?), right now it is not in prime time form yet. It is
> still very rough work in progress.

Yes its rough but still certainly better than nothing.
I guess the need to the MI commands against the doco becomes a FIXME :-(

	Andrew
From ac131313@cygnus.com Mon Mar 13 23:41:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: Elena Zannoni <ezannoni@cygnus.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: PATCH: printing elements of typedef'ed arrays
Date: Mon, 13 Mar 2000 23:41:00 -0000
Message-id: <38CDED0E.2FBE16B6@cygnus.com>
References: <14535.62150.908914.943283@kwikemart.cygnus.com>
X-SW-Source: 2000-03/msg00248.html
Content-length: 1079

Elena Zannoni wrote:
> 
> [Sorry, wrong list...]
> 
> When an array is typedeffed, like in this example:
> 
> typedef long ArrayLong [10];
> ArrayLong a1;
> 
> typedef struct s
> {
>  int a;
>  int b;
> } structure;
> 
> long a2 [10];
> structure s1;
> 
> int main (void)
> {
>     return 0;
> }
> 
> Gdb cannot print individual elements of the array a1:
> 
> (gdb) p a1
> $1 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
> (gdb) p a1[0]
> $2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  <<<< is incorrect
> (gdb) p a2
> $3 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
> (gdb) p a2[0]
> $4 = 0
> (gdb)
> 
> The following patch takes care of this.
> I tested it on solaris and showed no regressions.
> OK to check in?
> 
> Elena

Just two cross checks:

	o	the existing testsuite
		checks that the printing of
		character strings doesn't change
		and the patch didn't change the
		behavour

		(I've a foggy memory about a great
		debate where the printing of strings
		was made special in some way)

	o	you've sneekered in a testsuite
		change (to printcmd.exp?) :-)

Andrew

PS: I guess I'm the defacto maintainer.
From eliz@delorie.com Tue Mar 14 01:32:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: ac131313@cygnus.com
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH] Add change-log variables to more MI files
Date: Tue, 14 Mar 2000 01:32:00 -0000
Message-id: <200003140932.EAA28159@indy.delorie.com>
References: <38CDC788.D9C8FE12@cygnus.com>
X-SW-Source: 2000-03/msg00249.html
Content-length: 373

> I've checked in the attatched.  It should help keep ChangeLog entries
> local.
[snip]
> + 
> + # Local variables: 
> + # change-log-default-name: "ChangeLog-mi"
> + # End: 

You _are_ aware that ChangeLog and ChangeLog-mi both map to the same
name "changelo" when truncated to 8+3 limits, right?

Is it conceivable to rename ChangeLog-mi to ChangeLog.mi or
mi-ChangeLog?
From Peter.Schauer@regent.e-technik.tu-muenchen.de Tue Mar 14 02:46:00 2000
From: "Peter.Schauer" <Peter.Schauer@regent.e-technik.tu-muenchen.de>
To: gdb-patches@sourceware.cygnus.com
Subject: RFA: symfile.c: Fix for GDB crash when rereading symbols
Date: Tue, 14 Mar 2000 02:46:00 -0000
Message-id: <200003141046.LAA08835@reisser.regent.e-technik.tu-muenchen.de>
X-SW-Source: 2000-03/msg00250.html
Content-length: 837

symfile.c:reread_symbols does not clear the new msymbol hash tables in the
objfile, causing stale pointers and a GDB crash during the reread.exp
test on Solaris.

Here is a fix:

	* symfile.c (reread_symbols):  Clear msymbol hash table.

*** gdb/symfile.c.orig	Thu Feb  3 05:14:35 2000
--- gdb/symfile.c	Tue Mar 14 10:00:27 2000
***************
*** 1775,1780 ****
--- 1775,1784 ----
  	      objfile->free_psymtabs = NULL;
  	      objfile->msymbols = NULL;
  	      objfile->minimal_symbol_count = 0;
+ 	      memset (&objfile->msymbol_hash, 0,
+ 		      sizeof (objfile->msymbol_hash));
+ 	      memset (&objfile->msymbol_demangled_hash, 0,
+ 		      sizeof (objfile->msymbol_demangled_hash));
  	      objfile->fundamental_types = NULL;
  	      if (objfile->sf != NULL)
  		{

-- 
Peter Schauer			pes@regent.e-technik.tu-muenchen.de
From ezannoni@cygnus.com Tue Mar 14 09:01:00 2000
From: Elena Zannoni <ezannoni@cygnus.com>
To: Andrew Cagney <ac131313@cygnus.com>
Cc: Elena Zannoni <ezannoni@cygnus.com>, gdb-patches@sourceware.cygnus.com
Subject: Re: PATCH: printing elements of typedef'ed arrays
Date: Tue, 14 Mar 2000 09:01:00 -0000
Message-id: <14542.28768.797041.244558@kwikemart.cygnus.com>
References: <14535.62150.908914.943283@kwikemart.cygnus.com> <38CDED0E.2FBE16B6@cygnus.com>
X-SW-Source: 2000-03/msg00251.html
Content-length: 5335

Andrew Cagney writes:
 > Elena Zannoni wrote:
 > > 
 > > [Sorry, wrong list...]
 > > 
 > > When an array is typedeffed, like in this example:
 > > 
 > > typedef long ArrayLong [10];
 > > ArrayLong a1;
 > > 
 > > typedef struct s
 > > {
 > >  int a;
 > >  int b;
 > > } structure;
 > > 
 > > long a2 [10];
 > > structure s1;
 > > 
 > > int main (void)
 > > {
 > >     return 0;
 > > }
 > > 
 > > Gdb cannot print individual elements of the array a1:
 > > 
 > > (gdb) p a1
 > > $1 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
 > > (gdb) p a1[0]
 > > $2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}  <<<< is incorrect
 > > (gdb) p a2
 > > $3 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
 > > (gdb) p a2[0]
 > > $4 = 0
 > > (gdb)
 > > 
 > > The following patch takes care of this.
 > > I tested it on solaris and showed no regressions.
 > > OK to check in?
 > > 
 > > Elena
 > 
 > Just two cross checks:
 > 
 > 	o	the existing testsuite
 > 		checks that the printing of
 > 		character strings doesn't change
 > 		and the patch didn't change the
 > 		behavour
 > 
 > 		(I've a foggy memory about a great
 > 		debate where the printing of strings
 > 		was made special in some way)

Correct. I saw no regressions.
 > 
 > 	o	you've sneekered in a testsuite
 > 		change (to printcmd.exp?) :-)
 > 

Yes, I added some tests.

 > Andrew
 > 
 > PS: I guess I'm the defacto maintainer.

Here is the full patch. I just committed it.

Index: ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/ChangeLog,v
retrieving revision 1.130
diff -c -u -r1.130 ChangeLog
--- ChangeLog	2000/03/14 02:37:24	1.130
+++ ChangeLog	2000/03/14 16:56:48
@@ -1,3 +1,8 @@
+2000-03-14  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
+
+	* eval.c (evaluate_subexp_with_coercion): Add call to
+ 	check_typedef, to handle typedeffed vars correctly.
+
 Mon Mar 13 21:21:41 2000  Andrew Cagney  <cagney@b1.cygnus.com>
 
 	* defs.h (STREQ, STRCMP, STREQN): Document that these macros are
Index: eval.c
===================================================================
RCS file: /cvs/src/src/gdb/eval.c,v
retrieving revision 1.1.1.7
diff -c -u -r1.1.1.7 eval.c
--- eval.c	1999/12/14 01:05:30	1.1.1.7
+++ eval.c	2000/03/14 16:56:49
@@ -1875,7 +1875,7 @@
 	  val =
 	    locate_var_value
 	    (var, block_innermost_frame (exp->elts[pc + 1].block));
-	  return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (SYMBOL_TYPE (var))),
+	  return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (check_typedef (SYMBOL_TYPE (var)))),
 			     val);
 	}
       /* FALLTHROUGH */
Index: testsuite/ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/ChangeLog,v
retrieving revision 1.7
diff -c -u -r1.7 ChangeLog
--- ChangeLog	2000/03/14 06:14:07	1.7
+++ ChangeLog	2000/03/14 16:56:52
@@ -1,3 +1,10 @@
+2000-03-14  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
+
+	* gdb.base/printcmds.c: Add typedeffed arrays.
+
+	* gdb.base/printcmds.exp (test_print_typedef_arrays): New
+ 	procedure to test arrays that are typedef'd.
+
 2000-03-13  James Ingham  <jingham@leda.cygnus.com>
 
 	* lib/gdb.exp: Fix the gdbtk_start routine to correctly find all
Index: testsuite/gdb.base/printcmds.c
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/printcmds.c,v
retrieving revision 1.1.1.2
diff -c -u -r1.1.1.2 printcmds.c
--- printcmds.c	1999/06/28 16:03:41	1.1.1.2
+++ printcmds.c	2000/03/14 16:56:52
@@ -59,6 +59,12 @@
 /* Single and multidimensional arrays to test access and printing of array
    members. */
 
+typedef int ArrayInt [10];
+ArrayInt a1 = {2,4,6,8,10,12,14,16,18,20};
+
+typedef char ArrayChar [5];
+ArrayChar a2 = {'a','b','c','d','\0'};
+
 int int1dim[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
 int int2dim[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
 int int3dim[2][3][2] = {{{0,1},{2,3},{4,5}},{{6,7},{8,9},{10,11}}};
@@ -97,5 +103,5 @@
   /* Prevent AIX linker from removing variables.  */
   return ctable1[0] + ctable2[0] + int1dim[0] + int2dim[0][0]
     + int3dim[0][0][0] + int4dim[0][0][0][0] + teststring[0] +
-      *parrays -> array1;
+      *parrays -> array1 + a1[0] + a2[0];
 }
Index: testsuite/gdb.base/printcmds.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/printcmds.exp,v
retrieving revision 1.1.1.3
diff -c -u -r1.1.1.3 printcmds.exp
--- printcmds.exp	1999/08/02 23:46:51	1.1.1.3
+++ printcmds.exp	2000/03/14 16:56:52
@@ -552,6 +552,22 @@
 	" = {{{{0, 1}, {2, 3}, {4, 5}}, {{6, 7}, {8, 9}, {10, 11}}}}"
 }
 
+proc test_print_typedef_arrays {} {
+    global gdb_prompt
+
+    gdb_test "set print elements 24" ""
+
+    gdb_test "p a1" \
+	" = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}"
+    gdb_test "p a1\[0\]" " = 2"
+    gdb_test "p a1\[9\]" " = 20"
+
+    gdb_test "p a2" \
+	" = \"abcd\""
+    gdb_test "p a2\[0\]" " = 97 'a'"
+    gdb_test "p a2\[3\]" " = 100 'd'"
+}
+
 proc test_artificial_arrays {} {
     # Send \026@ instead of just @ in case the kill character is @.
     gdb_test "p int1dim\[0\]\026@2" " = {0, 1}" {p int1dim[0]@2}
@@ -691,6 +707,7 @@
 	test_print_repeats_10
 	test_print_strings
 	test_print_int_arrays
+	test_print_typedef_arrays
 	test_artificial_arrays
 	test_print_char_arrays
 # We used to do the runto main here.




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] Notes on QUIT and STREQ et.al.
       [not found] <38CCC819.1071F28E@cygnus.com>
  2000-03-13  8:28 ` [RFC] Notes on QUIT and STREQ et.al Kevin Buettner
@ 2000-04-01  0:00 ` Andrew Cagney
       [not found] ` <5m1z5emy7b.fsf@jtc.redbacknetworks.com>
  2 siblings, 0 replies; 5+ messages in thread
From: Andrew Cagney @ 2000-04-01  0:00 UTC (permalink / raw)
  To: GDB Patches

Andrew Cagney wrote:
> 
> The attatched spells out the long term prospects of both STREQ et.al.
> and QUIT.

FYI, I checked in the attatched.

I resisted the temptation to rewrite the macros eliminating ``?:'' :-)
Knowing my luck, I'd firstly get it wrong and  secondly it would turn
out that some code somewhere relied on the existing behavour.

	enjoy,
		Andrew
Mon Mar 13 21:21:41 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* defs.h (STREQ, STRCMP, STREQN): Document that these macros are
 	somewhat redundant.
	(QUIT): Note that this can probably be replaced by a function.

Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.11
diff -p -r1.11 defs.h
*** defs.h	2000/03/13 07:30:00	1.11
--- defs.h	2000/03/14 02:27:37
*************** extern int core_addr_greaterthan (CORE_A
*** 117,125 ****
  #define max(a, b) ((a) > (b) ? (a) : (b))
  #endif
  
! /* Gdb does *lots* of string compares.  Use macros to speed them up by
!    avoiding function calls if the first characters are not the same. */
  
  #define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
  #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
  #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
--- 117,140 ----
  #define max(a, b) ((a) > (b) ? (a) : (b))
  #endif
  
! /* Macros to do string compares.
  
+    NOTE: cagney/2000-03-14:
+ 
+    While old code can continue to refer to these macros, new code is
+    probably better off using strcmp() directly vis: ``strcmp() == 0''
+    and ``strcmp() != 0''.
+ 
+    This is because modern compilers can directly inline strcmp()
+    making the original justification for these macros - avoid function
+    call overhead by pre-testing the first characters
+    (``*X==*Y?...:0'') - redundant.
+ 
+    ``Even if [...] testing the first character does have a modest
+    performance improvement, I'd rather that whenever a performance
+    issue is found that we spend the effort on algorithmic
+    optimizations than micro-optimizing.'' J.T. */
+ 
  #define STRCMP(a,b) (*(a) == *(b) ? strcmp ((a), (b)) : (int)*(a) - (int)*(b))
  #define STREQ(a,b) (*(a) == *(b) ? !strcmp ((a), (b)) : 0)
  #define STREQN(a,b,c) (*(a) == *(b) ? !strncmp ((a), (b), (c)) : 0)
*************** extern int immediate_quit;
*** 152,157 ****
--- 167,179 ----
  extern int sevenbit_strings;
  
  extern void quit (void);
+ 
+ /* FIXME: cagney/2000-03-13: It has been suggested that the peformance
+    benefits of having a ``QUIT'' macro rather than a function are
+    marginal.  If the overhead of a QUIT function call is proving
+    significant then its calling frequency should probably be reduced
+    [kingdon].  A profile analyzing the current situtation is
+    needed. */
  
  #ifdef QUIT
  /* do twice to force compiler warning */
From kevinb@cygnus.com Sat Apr 01 00:00:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: Eric Paire <paire@ri.silicomp.fr>
Cc: Jim Blandy <jimb@cygnus.com>, Michael Snyder <msnyder@cygnus.com>, gdb-patches@sourceware.cygnus.com
Subject: Re: RFA: linux-thread.c change (fixes hang on startup)
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <1000124201604.ZM20737@ocotillo.lan>
References: <200001241439.PAA24508@mailhost.ri.silicomp.fr> <paire@ri.silicomp.fr>
X-SW-Source: 2000-q1/msg00030.html
Content-length: 2964

On Jan 24,  3:39pm, Eric Paire wrote:

> I privately discussed the SIGCHLD management point with Michael, as this was
> one major change in the LinuxThread support behaviour I wrote code for. My
> only problem with your patch is that if SIGCHLD is blocked at that time, it
> should have been blocked intentionally by other part of GDB, and if SIGCHLD
> has not yet been unblocked, then this is a bug to fix in the right part
> of GDB, and not in the LinuxThread support, because other parts of GDB
> dealing with SIGCHLD [un]masking will also have to support the fix you
> propose.
> 
> So, I would suggest that (thanks to your program which exhibits consistently
> the problem) you try to track down the signal status in 'gdb_init()' and try
> to discover what part of GDB is incorrectly managing SIGCHLD. After having
> downloaded the latest GDB snapshot and looked at the source, I have not
> been able to see any place where the SIGCHLD is being blocked before calling
> '_initialize_linuxthreads()', but you should be able to discover that
> quickly with your test program (perhaps in the 'pre_init_ui_hook' if you use
> an UI).

I've done some digging, and it appears that SIGCHLD is *not* blocked
explicitly by another part of gdb.  (Prior to sending my patch on
Saturday morning, I looked around for it too, but saw nothing
obvious.)  After looking a bit harder, I discovered that the process
signal mask with SIGCHLD blocked is being inherited from the parent.

Here is what I did to make this determination:

    1) Debug gdb w/ gdb.  (The choice of the parent gdb is critical.)
    2) Put a breakpoint on main
    3) Run 'til the breakpoint on main.
    4) Determine the pid of the child with "info target"
    5) cat out /proc/PID/status and observe the mask indicated by
       SigBlk.

When I start gdb with an older gdb (gdb-4.17.0.11 which is what installs
by default on my RH6.0 system), I see no signals blocked.  OTOH, when
I debug gdb with a recent gdb (the one that I just built myself from
the development sources), I see:

	SigBlk: 0000000000010000

This indicates that SIGCHLD is blocked.

This leads me to the conclusion that the parent gdb is causing SIGCHLD
to be blocked for the inferior (child) gdb.

Note that this problem could occur in other settings as well.  If gdb
is invoked by a gui which communicates with it, the signal mask could
be in an unknown/undesirable state too.

I think we should attack this problem on two fronts:

    1) Early in gdb's initialization, we should set the signal mask
       to some appropriate value.  (Perhaps just unblock all signals.)

    2) Just after forking the child (on the child's side of the fork),
       we should again reset the signal mask so that the child does
       not inherit the mask that gdb is using.

I also think it's prudent to make sure that linuxthreads_block_mask
does not block SIGCHLD.

Opinions?

(If there's general agreement, I'll prepare some patches...)

Kevin
From kevinb@cygnus.com Sat Apr 01 00:00:00 2000
From: Kevin Buettner <kevinb@cygnus.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH] New files for the IA-64 port
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <1000321001502.ZM20102@ocotillo.lan>
X-SW-Source: 2000-q1/msg00834.html
Content-length: 81768

I've just committed the following changes:

	* ia64-linux-nat.c, ia64-tdep.c, config/ia64/linux.mh,
	config/ia64/linux.mt, config/ia64/nm-linux.h, config/ia64/tm-ia64.h,
	config/ia64/tm-linux.h, config/ia64/xm-linux.h: New files.

Index: ia64-linux-nat.c
===================================================================
RCS file: ia64-linux-nat.c
diff -N ia64-linux-nat.c
--- /dev/null	Tue May  5 13:32:27 1998
+++ ia64-linux-nat.c	Mon Mar 20 15:57:31 2000
@@ -0,0 +1,399 @@
+/* Functions specific to running gdb native on IA64 running Linux.
+   Copyright 1999 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "defs.h"
+#include "inferior.h"
+#include "target.h"
+#include "gdbcore.h"
+
+#include <signal.h>
+#include <sys/ptrace.h>
+#include <sys/wait.h>
+#ifdef HAVE_SYS_REG_H
+#include <sys/reg.h>
+#endif
+#include <sys/user.h>
+
+#include <asm/ptrace_offsets.h>
+#include <sys/procfs.h>
+
+/* These must match the order of the register names.
+
+   Some sort of lookup table is needed because the offsets associated
+   with the registers are all over the board.  */
+
+static int u_offsets[] =
+  {
+    /* general registers */
+    -1,		/* gr0 not available; i.e, it's always zero */
+    PT_R1,
+    PT_R2,
+    PT_R3,
+    PT_R4,
+    PT_R5,
+    PT_R6,
+    PT_R7,
+    PT_R8,
+    PT_R9,
+    PT_R10,
+    PT_R11,
+    PT_R12,
+    PT_R13,
+    PT_R14,
+    PT_R15,
+    PT_R16,
+    PT_R17,
+    PT_R18,
+    PT_R19,
+    PT_R20,
+    PT_R21,
+    PT_R22,
+    PT_R23,
+    PT_R24,
+    PT_R25,
+    PT_R26,
+    PT_R27,
+    PT_R28,
+    PT_R29,
+    PT_R30,
+    PT_R31,
+    /* gr32 through gr127 not directly available via the ptrace interface */
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    /* Floating point registers */
+    -1, -1,	/* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */
+    PT_F2,
+    PT_F3,
+    PT_F4,
+    PT_F5,
+    PT_F6,
+    PT_F7,
+    PT_F8,
+    PT_F9,
+    PT_F10,
+    PT_F11,
+    PT_F12,
+    PT_F13,
+    PT_F14,
+    PT_F15,
+    PT_F16,
+    PT_F17,
+    PT_F18,
+    PT_F19,
+    PT_F20,
+    PT_F21,
+    PT_F22,
+    PT_F23,
+    PT_F24,
+    PT_F25,
+    PT_F26,
+    PT_F27,
+    PT_F28,
+    PT_F29,
+    PT_F30,
+    PT_F31,
+    PT_F32,
+    PT_F33,
+    PT_F34,
+    PT_F35,
+    PT_F36,
+    PT_F37,
+    PT_F38,
+    PT_F39,
+    PT_F40,
+    PT_F41,
+    PT_F42,
+    PT_F43,
+    PT_F44,
+    PT_F45,
+    PT_F46,
+    PT_F47,
+    PT_F48,
+    PT_F49,
+    PT_F50,
+    PT_F51,
+    PT_F52,
+    PT_F53,
+    PT_F54,
+    PT_F55,
+    PT_F56,
+    PT_F57,
+    PT_F58,
+    PT_F59,
+    PT_F60,
+    PT_F61,
+    PT_F62,
+    PT_F63,
+    PT_F64,
+    PT_F65,
+    PT_F66,
+    PT_F67,
+    PT_F68,
+    PT_F69,
+    PT_F70,
+    PT_F71,
+    PT_F72,
+    PT_F73,
+    PT_F74,
+    PT_F75,
+    PT_F76,
+    PT_F77,
+    PT_F78,
+    PT_F79,
+    PT_F80,
+    PT_F81,
+    PT_F82,
+    PT_F83,
+    PT_F84,
+    PT_F85,
+    PT_F86,
+    PT_F87,
+    PT_F88,
+    PT_F89,
+    PT_F90,
+    PT_F91,
+    PT_F92,
+    PT_F93,
+    PT_F94,
+    PT_F95,
+    PT_F96,
+    PT_F97,
+    PT_F98,
+    PT_F99,
+    PT_F100,
+    PT_F101,
+    PT_F102,
+    PT_F103,
+    PT_F104,
+    PT_F105,
+    PT_F106,
+    PT_F107,
+    PT_F108,
+    PT_F109,
+    PT_F110,
+    PT_F111,
+    PT_F112,
+    PT_F113,
+    PT_F114,
+    PT_F115,
+    PT_F116,
+    PT_F117,
+    PT_F118,
+    PT_F119,
+    PT_F120,
+    PT_F121,
+    PT_F122,
+    PT_F123,
+    PT_F124,
+    PT_F125,
+    PT_F126,
+    PT_F127,
+    /* predicate registers - we don't fetch these individually */
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    /* branch registers */
+    PT_B0,
+    PT_B1,
+    PT_B2,
+    PT_B3,
+    PT_B4,
+    PT_B5,
+    PT_B6,
+    PT_B7,
+    /* virtual frame pointer and virtual return address pointer */
+    -1, -1,
+    /* other registers */
+    PT_PR,
+    PT_CR_IIP,	/* ip */
+    PT_CR_IPSR, /* psr */
+    PT_CR_IFS,	/* cfm */
+    /* kernel registers not visible via ptrace interface (?) */
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    /* hole */
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    PT_AR_RSC,
+    PT_AR_BSP,
+    PT_AR_BSPSTORE,
+    PT_AR_RNAT,
+    -1,
+    -1,		/* Not available: FCR, IA32 floating control register */
+    -1, -1,
+    -1,		/* Not available: EFLAG */
+    -1,		/* Not available: CSD */
+    -1,		/* Not available: SSD */
+    -1,		/* Not available: CFLG */
+    -1,		/* Not available: FSR */
+    -1,		/* Not available: FIR */
+    -1,		/* Not available: FDR */
+    -1,
+    PT_AR_CCV,
+    -1, -1, -1,
+    PT_AR_UNAT,
+    -1, -1, -1,
+    PT_AR_FPSR,
+    -1, -1, -1,
+    -1,		/* Not available: ITC */
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    PT_AR_PFS,
+    PT_AR_LC,
+    -1,		/* Not available: EC, the Epilog Count register */
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1,
+    /* nat bits - not fetched directly; instead we obtain these bits from
+       either rnat or unat or from memory. */
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1,
+  };
+
+CORE_ADDR
+register_addr (regno, blockend)
+     int regno;
+     CORE_ADDR blockend;
+{
+  CORE_ADDR addr;
+
+  if (regno < 0 || regno >= NUM_REGS)
+    error ("Invalid register number %d.", regno);
+
+  if (u_offsets[regno] == -1)
+    addr = 0;
+  else
+    addr = (CORE_ADDR) u_offsets[regno];
+
+  return addr;
+}
+
+int ia64_cannot_fetch_register (regno)
+     int regno;
+{
+  return regno < 0 || regno >= NUM_REGS || u_offsets[regno] == -1;
+}
+
+int ia64_cannot_store_register (regno)
+     int regno;
+{
+  /* Rationale behind not permitting stores to bspstore...
+  
+     The IA-64 architecture provides bspstore and bsp which refer
+     memory locations in the RSE's backing store.  bspstore is the
+     next location which will be written when the RSE needs to write
+     to memory.  bsp is the address at which r32 in the current frame
+     would be found if it were written to the backing store.
+
+     The IA-64 architecture provides read-only access to bsp and
+     read/write access to bspstore (but only when the RSE is in
+     the enforced lazy mode).  It should be noted that stores
+     to bspstore also affect the value of bsp.  Changing bspstore
+     does not affect the number of dirty entries between bspstore
+     and bsp, so changing bspstore by N words will also cause bsp
+     to be changed by (roughly) N as well.  (It could be N-1 or N+1
+     depending upon where the NaT collection bits fall.)
+
+     OTOH, the linux kernel provides read/write access to bsp (and
+     currently read/write access to bspstore as well).  But it
+     is definitely the case that if you change one, the other
+     will change at the same time.  It is more useful to gdb to
+     be able to change bsp.  So in order to prevent strange and
+     undesirable things from happening when a dummy stack frame
+     is popped (after calling an inferior function), we allow
+     bspstore to be read, but not written.  (Note that popping
+     a (generic) dummy stack frame causes all registers that
+     were previously read from the inferior process to be written
+     back.)  */
+
+  return regno < 0 || regno >= NUM_REGS || u_offsets[regno] == -1
+         || regno == IA64_BSPSTORE_REGNUM;
+}
+
+void
+supply_gregset (gregsetp)
+     gregset_t *gregsetp;
+{
+  int regi;
+  greg_t *regp = (greg_t *) gregsetp;
+
+  for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++)
+    {
+      supply_register (regi, (char *) (regp + (regi - IA64_GR0_REGNUM)));
+    }
+
+  /* FIXME: NAT collection bits are at index 32; gotta deal with these
+     somehow... */
+
+  supply_register (IA64_PR_REGNUM, (char *) (regp + 33));
+
+  for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++)
+    {
+      supply_register (regi, (char *) (regp + 34 + (regi - IA64_BR0_REGNUM)));
+    }
+
+  supply_register (IA64_IP_REGNUM, (char *) (regp + 42));
+  supply_register (IA64_CFM_REGNUM, (char *) (regp + 43));
+  supply_register (IA64_PSR_REGNUM, (char *) (regp + 44));
+  supply_register (IA64_RSC_REGNUM, (char *) (regp + 45));
+  supply_register (IA64_BSP_REGNUM, (char *) (regp + 46));
+  supply_register (IA64_BSPSTORE_REGNUM, (char *) (regp + 47));
+  supply_register (IA64_RNAT_REGNUM, (char *) (regp + 48));
+  supply_register (IA64_CCV_REGNUM, (char *) (regp + 49));
+  supply_register (IA64_UNAT_REGNUM, (char *) (regp + 50));
+  supply_register (IA64_FPSR_REGNUM, (char *) (regp + 51));
+  supply_register (IA64_PFS_REGNUM, (char *) (regp + 52));
+  supply_register (IA64_LC_REGNUM, (char *) (regp + 53));
+  supply_register (IA64_EC_REGNUM, (char *) (regp + 54));
+}
+
+void
+fill_gregset (gregsetp, regno)
+     gregset_t *gregsetp;
+     int regno;
+{
+  fprintf(stderr, "Warning: fill_gregset not implemented!\n");
+  /* FIXME: Implement later */
+}
Index: ia64-tdep.c
===================================================================
RCS file: ia64-tdep.c
diff -N ia64-tdep.c
--- /dev/null	Tue May  5 13:32:27 1998
+++ ia64-tdep.c	Mon Mar 20 15:57:33 2000
@@ -0,0 +1,1630 @@
+/* Target-dependent code for the IA-64 for GDB, the GNU debugger.
+   Copyright 1999, 2000
+   Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "defs.h"
+#include "inferior.h"
+#include "symfile.h"		/* for entry_point_address */
+#include "gdbcore.h"
+#include "floatformat.h"
+
+#include "objfiles.h"
+#include "elf/common.h"		/* for DT_PLTGOT value */
+
+typedef enum instruction_type
+{
+  A,			/* Integer ALU ;    I-unit or M-unit */
+  I,			/* Non-ALU integer; I-unit */
+  M,			/* Memory ;         M-unit */
+  F,			/* Floating-point ; F-unit */
+  B,			/* Branch ;         B-unit */
+  L,			/* Extended (L+X) ; I-unit */
+  X,			/* Extended (L+X) ; I-unit */
+  undefined		/* undefined or reserved */
+} instruction_type;
+
+/* We represent IA-64 PC addresses as the value of the instruction
+   pointer or'd with some bit combination in the low nibble which
+   represents the slot number in the bundle addressed by the
+   instruction pointer.  The problem is that the Linux kernel
+   multiplies its slot numbers (for exceptions) by one while the
+   disassembler multiplies its slot numbers by 6.  In addition, I've
+   heard it said that the simulator uses 1 as the multiplier.
+   
+   I've fixed the disassembler so that the bytes_per_line field will
+   be the slot multiplier.  If bytes_per_line comes in as zero, it
+   is set to six (which is how it was set up initially). -- objdump
+   displays pretty disassembly dumps with this value.  For our purposes,
+   we'll set bytes_per_line to SLOT_MULTIPLIER. This is okay since we
+   never want to also display the raw bytes the way objdump does. */
+
+#define SLOT_MULTIPLIER 1
+
+/* Length in bytes of an instruction bundle */
+
+#define BUNDLE_LEN 16
+
+extern void _initialize_ia64_tdep (void);
+
+static gdbarch_init_ftype ia64_gdbarch_init;
+
+static gdbarch_register_name_ftype ia64_register_name;
+static gdbarch_register_raw_size_ftype ia64_register_raw_size;
+static gdbarch_register_virtual_size_ftype ia64_register_virtual_size;
+static gdbarch_register_virtual_type_ftype ia64_register_virtual_type;
+static gdbarch_register_byte_ftype ia64_register_byte;
+static gdbarch_breakpoint_from_pc_ftype ia64_breakpoint_from_pc;
+static gdbarch_frame_chain_ftype ia64_frame_chain;
+static gdbarch_frame_saved_pc_ftype ia64_frame_saved_pc;
+static gdbarch_skip_prologue_ftype ia64_skip_prologue;
+static gdbarch_frame_init_saved_regs_ftype ia64_frame_init_saved_regs;
+static gdbarch_get_saved_register_ftype ia64_get_saved_register;
+static gdbarch_extract_return_value_ftype ia64_extract_return_value;
+static gdbarch_extract_struct_value_address_ftype ia64_extract_struct_value_address;
+static gdbarch_use_struct_convention_ftype ia64_use_struct_convention;
+static gdbarch_frameless_function_invocation_ftype ia64_frameless_function_invocation;
+static gdbarch_init_extra_frame_info_ftype ia64_init_extra_frame_info;
+static gdbarch_store_return_value_ftype ia64_store_return_value;
+static gdbarch_store_struct_return_ftype ia64_store_struct_return;
+static gdbarch_push_arguments_ftype ia64_push_arguments;
+static gdbarch_push_return_address_ftype ia64_push_return_address;
+static gdbarch_pop_frame_ftype ia64_pop_frame;
+static gdbarch_saved_pc_after_call_ftype ia64_saved_pc_after_call;
+
+static void ia64_pop_frame_regular (struct frame_info *frame);
+
+static int ia64_num_regs = 590;
+
+static int pc_regnum = IA64_IP_REGNUM;
+static int sp_regnum = IA64_GR12_REGNUM;
+static int fp_regnum = IA64_VFP_REGNUM;
+static int lr_regnum = IA64_VRAP_REGNUM;
+
+static LONGEST ia64_call_dummy_words[] = {0};
+
+/* Array of register names; There should be ia64_num_regs strings in
+   the initializer.  */
+
+static char *ia64_register_names[] = 
+{ "r0",   "r1",   "r2",   "r3",   "r4",   "r5",   "r6",   "r7",
+  "r8",   "r9",   "r10",  "r11",  "r12",  "r13",  "r14",  "r15",
+  "r16",  "r17",  "r18",  "r19",  "r20",  "r21",  "r22",  "r23",
+  "r24",  "r25",  "r26",  "r27",  "r28",  "r29",  "r30",  "r31",
+  "r32",  "r33",  "r34",  "r35",  "r36",  "r37",  "r38",  "r39",
+  "r40",  "r41",  "r42",  "r43",  "r44",  "r45",  "r46",  "r47",
+  "r48",  "r49",  "r50",  "r51",  "r52",  "r53",  "r54",  "r55",
+  "r56",  "r57",  "r58",  "r59",  "r60",  "r61",  "r62",  "r63",
+  "r64",  "r65",  "r66",  "r67",  "r68",  "r69",  "r70",  "r71",
+  "r72",  "r73",  "r74",  "r75",  "r76",  "r77",  "r78",  "r79",
+  "r80",  "r81",  "r82",  "r83",  "r84",  "r85",  "r86",  "r87",
+  "r88",  "r89",  "r90",  "r91",  "r92",  "r93",  "r94",  "r95",
+  "r96",  "r97",  "r98",  "r99",  "r100", "r101", "r102", "r103",
+  "r104", "r105", "r106", "r107", "r108", "r109", "r110", "r111",
+  "r112", "r113", "r114", "r115", "r116", "r117", "r118", "r119",
+  "r120", "r121", "r122", "r123", "r124", "r125", "r126", "r127",
+
+  "f0",   "f1",   "f2",   "f3",   "f4",   "f5",   "f6",   "f7",
+  "f8",   "f9",   "f10",  "f11",  "f12",  "f13",  "f14",  "f15",
+  "f16",  "f17",  "f18",  "f19",  "f20",  "f21",  "f22",  "f23",
+  "f24",  "f25",  "f26",  "f27",  "f28",  "f29",  "f30",  "f31",
+  "f32",  "f33",  "f34",  "f35",  "f36",  "f37",  "f38",  "f39",
+  "f40",  "f41",  "f42",  "f43",  "f44",  "f45",  "f46",  "f47",
+  "f48",  "f49",  "f50",  "f51",  "f52",  "f53",  "f54",  "f55",
+  "f56",  "f57",  "f58",  "f59",  "f60",  "f61",  "f62",  "f63",
+  "f64",  "f65",  "f66",  "f67",  "f68",  "f69",  "f70",  "f71",
+  "f72",  "f73",  "f74",  "f75",  "f76",  "f77",  "f78",  "f79",
+  "f80",  "f81",  "f82",  "f83",  "f84",  "f85",  "f86",  "f87",
+  "f88",  "f89",  "f90",  "f91",  "f92",  "f93",  "f94",  "f95",
+  "f96",  "f97",  "f98",  "f99",  "f100", "f101", "f102", "f103",
+  "f104", "f105", "f106", "f107", "f108", "f109", "f110", "f111",
+  "f112", "f113", "f114", "f115", "f116", "f117", "f118", "f119",
+  "f120", "f121", "f122", "f123", "f124", "f125", "f126", "f127",
+
+  "p0",   "p1",   "p2",   "p3",   "p4",   "p5",   "p6",   "p7",
+  "p8",   "p9",   "p10",  "p11",  "p12",  "p13",  "p14",  "p15",
+  "p16",  "p17",  "p18",  "p19",  "p20",  "p21",  "p22",  "p23",
+  "p24",  "p25",  "p26",  "p27",  "p28",  "p29",  "p30",  "p31",
+  "p32",  "p33",  "p34",  "p35",  "p36",  "p37",  "p38",  "p39",
+  "p40",  "p41",  "p42",  "p43",  "p44",  "p45",  "p46",  "p47",
+  "p48",  "p49",  "p50",  "p51",  "p52",  "p53",  "p54",  "p55",
+  "p56",  "p57",  "p58",  "p59",  "p60",  "p61",  "p62",  "p63",
+
+  "b0",   "b1",   "b2",   "b3",   "b4",   "b5",   "b6",   "b7",
+
+  "vfp", "vrap",
+
+  "pr", "ip", "psr", "cfm",
+
+  "kr0",   "kr1",   "kr2",   "kr3",   "kr4",   "kr5",   "kr6",   "kr7",
+  "", "", "", "", "", "", "", "",
+  "rsc", "bsp", "bspstore", "rnat",
+  "", "fcr", "", "",
+  "eflag", "csd", "ssd", "cflg", "fsr", "fir", "fdr",  "",
+  "ccv", "", "", "", "unat", "", "", "",
+  "fpsr", "", "", "", "itc",
+  "", "", "", "", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "", "",
+  "pfs", "lc", "ec",
+  "", "", "", "", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "", "", "",
+  "", "", "", "", "", "", "", "", "", "",
+  "",
+  "nat0",  "nat1",  "nat2",  "nat3",  "nat4",  "nat5",  "nat6",  "nat7",
+  "nat8",  "nat9",  "nat10", "nat11", "nat12", "nat13", "nat14", "nat15",
+  "nat16", "nat17", "nat18", "nat19", "nat20", "nat21", "nat22", "nat23",
+  "nat24", "nat25", "nat26", "nat27", "nat28", "nat29", "nat30", "nat31",
+  "nat32", "nat33", "nat34", "nat35", "nat36", "nat37", "nat38", "nat39",
+  "nat40", "nat41", "nat42", "nat43", "nat44", "nat45", "nat46", "nat47",
+  "nat48", "nat49", "nat50", "nat51", "nat52", "nat53", "nat54", "nat55",
+  "nat56", "nat57", "nat58", "nat59", "nat60", "nat61", "nat62", "nat63",
+  "nat64", "nat65", "nat66", "nat67", "nat68", "nat69", "nat70", "nat71",
+  "nat72", "nat73", "nat74", "nat75", "nat76", "nat77", "nat78", "nat79",
+  "nat80", "nat81", "nat82", "nat83", "nat84", "nat85", "nat86", "nat87",
+  "nat88", "nat89", "nat90", "nat91", "nat92", "nat93", "nat94", "nat95",
+  "nat96", "nat97", "nat98", "nat99", "nat100","nat101","nat102","nat103",
+  "nat104","nat105","nat106","nat107","nat108","nat109","nat110","nat111",
+  "nat112","nat113","nat114","nat115","nat116","nat117","nat118","nat119",
+  "nat120","nat121","nat122","nat123","nat124","nat125","nat126","nat127",
+};
+
+struct frame_extra_info
+{
+  CORE_ADDR bsp;	/* points at r32 for the current frame */
+  CORE_ADDR cfm;	/* cfm value for current frame */
+  int       sof;	/* Size of frame  (decoded from cfm value) */
+  int	    sol;	/* Size of locals (decoded from cfm value) */
+  CORE_ADDR after_prologue;
+  			/* Address of first instruction after the last
+			   prologue instruction;  Note that there may
+			   be instructions from the function's body
+			   intermingled with the prologue. */
+  int       mem_stack_frame_size;
+  			/* Size of the memory stack frame (may be zero),
+			   or -1 if it has not been determined yet. */
+  int	    fp_reg;	/* Register number (if any) used a frame pointer
+                           for this frame.  0 if no register is being used
+			   as the frame pointer. */
+};
+
+static char *
+ia64_register_name (int reg)
+{
+  return ia64_register_names[reg];
+}
+
+int
+ia64_register_raw_size (int reg)
+{
+  return (IA64_FR0_REGNUM <= reg && reg <= IA64_FR127_REGNUM) ? 16 : 8;
+}
+
+int
+ia64_register_virtual_size (int reg)
+{
+  return (IA64_FR0_REGNUM <= reg && reg <= IA64_FR127_REGNUM) ? 16 : 8;
+}
+
+/* Return true iff register N's virtual format is different from
+   its raw format. */
+int
+ia64_register_convertible (int nr)
+{
+  return (IA64_FR0_REGNUM <= nr && nr <= IA64_FR127_REGNUM);
+}
+
+const struct floatformat floatformat_ia64_ext =
+{
+  floatformat_little, 82, 0, 1, 17, 65535, 0x1ffff, 18, 64,
+  floatformat_intbit_yes
+};
+
+void
+ia64_register_convert_to_virtual (int regnum, struct type *type,
+                                  char *from, char *to)
+{
+  if (regnum >= IA64_FR0_REGNUM && regnum <= IA64_FR127_REGNUM)
+    {
+      DOUBLEST val;
+      floatformat_to_doublest (&floatformat_ia64_ext, from, &val);
+      store_floating(to, TYPE_LENGTH(type), val);
+    }
+  else
+    error("ia64_register_convert_to_virtual called with non floating point register number");
+}
+
+void
+ia64_register_convert_to_raw (struct type *type, int regnum,
+                              char *from, char *to)
+{
+  if (regnum >= IA64_FR0_REGNUM && regnum <= IA64_FR127_REGNUM)
+    {
+      DOUBLEST val = extract_floating (from, TYPE_LENGTH(type));
+      floatformat_from_doublest (&floatformat_ia64_ext, &val, to);
+    }
+  else
+    error("ia64_register_convert_to_raw called with non floating point register number");
+}
+
+struct type *
+ia64_register_virtual_type (int reg)
+{
+  if (reg >= IA64_FR0_REGNUM && reg <= IA64_FR127_REGNUM)
+    return builtin_type_long_double;
+  else
+    return builtin_type_long;
+}
+
+int
+ia64_register_byte (int reg)
+{
+  return (8 * reg) +
+   (reg <= IA64_FR0_REGNUM ? 0 : 8 * ((reg > IA64_FR127_REGNUM) ? 128 : reg - IA64_FR0_REGNUM));
+}
+
+/* Extract ``len'' bits from an instruction bundle starting at
+   bit ``from''.  */
+
+long long
+extract_bit_field (char *bundle, int from, int len)
+{
+  long long result = 0LL;
+  int to = from + len;
+  int from_byte = from / 8;
+  int to_byte = to / 8;
+  unsigned char *b = (unsigned char *) bundle;
+  unsigned char c;
+  int lshift;
+  int i;
+
+  c = b[from_byte];
+  if (from_byte == to_byte)
+    c = ((unsigned char) (c << (8 - to % 8))) >> (8 - to % 8);
+  result = c >> (from % 8);
+  lshift = 8 - (from % 8);
+
+  for (i = from_byte+1; i < to_byte; i++)
+    {
+      result |= ((long long) b[i]) << lshift;
+      lshift += 8;
+    }
+
+  if (from_byte < to_byte && (to % 8 != 0))
+    {
+      c = b[to_byte];
+      c = ((unsigned char) (c << (8 - to % 8))) >> (8 - to % 8);
+      result |= ((long long) c) << lshift;
+    }
+
+  return result;
+}
+
+/* Replace the specified bits in an instruction bundle */
+
+void
+replace_bit_field (char *bundle, long long val, int from, int len)
+{
+  int to = from + len;
+  int from_byte = from / 8;
+  int to_byte = to / 8;
+  unsigned char *b = (unsigned char *) bundle;
+  unsigned char c;
+
+  if (from_byte == to_byte)
+    {
+      unsigned char left, right;
+      c = b[from_byte];
+      left = (c >> (to % 8)) << (to % 8);
+      right = ((unsigned char) (c << (8 - from % 8))) >> (8 - from % 8);
+      c = (unsigned char) (val & 0xff);
+      c = (unsigned char) (c << (from % 8 + 8 - to % 8)) >> (8 - to % 8);
+      c |= right | left;
+      b[from_byte] = c;
+    }
+  else
+    {
+      int i;
+      c = b[from_byte];
+      c = ((unsigned char) (c << (8 - from % 8))) >> (8 - from % 8);
+      c = c | (val << (from % 8));
+      b[from_byte] = c;
+      val >>= 8 - from % 8;
+
+      for (i = from_byte+1; i < to_byte; i++)
+	{
+	  c = val & 0xff;
+	  val >>= 8;
+	  b[i] = c;
+	}
+
+      if (to % 8 != 0)
+	{
+	  unsigned char cv = (unsigned char) val;
+	  c = b[to_byte];
+	  c = c >> (to % 8) << (to % 8);
+	  c |= ((unsigned char) (cv << (8 - to % 8))) >> (8 - to % 8);
+	  b[to_byte] = c;
+	}
+    }
+}
+
+/* Return the contents of slot N (for N = 0, 1, or 2) in
+   and instruction bundle */
+
+long long
+slotN_contents (unsigned char *bundle, int slotnum)
+{
+  return extract_bit_field (bundle, 5+41*slotnum, 41);
+}
+
+/* Store an instruction in an instruction bundle */
+
+void
+replace_slotN_contents (unsigned char *bundle, long long instr, int slotnum)
+{
+  replace_bit_field (bundle, instr, 5+41*slotnum, 41);
+}
+
+static template_encoding_table[32][3] =
+{
+  { M, I, I },				/* 00 */
+  { M, I, I },				/* 01 */
+  { M, I, I },				/* 02 */
+  { M, I, I },				/* 03 */
+  { M, L, X },				/* 04 */
+  { M, L, X },				/* 05 */
+  { undefined, undefined, undefined },  /* 06 */
+  { undefined, undefined, undefined },  /* 07 */
+  { M, M, I },				/* 08 */
+  { M, M, I },				/* 09 */
+  { M, M, I },				/* 0A */
+  { M, M, I },				/* 0B */
+  { M, F, I },				/* 0C */
+  { M, F, I },				/* 0D */
+  { M, M, F },				/* 0E */
+  { M, M, F },				/* 0F */
+  { M, I, B },				/* 10 */
+  { M, I, B },				/* 11 */
+  { M, B, B },				/* 12 */
+  { M, B, B },				/* 13 */
+  { undefined, undefined, undefined },  /* 14 */
+  { undefined, undefined, undefined },  /* 15 */
+  { B, B, B },				/* 16 */
+  { B, B, B },				/* 17 */
+  { M, M, B },				/* 18 */
+  { M, M, B },				/* 19 */
+  { undefined, undefined, undefined },  /* 1A */
+  { undefined, undefined, undefined },  /* 1B */
+  { M, F, B },				/* 1C */
+  { M, F, B },				/* 1D */
+  { undefined, undefined, undefined },  /* 1E */
+  { undefined, undefined, undefined },  /* 1F */
+};
+
+/* Fetch and (partially) decode an instruction at ADDR and return the
+   address of the next instruction to fetch.  */
+
+static CORE_ADDR
+fetch_instruction (CORE_ADDR addr, instruction_type *it, long long *instr)
+{
+  char bundle[BUNDLE_LEN];
+  int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
+  long long template;
+  int val;
+
+  if (slotnum > 2)
+    error("Can't fetch instructions for slot numbers greater than 2.");
+
+  addr &= ~0x0f;
+
+  val = target_read_memory (addr, bundle, BUNDLE_LEN);
+
+  if (val != 0)
+    return 0;
+
+  *instr = slotN_contents (bundle, slotnum);
+  template = extract_bit_field (bundle, 0, 5);
+  *it = template_encoding_table[(int)template][slotnum];
+
+  if (slotnum == 2 || slotnum == 1 && *it == L)
+    addr += 16;
+  else
+    addr += (slotnum + 1) * SLOT_MULTIPLIER;
+
+  return addr;
+}
+
+/* There are 5 different break instructions (break.i, break.b,
+   break.m, break.f, and break.x), but they all have the same
+   encoding.  (The five bit template in the low five bits of the
+   instruction bundle distinguishes one from another.)
+   
+   The runtime architecture manual specifies that break instructions
+   used for debugging purposes must have the upper two bits of the 21
+   bit immediate set to a 0 and a 1 respectively.  A breakpoint
+   instruction encodes the most significant bit of its 21 bit
+   immediate at bit 36 of the 41 bit instruction.  The penultimate msb
+   is at bit 25 which leads to the pattern below.  
+   
+   Originally, I had this set up to do, e.g, a "break.i 0x80000"  But
+   it turns out that 0x80000 was used as the syscall break in the early
+   simulators.  So I changed the pattern slightly to do "break.i 0x080001"
+   instead.  But that didn't work either (I later found out that this
+   pattern was used by the simulator that I was using.)  So I ended up
+   using the pattern seen below. */
+
+#if 0
+#define BREAKPOINT 0x00002000040LL
+#endif
+#define BREAKPOINT 0x00003333300LL
+
+static int
+ia64_memory_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
+{
+  char bundle[BUNDLE_LEN];
+  int slotnum = (int) (addr & 0x0f) / SLOT_MULTIPLIER;
+  long long instr;
+  int val;
+
+  if (slotnum > 2)
+    error("Can't insert breakpoint for slot numbers greater than 2.");
+
+  addr &= ~0x0f;
+
+  val = target_read_memory (addr, bundle, BUNDLE_LEN);
+  instr = slotN_contents (bundle, slotnum);
+  memcpy(contents_cache, &instr, sizeof(instr));
+  replace_slotN_contents (bundle, BREAKPOINT, slotnum);
+  if (val == 0)
+    target_write_memory (addr, bundle, BUNDLE_LEN);
+
+  return val;
+}
+
+static int
+ia64_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
+{
+  char bundle[BUNDLE_LEN];
+  int slotnum = (addr & 0x0f) / SLOT_MULTIPLIER;
+  long long instr;
+  int val;
+
+  addr &= ~0x0f;
+
+  val = target_read_memory (addr, bundle, BUNDLE_LEN);
+  memcpy (&instr, contents_cache, sizeof instr);
+  replace_slotN_contents (bundle, instr, slotnum);
+  if (val == 0)
+    target_write_memory (addr, bundle, BUNDLE_LEN);
+
+  return val;
+}
+
+/* We don't really want to use this, but remote.c needs to call it in order
+   to figure out if Z-packets are supported or not.  Oh, well. */
+unsigned char *
+ia64_breakpoint_from_pc (pcptr, lenptr)
+     CORE_ADDR *pcptr;
+     int *lenptr;
+{
+  static unsigned char breakpoint[] =
+    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+  *lenptr = sizeof (breakpoint);
+#if 0
+  *pcptr &= ~0x0f;
+#endif
+  return breakpoint;
+}
+
+CORE_ADDR
+ia64_read_pc (int pid)
+{
+  CORE_ADDR psr_value = read_register_pid (IA64_PSR_REGNUM, pid);
+  CORE_ADDR pc_value   = read_register_pid (IA64_IP_REGNUM, pid);
+  int slot_num = (psr_value >> 41) & 3;
+
+  return pc_value | (slot_num * SLOT_MULTIPLIER);
+}
+
+void
+ia64_write_pc (CORE_ADDR new_pc, int pid)
+{
+  int slot_num = (int) (new_pc & 0xf) / SLOT_MULTIPLIER;
+  CORE_ADDR psr_value = read_register_pid (IA64_PSR_REGNUM, pid);
+  psr_value &= ~(3LL << 41);
+  psr_value |= (CORE_ADDR)(slot_num & 0x3) << 41;
+
+  new_pc &= ~0xfLL;
+
+  write_register_pid (IA64_PSR_REGNUM, psr_value, pid);
+  write_register_pid (IA64_IP_REGNUM, new_pc, pid);
+}
+
+#define IS_NaT_COLLECTION_ADDR(addr) ((((addr) >> 3) & 0x3f) == 0x3f)
+
+/* Returns the address of the slot that's NSLOTS slots away from
+   the address ADDR. NSLOTS may be positive or negative. */
+static CORE_ADDR
+rse_address_add(CORE_ADDR addr, int nslots)
+{
+  CORE_ADDR new_addr;
+  int mandatory_nat_slots = nslots / 63;
+  int direction = nslots < 0 ? -1 : 1;
+
+  new_addr = addr + 8 * (nslots + mandatory_nat_slots);
+
+  if ((new_addr >> 9)  != ((addr + 8 * 64 * mandatory_nat_slots) >> 9))
+    new_addr += 8 * direction;
+
+  if (IS_NaT_COLLECTION_ADDR(new_addr))
+    new_addr += 8 * direction;
+
+  return new_addr;
+}
+
+/* The IA-64 frame chain is a bit odd.  We won't always have a frame
+   pointer, so we use the SP value as the FP for the purpose of
+   creating a frame.  There is sometimes a register (not fixed) which
+   is used as a frame pointer.  When this register exists, it is not
+   especially hard to determine which one is being used.  It isn't
+   even really hard to compute the frame chain, but it can be
+   computationally expensive.  So, instead of making life difficult
+   (and slow), we pick a more convenient representation of the frame
+   chain, knowing that we'll have to make some small adjustments
+   in other places.  (E.g, note that read_fp() and write_fp() are
+   actually read_sp() and write_sp() below in ia64_gdbarch_init()
+   below.) 
+
+   Okay, so what is the frame chain exactly?  It'll be the SP value
+   at the time that the function in question was entered.
+
+   Note that this *should* actually the frame pointer for the current
+   function!  But as I note above, if we were to attempt to find the
+   address of the beginning of the previous frame, we'd waste a lot
+   of cycles for no good reason.  So instead, we simply choose to
+   represent the frame chain as the end of the previous frame instead
+   of the beginning.  */
+
+CORE_ADDR
+ia64_frame_chain (struct frame_info *frame)
+{
+  FRAME_INIT_SAVED_REGS (frame);
+
+  if (frame->saved_regs[IA64_VFP_REGNUM])
+    return read_memory_integer (frame->saved_regs[IA64_VFP_REGNUM], 8);
+  else
+    return frame->frame + frame->extra_info->mem_stack_frame_size;
+}
+
+CORE_ADDR
+ia64_frame_saved_pc (struct frame_info *frame)
+{
+  FRAME_INIT_SAVED_REGS (frame);
+
+  if (frame->saved_regs[IA64_VRAP_REGNUM])
+    return read_memory_integer (frame->saved_regs[IA64_VRAP_REGNUM], 8);
+  else	/* either frameless, or not far enough along in the prologue... */
+    return ia64_saved_pc_after_call (frame);
+}
+
+#define isScratch(_regnum_) ((_regnum_) == 2 || (_regnum_) == 3 \
+  || (8 <= (_regnum_) && (_regnum_) <= 11) \
+  || (14 <= (_regnum_) && (_regnum_) <= 31))
+#define imm9(_instr_) \
+  ( ((((_instr_) & 0x01000000000LL) ? -1 : 0) << 8) \
+   | (((_instr_) & 0x00008000000LL) >> 20) \
+   | (((_instr_) & 0x00000001fc0LL) >> 6))
+
+static CORE_ADDR
+examine_prologue (CORE_ADDR pc, CORE_ADDR lim_pc, struct frame_info *frame)
+{
+  CORE_ADDR next_pc;
+  CORE_ADDR last_prologue_pc = pc;
+  int done = 0;
+  instruction_type it;
+  long long instr;
+  int do_fsr_stuff = 0;
+
+  int cfm_reg  = 0;
+  int ret_reg  = 0;
+  int fp_reg   = 0;
+  int unat_save_reg = 0;
+  int pr_save_reg = 0;
+  int mem_stack_frame_size = 0;
+  int spill_reg   = 0;
+  CORE_ADDR spill_addr = 0;
+
+  if (frame && !frame->saved_regs)
+    {
+      frame_saved_regs_zalloc (frame);
+      do_fsr_stuff = 1;
+    }
+
+  if (frame 
+      && !do_fsr_stuff
+      && frame->extra_info->after_prologue != 0
+      && frame->extra_info->after_prologue <= lim_pc)
+    return frame->extra_info->after_prologue;
+
+  /* Must start with an alloc instruction */
+  next_pc = fetch_instruction (pc, &it, &instr);
+  if (pc < lim_pc && next_pc 
+      && it == M && ((instr & 0x1ee0000003fLL) == 0x02c00000000LL))
+    {
+      /* alloc */
+      int sor = (int) ((instr & 0x00078000000LL) >> 27);
+      int sol = (int) ((instr & 0x00007f00000LL) >> 20);
+      int sof = (int) ((instr & 0x000000fe000LL) >> 13);
+      /* Okay, so sor, sol, and sof aren't used right now; but perhaps
+         we could compare against the size given to us via the cfm as
+	 either a sanity check or possibly to see if the frame has been
+	 changed by a later alloc instruction... */
+      int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
+      cfm_reg = rN;
+      last_prologue_pc = next_pc;
+      pc = next_pc;
+    }
+  else
+    pc = lim_pc;	/* We're done early */
+
+  /* Loop, looking for prologue instructions, keeping track of
+     where preserved registers were spilled. */
+  while (pc < lim_pc)
+    {
+      next_pc = fetch_instruction (pc, &it, &instr);
+      if (next_pc == 0)
+	break;
+
+      if (it == I && ((instr & 0x1eff8000000LL) == 0x00188000000LL))
+        {
+	  /* Move from BR */
+	  int b2 = (int) ((instr & 0x0000000e000LL) >> 13);
+	  int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
+	  int qp = (int) (instr & 0x0000000003f);
+
+	  if (qp == 0 && b2 == 0 && rN >= 32 && ret_reg == 0)
+	    {
+	      ret_reg = rN;
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if ((it == I || it == M) 
+          && ((instr & 0x1ee00000000LL) == 0x10800000000LL))
+	{
+	  /* adds rN = imm14, rM   (or mov rN, rM  when imm14 is 0) */
+	  int imm = (int) ((((instr & 0x01000000000LL) ? -1 : 0) << 13) 
+	                   | ((instr & 0x001f8000000LL) >> 20)
+		           | ((instr & 0x000000fe000LL) >> 13));
+	  int rM = (int) ((instr & 0x00007f00000LL) >> 20);
+	  int rN = (int) ((instr & 0x00000001fc0LL) >> 6);
+	  int qp = (int) (instr & 0x0000000003fLL);
+
+	  if (qp == 0 && rN >= 32 && imm == 0 && rM == 12 && fp_reg == 0)
+	    {
+	      /* mov rN, r12 */
+	      fp_reg = rN;
+	      last_prologue_pc = next_pc;
+	    }
+	  else if (qp == 0 && rN == 12 && rM == 12)
+	    {
+	      /* adds r12, -mem_stack_frame_size, r12 */
+	      mem_stack_frame_size -= imm;
+	      last_prologue_pc = next_pc;
+	    }
+	  else if (qp == 0 && rN == 2 
+	        && ((rM == fp_reg && fp_reg != 0) || rM == 12))
+	    {
+	      /* adds r2, spilloffset, rFramePointer 
+	           or
+		 adds r2, spilloffset, r12
+
+	         Get ready for stf.spill or st8.spill instructions.
+		 The address to start spilling at is loaded into r2. 
+		 FIXME:  Why r2?  That's what gcc currently uses; it
+		 could well be different for other compilers.  */
+
+	      /* Hmm... whether or not this will work will depend on
+	         where the pc is.  If it's still early in the prologue
+		 this'll be wrong.  FIXME */
+	      spill_addr  = (frame ? frame->frame : 0)
+	                  + (rM == 12 ? 0 : mem_stack_frame_size) 
+			  + imm;
+	      spill_reg   = rN;
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if (it == M 
+            && (   ((instr & 0x1efc0000000LL) == 0x0eec0000000LL)
+                || ((instr & 0x1ffc8000000LL) == 0x0cec0000000LL) ))
+	{
+	  /* stf.spill [rN] = fM, imm9
+	     or
+	     stf.spill [rN] = fM  */
+
+	  int imm = imm9(instr);
+	  int rN = (int) ((instr & 0x00007f00000LL) >> 20);
+	  int fM = (int) ((instr & 0x000000fe000LL) >> 13);
+	  int qp = (int) (instr & 0x0000000003fLL);
+	  if (qp == 0 && rN == spill_reg && spill_addr != 0
+	      && ((2 <= fM && fM <= 5) || (16 <= fM && fM <= 31)))
+	    {
+	      if (do_fsr_stuff)
+	        frame->saved_regs[IA64_FR0_REGNUM + fM] = spill_addr;
+
+              if ((instr & 0x1efc0000000) == 0x0eec0000000)
+		spill_addr += imm;
+	      else
+		spill_addr = 0;		/* last one; must be done */
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if ((it == M && ((instr & 0x1eff8000000LL) == 0x02110000000LL))
+            || (it == I && ((instr & 0x1eff8000000LL) == 0x00050000000LL)) )
+	{
+	  /* mov.m rN = arM   
+	       or 
+	     mov.i rN = arM */
+
+	  int arM = (int) ((instr & 0x00007f00000LL) >> 20);
+	  int rN  = (int) ((instr & 0x00000001fc0LL) >> 6);
+	  int qp  = (int) (instr & 0x0000000003fLL);
+	  if (qp == 0 && isScratch (rN) && arM == 36 /* ar.unat */)
+	    {
+	      /* We have something like "mov.m r3 = ar.unat".  Remember the
+		 r3 (or whatever) and watch for a store of this register... */
+	      unat_save_reg = rN;
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if (it == I && ((instr & 0x1eff8000000LL) == 0x00198000000LL))
+	{
+	  /* mov rN = pr */
+	  int rN  = (int) ((instr & 0x00000001fc0LL) >> 6);
+	  int qp  = (int) (instr & 0x0000000003fLL);
+	  if (qp == 0 && isScratch (rN))
+	    {
+	      pr_save_reg = rN;
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if (it == M 
+            && (   ((instr & 0x1ffc8000000LL) == 0x08cc0000000LL)
+	        || ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)))
+	{
+	  /* st8 [rN] = rM 
+	      or
+	     st8 [rN] = rM, imm9 */
+	  int rN = (int) ((instr & 0x00007f00000LL) >> 20);
+	  int rM = (int) ((instr & 0x000000fe000LL) >> 13);
+	  int qp = (int) (instr & 0x0000000003fLL);
+	  if (qp == 0 && rN == spill_reg && spill_addr != 0
+	      && (rM == unat_save_reg || rM == pr_save_reg))
+	    {
+	      /* We've found a spill of either the UNAT register or the PR
+	         register.  (Well, not exactly; what we've actually found is
+		 a spill of the register that UNAT or PR was moved to).
+		 Record that fact and move on... */
+	      if (rM == unat_save_reg)
+		{
+		  /* Track UNAT register */
+		  if (do_fsr_stuff)
+		    frame->saved_regs[IA64_UNAT_REGNUM] = spill_addr;
+		  unat_save_reg = 0;
+		}
+	      else
+	        {
+		  /* Track PR register */
+		  if (do_fsr_stuff)
+		    frame->saved_regs[IA64_PR_REGNUM] = spill_addr;
+		  pr_save_reg = 0;
+		}
+	      if ((instr & 0x1efc0000000LL) == 0x0acc0000000LL)
+		/* st8 [rN] = rM, imm9 */
+		spill_addr += imm9(instr);
+	      else
+		spill_addr = 0;		/* must be done spilling */
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if (it == M
+            && (   ((instr & 0x1ffc8000000LL) == 0x08ec0000000LL)
+	        || ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)))
+	{
+	  /* st8.spill [rN] = rM
+	       or
+	     st8.spill [rN] = rM, imm9 */
+	  int rN = (int) ((instr & 0x00007f00000LL) >> 20);
+	  int rM = (int) ((instr & 0x000000fe000LL) >> 13);
+	  int qp = (int) (instr & 0x0000000003fLL);
+	  if (qp == 0 && rN == spill_reg && 4 <= rM && rM <= 7)
+	    {
+	      /* We've found a spill of one of the preserved general purpose
+	         regs.  Record the spill address and advance the spill
+		 register if appropriate. */
+	      if (do_fsr_stuff)
+		frame->saved_regs[IA64_GR0_REGNUM + rM] = spill_addr;
+	      if ((instr & 0x1efc0000000LL) == 0x0aec0000000LL)
+	        /* st8.spill [rN] = rM, imm9 */
+		spill_addr += imm9(instr);
+	      else
+		spill_addr = 0;		/* Done spilling */
+	      last_prologue_pc = next_pc;
+	    }
+	}
+      else if (it == B || ((instr & 0x3fLL) != 0LL))
+	break;
+
+      pc = next_pc;
+    }
+
+  if (do_fsr_stuff) {
+    int i;
+    CORE_ADDR addr;
+
+    for (i = 0, addr = frame->extra_info->bsp;
+	 i < frame->extra_info->sof;
+	 i++, addr += 8)
+      {
+	if (IS_NaT_COLLECTION_ADDR (addr))
+	  {
+	    addr += 8;
+	  }
+	frame->saved_regs[IA64_GR32_REGNUM + i] = addr;
+
+	if (i+32 == cfm_reg)
+	  frame->saved_regs[IA64_CFM_REGNUM] = addr;
+	if (i+32 == ret_reg)
+	  frame->saved_regs[IA64_VRAP_REGNUM] = addr;
+	if (i+32 == fp_reg)
+	  frame->saved_regs[IA64_VFP_REGNUM] = addr;
+      }
+  }
+
+  if (frame && frame->extra_info) {
+    frame->extra_info->after_prologue = last_prologue_pc;
+    frame->extra_info->mem_stack_frame_size = mem_stack_frame_size;
+    frame->extra_info->fp_reg = fp_reg;
+  }
+
+  return last_prologue_pc;
+}
+
+CORE_ADDR
+ia64_skip_prologue (CORE_ADDR pc)
+{
+  return examine_prologue (pc, pc+1024, 0);
+}
+
+void
+ia64_frame_init_saved_regs (struct frame_info *frame)
+{
+  CORE_ADDR func_start;
+
+  if (frame->saved_regs)
+    return;
+
+  func_start = get_pc_function_start (frame->pc);
+  examine_prologue (func_start, frame->pc, frame);
+}
+
+static CORE_ADDR
+ia64_find_saved_register (frame, regnum)
+     struct frame_info *frame;
+     int regnum;
+{
+  register CORE_ADDR addr = 0;
+
+  if ((IA64_GR32_REGNUM <= regnum && regnum <= IA64_GR127_REGNUM)
+      || regnum == IA64_VFP_REGNUM
+      || regnum == IA64_VRAP_REGNUM)
+    {
+      FRAME_INIT_SAVED_REGS (frame);
+      return frame->saved_regs[regnum];
+    }
+  else if (regnum == IA64_IP_REGNUM && frame->next)
+    {
+      FRAME_INIT_SAVED_REGS (frame->next);
+      return frame->next->saved_regs[IA64_VRAP_REGNUM];
+    }
+  else
+    {
+      struct frame_info *frame1 = NULL;
+      while (1)
+	{
+	  QUIT;
+	  frame1 = get_prev_frame (frame1);
+	  if (frame1 == 0 || frame1 == frame)
+	    break;
+	  FRAME_INIT_SAVED_REGS (frame1);
+	  if (frame1->saved_regs[regnum])
+	    addr = frame1->saved_regs[regnum];
+	}
+    }
+
+  return addr;
+}
+
+void
+ia64_get_saved_register (char *raw_buffer, 
+                         int *optimized, 
+			 CORE_ADDR *addrp,
+			 struct frame_info *frame,
+			 int regnum,
+			 enum lval_type *lval)
+{
+  CORE_ADDR addr;
+
+  if (!target_has_registers)
+    error ("No registers.");
+
+  if (optimized != NULL)
+    *optimized = 0;
+  addr = ia64_find_saved_register (frame, regnum);
+  if (addr != 0)
+    {
+      if (lval != NULL)
+	*lval = lval_memory;
+      if (regnum == SP_REGNUM)
+	{
+	  if (raw_buffer != NULL)
+	    {
+	      /* Put it back in target format.  */
+	      store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), (LONGEST) addr);
+	    }
+	  if (addrp != NULL)
+	    *addrp = 0;
+	  return;
+	}
+      if (raw_buffer != NULL)
+	read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
+    }
+  else if (IA64_GR32_REGNUM <= regnum && regnum <= IA64_GR127_REGNUM)
+    {
+      /* r32 - r127 must be fetchable via memory.  If they aren't,
+         then the register is unavailable */
+      addr = 0;
+      if (lval != NULL)
+	*lval = not_lval;
+      memset (raw_buffer, 0, REGISTER_RAW_SIZE (regnum));
+    }
+  else if (regnum == IA64_IP_REGNUM)
+    {
+      CORE_ADDR pc;
+      if (frame->next)
+        {
+	  /* This case will normally be handled above, except when it's
+	     frameless or we haven't advanced far enough into the prologue
+	     of the top frame to save the register. */
+	  addr = REGISTER_BYTE (regnum);
+	  if (lval != NULL)
+	    *lval = lval_register;
+	  pc = ia64_saved_pc_after_call (frame);
+        }
+      else
+        {
+	  addr = 0;
+	  if (lval != NULL)
+	    *lval = not_lval;
+	  pc = read_pc ();
+	}
+      store_address (raw_buffer, REGISTER_RAW_SIZE (IA64_IP_REGNUM), pc);
+    }
+  else if (regnum == SP_REGNUM && frame->next)
+    {
+      /* Handle SP values for all frames but the topmost. */
+      addr = 0;
+      if (lval != NULL)
+        *lval = not_lval;
+      store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), frame->frame);
+    }
+  else if (regnum == IA64_BSP_REGNUM)
+    {
+      addr = 0;
+      if (lval != NULL)
+        *lval = not_lval;
+      store_address (raw_buffer, REGISTER_RAW_SIZE (regnum), 
+                     frame->extra_info->bsp);
+    }
+  else if (regnum == IA64_VFP_REGNUM)
+    {
+      /* If the function in question uses an automatic register (r32-r127)
+         for the frame pointer, it'll be found by ia64_find_saved_register()
+	 above.  If the function lacks one of these frame pointers, we can
+	 still provide a value since we know the size of the frame */
+      CORE_ADDR vfp = frame->frame + frame->extra_info->mem_stack_frame_size;
+      addr = 0;
+      if (lval != NULL)
+	*lval = not_lval;
+      store_address (raw_buffer, REGISTER_RAW_SIZE (IA64_VFP_REGNUM), vfp);
+    }
+  else if (IA64_PR0_REGNUM <= regnum && regnum <= IA64_PR63_REGNUM)
+    {
+      char pr_raw_buffer[MAX_REGISTER_RAW_SIZE];
+      int  pr_optim;
+      enum lval_type pr_lval;
+      CORE_ADDR pr_addr;
+      int prN_val;
+      ia64_get_saved_register (pr_raw_buffer, &pr_optim, &pr_addr,
+                               frame, IA64_PR_REGNUM, &pr_lval);
+      prN_val = extract_bit_field ((unsigned char *) pr_raw_buffer,
+                                   regnum - IA64_PR0_REGNUM, 1);
+      store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), prN_val);
+      addr = 0;
+      if (lval != NULL)
+	*lval = not_lval;
+    }
+  else if (IA64_NAT0_REGNUM <= regnum && regnum <= IA64_NAT31_REGNUM)
+    {
+      char unat_raw_buffer[MAX_REGISTER_RAW_SIZE];
+      int  unat_optim;
+      enum lval_type unat_lval;
+      CORE_ADDR unat_addr;
+      int unatN_val;
+      ia64_get_saved_register (unat_raw_buffer, &unat_optim, &unat_addr,
+                               frame, IA64_UNAT_REGNUM, &unat_lval);
+      unatN_val = extract_bit_field ((unsigned char *) unat_raw_buffer,
+                                   regnum - IA64_NAT0_REGNUM, 1);
+      store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), 
+                              unatN_val);
+      addr = 0;
+      if (lval != NULL)
+	*lval = not_lval;
+    }
+  else if (IA64_NAT32_REGNUM <= regnum && regnum <= IA64_NAT127_REGNUM)
+    {
+      int natval = 0;
+      /* Find address of general register corresponding to nat bit we're
+         interested in. */
+      CORE_ADDR gr_addr = 
+	ia64_find_saved_register (frame, 
+	                          regnum - IA64_NAT0_REGNUM + IA64_GR0_REGNUM);
+      if (gr_addr)
+	{
+	  /* Compute address of nat collection bits */
+	  CORE_ADDR nat_addr = gr_addr | 0x1f8;
+	  CORE_ADDR bsp = read_register (IA64_BSP_REGNUM);
+	  CORE_ADDR nat_collection;
+	  int nat_bit;
+	  /* If our nat collection address is bigger than bsp, we have to get
+	     the nat collection from rnat.  Otherwise, we fetch the nat
+	     collection from the computed address. */
+	  if (nat_addr >= bsp)
+	    nat_collection = read_register (IA64_RNAT_REGNUM);
+	  else
+	    nat_collection = read_memory_integer (nat_addr, 8);
+	  nat_bit = (gr_addr >> 3) & 0x3f;
+	  natval = (nat_collection >> nat_bit) & 1;
+	}
+      store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), natval);
+      addr = 0;
+      if (lval != NULL)
+	*lval = not_lval;
+    }
+  else
+    {
+      if (lval != NULL)
+	*lval = lval_register;
+      addr = REGISTER_BYTE (regnum);
+      if (raw_buffer != NULL)
+	read_register_gen (regnum, raw_buffer);
+    }
+  if (addrp != NULL)
+    *addrp = addr;
+}
+
+/* Should we use EXTRACT_STRUCT_VALUE_ADDRESS instead of
+   EXTRACT_RETURN_VALUE?  GCC_P is true if compiled with gcc
+   and TYPE is the type (which is known to be struct, union or array).  */
+int
+ia64_use_struct_convention (int gcc_p, struct type *type)
+{
+  /* FIXME: Need to check for HFAs; structures containing (only) up to 8
+     floating point values of the same size are returned in floating point
+     registers. */
+  return TYPE_LENGTH (type) > 32;
+}
+
+void
+ia64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
+{
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+    ia64_register_convert_to_virtual (IA64_FR8_REGNUM, type,
+      &regbuf[REGISTER_BYTE (IA64_FR8_REGNUM)], valbuf);
+  else
+    memcpy (valbuf, &regbuf[REGISTER_BYTE (IA64_GR8_REGNUM)], TYPE_LENGTH (type));
+}
+
+/* FIXME: Turn this into a stack of some sort.  Unfortunately, something
+   like this is necessary though since the IA-64 calling conventions specify
+   that r8 is not preserved. */
+static CORE_ADDR struct_return_address;
+
+CORE_ADDR
+ia64_extract_struct_value_address (char *regbuf)
+{
+  /* FIXME: See above. */
+  return struct_return_address;
+}
+
+void
+ia64_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
+{
+  /* FIXME: See above. */
+  /* Note that most of the work was done in ia64_push_arguments() */
+  struct_return_address = addr;
+}
+
+int
+ia64_frameless_function_invocation (struct frame_info *frame)
+{
+  /* FIXME: Implement */
+  return 0;
+}
+
+CORE_ADDR
+ia64_saved_pc_after_call (struct frame_info *frame)
+{
+  return read_register (IA64_BR0_REGNUM);
+}
+
+CORE_ADDR
+ia64_frame_args_address (struct frame_info *frame)
+{
+  /* frame->frame points at the SP for this frame; But we want the start
+     of the frame, not the end.  Calling frame chain will get his for us. */
+  return ia64_frame_chain (frame);
+}
+
+CORE_ADDR
+ia64_frame_locals_address (struct frame_info *frame)
+{
+  /* frame->frame points at the SP for this frame; But we want the start
+     of the frame, not the end.  Calling frame chain will get his for us. */
+  return ia64_frame_chain (frame);
+}
+
+void
+ia64_init_extra_frame_info (int fromleaf, struct frame_info *frame)
+{
+  CORE_ADDR bsp, cfm;
+
+  frame->extra_info = (struct frame_extra_info *)
+    frame_obstack_alloc (sizeof (struct frame_extra_info));
+
+  if (frame->next == 0)
+    {
+      bsp = read_register (IA64_BSP_REGNUM);
+      cfm = read_register (IA64_CFM_REGNUM);
+
+    }
+  else
+    {
+      struct frame_info *frn = frame->next;
+      CORE_ADDR cfm_addr;
+
+      FRAME_INIT_SAVED_REGS (frn);
+
+      if (frn->saved_regs[IA64_CFM_REGNUM] != 0)
+	cfm = read_memory_integer (frn->saved_regs[IA64_CFM_REGNUM], 8);
+      else
+	cfm = read_register (IA64_CFM_REGNUM);
+
+      bsp = frn->extra_info->bsp;
+    }
+  frame->extra_info->cfm = cfm;
+  frame->extra_info->sof = cfm & 0x7f;
+  frame->extra_info->sol = (cfm >> 7) & 0x7f;
+  if (frame->next == 0)
+    frame->extra_info->bsp = rse_address_add (bsp, -frame->extra_info->sof);
+  else
+    frame->extra_info->bsp = rse_address_add (bsp, -frame->extra_info->sol);
+
+  frame->extra_info->after_prologue = 0;
+  frame->extra_info->mem_stack_frame_size = -1;		/* Not yet determined */
+  frame->extra_info->fp_reg = 0;
+}
+
+#define ROUND_UP(n,a) (((n)+(a)-1) & ~((a)-1))
+
+CORE_ADDR
+ia64_push_arguments (int nargs, value_ptr *args, CORE_ADDR sp,
+		    int struct_return, CORE_ADDR struct_addr)
+{
+  int argno;
+  value_ptr arg;
+  struct type *type;
+  int len, argoffset;
+  int nslots, rseslots, memslots, slotnum;
+  int floatreg;
+  CORE_ADDR bsp, cfm, pfs, new_bsp;
+
+  nslots = 0;
+  /* Count the number of slots needed for the arguments */
+  for (argno = 0; argno < nargs; argno++)
+    {
+      arg = args[argno];
+      type = check_typedef (VALUE_TYPE (arg));
+      len = TYPE_LENGTH (type);
+
+      /* FIXME: This is crude and it is wrong (IMO), but it matches
+         what gcc does, I think. */
+      if (len > 8 && (nslots & 1))
+	nslots++;
+
+      nslots += (len + 7) / 8;
+    }
+
+  rseslots = (nslots > 8) ? 8 : nslots;
+  memslots = nslots - rseslots;
+
+  cfm = read_register (IA64_CFM_REGNUM);
+
+  bsp = read_register (IA64_BSP_REGNUM);
+  bsp = rse_address_add (bsp, cfm & 0x7f);
+  new_bsp = rse_address_add (bsp, rseslots);
+  write_register (IA64_BSP_REGNUM, new_bsp);
+
+  pfs = read_register (IA64_PFS_REGNUM);
+  pfs &= 0xc000000000000000LL;
+  pfs |= (cfm & 0xffffffffffffLL);
+  write_register (IA64_PFS_REGNUM, pfs);
+
+  cfm &= 0xc000000000000000LL;
+  cfm |= rseslots;
+  write_register (IA64_CFM_REGNUM, cfm);
+  
+
+  
+  sp = sp - 16 - memslots * 8;
+  sp &= ~0xfLL;				/* Maintain 16 byte alignment */
+
+  slotnum = 0;
+  floatreg = IA64_FR8_REGNUM;
+  for (argno = 0; argno < nargs; argno++)
+    {
+      arg = args[argno];
+      type = check_typedef (VALUE_TYPE (arg));
+      len = TYPE_LENGTH (type);
+      if (len > 8 && (slotnum & 1))
+	slotnum++;
+      argoffset = 0;
+      while (len > 0)
+	{
+	  char val_buf[8];
+
+	  memset (val_buf, 0, 8);
+	  memcpy (val_buf, VALUE_CONTENTS (arg) + argoffset, (len > 8) ? 8 : len);
+
+	  if (slotnum < rseslots)
+	    write_memory (rse_address_add (bsp, slotnum), val_buf, 8);
+	  else
+	    write_memory (sp + 16 + 8 * (slotnum - rseslots), val_buf, 8);
+
+	  argoffset += 8;
+	  len -= 8;
+	  slotnum++;
+	}
+      if (TYPE_CODE (type) == TYPE_CODE_FLT && floatreg < IA64_FR16_REGNUM)
+        {
+	  ia64_register_convert_to_raw (type, floatreg, VALUE_CONTENTS (arg),
+	    &registers[REGISTER_BYTE (floatreg)]);
+	  floatreg++;
+	}
+    }
+
+  if (struct_return)
+    {
+      store_address (&registers[REGISTER_BYTE (IA64_GR8_REGNUM)],
+                     REGISTER_RAW_SIZE (IA64_GR8_REGNUM),
+		     struct_addr);
+    }
+
+
+  target_store_registers (-1);
+
+  /* FIXME: This doesn't belong here!  Instead, SAVE_DUMMY_FRAME_TOS needs
+     to be defined to call generic_save_dummy_frame_tos().  But at the
+     time of this writing, SAVE_DUMMY_FRAME_TOS wasn't gdbarch'd, so
+     I chose to put this call here instead of using the old mechanisms. 
+     Once SAVE_DUMMY_FRAME_TOS is gdbarch'd, all we need to do is add the
+     line
+
+	set_gdbarch_save_dummy_frame_tos (gdbarch, generic_save_dummy_frame_tos);
+
+     to ia64_gdbarch_init() and remove the line below. */
+  generic_save_dummy_frame_tos (sp);
+
+  return sp;
+}
+
+CORE_ADDR
+ia64_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
+{
+  struct partial_symtab *pst;
+
+  /* Attempt to determine and set global pointer (r1) for this pc.
+     
+     This rather nasty bit of code searchs for the .dynamic section
+     in the objfile corresponding to the pc of the function we're
+     trying to call.  Once it finds the addresses at which the .dynamic
+     section lives in the child process, it scans the Elf64_Dyn entries
+     for a DT_PLTGOT tag.  If it finds one of these, the corresponding
+     d_un.d_ptr value is the global pointer. */
+  pst = find_pc_psymtab (pc);
+  if (pst != NULL)
+    {
+      struct obj_section *osect;
+
+      ALL_OBJFILE_OSECTIONS (pst->objfile, osect)
+	{
+	  if (strcmp (osect->the_bfd_section->name, ".dynamic") == 0)
+	    break;
+	}
+
+      if (osect < pst->objfile->sections_end)
+	{
+	  CORE_ADDR addr;
+
+	  addr = osect->addr;
+	  while (addr < osect->endaddr)
+	    {
+	      int status;
+	      LONGEST tag;
+	      char buf[8];
+
+	      status = target_read_memory (addr, buf, sizeof (buf));
+	      if (status != 0)
+		break;
+	      tag = extract_signed_integer (buf, sizeof (buf));
+
+	      if (tag == DT_PLTGOT)
+		{
+		  CORE_ADDR global_pointer;
+
+		  status = target_read_memory (addr + 8, buf, sizeof (buf));
+		  if (status != 0)
+		    break;
+		  global_pointer = extract_address (buf, sizeof (buf));
+
+		  /* The payoff... */
+		  write_register (IA64_GR1_REGNUM, global_pointer);
+		  break;
+		}
+
+	      if (tag == DT_NULL)
+		break;
+
+	      addr += 16;
+	    }
+	}
+    }
+
+  write_register (IA64_BR0_REGNUM, CALL_DUMMY_ADDRESS ());
+  return sp;
+}
+
+void
+ia64_store_return_value (struct type *type, char *valbuf)
+{
+  if (TYPE_CODE (type) == TYPE_CODE_FLT)
+    {
+      ia64_register_convert_to_raw (type, IA64_FR8_REGNUM, valbuf,
+				  &registers[REGISTER_BYTE (IA64_FR8_REGNUM)]);
+      target_store_registers (IA64_FR8_REGNUM);
+    }
+  else
+    write_register_bytes (REGISTER_BYTE (IA64_GR8_REGNUM),
+			  valbuf, TYPE_LENGTH (type));
+}
+
+void
+ia64_pop_frame (void)
+{
+  generic_pop_current_frame (ia64_pop_frame_regular);
+}
+
+static void
+ia64_pop_frame_regular (struct frame_info *frame)
+{
+  int regno;
+  CORE_ADDR bsp, cfm, pfs;
+
+  FRAME_INIT_SAVED_REGS (frame);
+
+  for (regno = 0; regno < ia64_num_regs; regno++)
+    {
+      if (frame->saved_regs[regno]
+	  && (!(IA64_GR32_REGNUM <= regno && regno <= IA64_GR127_REGNUM))
+	  && regno != pc_regnum
+	  && regno != sp_regnum
+	  && regno != IA64_PFS_REGNUM
+	  && regno != IA64_CFM_REGNUM
+	  && regno != IA64_BSP_REGNUM
+	  && regno != IA64_BSPSTORE_REGNUM)
+	{
+	  write_register (regno, 
+			  read_memory_integer (frame->saved_regs[regno],
+					       REGISTER_RAW_SIZE (regno)));
+	}
+    }
+
+  write_register (sp_regnum, FRAME_CHAIN (frame));
+  write_pc (FRAME_SAVED_PC (frame));
+
+  cfm = read_register (IA64_CFM_REGNUM);
+
+  if (frame->saved_regs[IA64_PFS_REGNUM])
+    {
+      pfs = read_memory_integer (frame->saved_regs[IA64_PFS_REGNUM],
+				 REGISTER_RAW_SIZE (IA64_PFS_REGNUM));
+    }
+  else
+    pfs = read_register (IA64_PFS_REGNUM);
+
+  /* Compute the new bsp by *adding* the difference between the
+     size of the frame and the size of the locals (both wrt the
+     frame that we're going back to).  This seems kind of strange,
+     especially since it seems like we ought to be subtracting the
+     size of the locals... and we should; but the linux kernel
+     wants bsp to be set at the end of all used registers.  It's
+     likely that this code will need to be revised to accomodate
+     other operating systems. */
+  bsp = rse_address_add (frame->extra_info->bsp,
+                         (pfs & 0x7f) - ((pfs >> 7) & 0x7f));
+  write_register (IA64_BSP_REGNUM, bsp);
+
+  /* FIXME: What becomes of the epilog count in the PFS? */
+  cfm = (cfm & ~0xffffffffffffLL) | (pfs & 0xffffffffffffLL);
+  write_register (IA64_CFM_REGNUM, cfm);
+
+  flush_cached_frames ();
+}
+
+static void
+ia64_remote_translate_xfer_address (CORE_ADDR memaddr, int nr_bytes,
+				    CORE_ADDR *targ_addr, int *targ_len)
+{
+  *targ_addr = memaddr;
+  *targ_len  = nr_bytes;
+}
+
+static struct gdbarch *
+ia64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+{
+  struct gdbarch *gdbarch;
+
+  arches = gdbarch_list_lookup_by_info (arches, &info);
+  if (arches != NULL)
+    return arches->gdbarch;
+
+  gdbarch = gdbarch_alloc (&info, NULL);
+
+  set_gdbarch_short_bit (gdbarch, 16);
+  set_gdbarch_int_bit (gdbarch, 32);
+  set_gdbarch_long_bit (gdbarch, 64);
+  set_gdbarch_long_long_bit (gdbarch, 64);
+  set_gdbarch_float_bit (gdbarch, 32);
+  set_gdbarch_double_bit (gdbarch, 64);
+  set_gdbarch_long_double_bit (gdbarch, 64);
+  set_gdbarch_ptr_bit (gdbarch, 64);
+
+  set_gdbarch_num_regs (gdbarch, ia64_num_regs);
+  set_gdbarch_sp_regnum (gdbarch, sp_regnum);
+  set_gdbarch_fp_regnum (gdbarch, fp_regnum);
+  set_gdbarch_pc_regnum (gdbarch, pc_regnum);
+
+  set_gdbarch_register_name (gdbarch, ia64_register_name);
+  set_gdbarch_register_size (gdbarch, 8);
+  set_gdbarch_register_bytes (gdbarch, ia64_num_regs * 8 + 128*8);
+  set_gdbarch_register_byte (gdbarch, ia64_register_byte);
+  set_gdbarch_register_raw_size (gdbarch, ia64_register_raw_size);
+  set_gdbarch_max_register_raw_size (gdbarch, 16);
+  set_gdbarch_register_virtual_size (gdbarch, ia64_register_virtual_size);
+  set_gdbarch_max_register_virtual_size (gdbarch, 16);
+  set_gdbarch_register_virtual_type (gdbarch, ia64_register_virtual_type);
+
+  set_gdbarch_skip_prologue (gdbarch, ia64_skip_prologue);
+
+  set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
+  set_gdbarch_frameless_function_invocation (gdbarch, ia64_frameless_function_invocation);
+
+  set_gdbarch_saved_pc_after_call (gdbarch, ia64_saved_pc_after_call);
+
+  set_gdbarch_frame_chain (gdbarch, ia64_frame_chain);
+  set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
+  set_gdbarch_frame_saved_pc (gdbarch, ia64_frame_saved_pc);
+
+  set_gdbarch_frame_init_saved_regs (gdbarch, ia64_frame_init_saved_regs);
+  set_gdbarch_get_saved_register (gdbarch, ia64_get_saved_register);
+
+  set_gdbarch_register_convertible (gdbarch, ia64_register_convertible);
+  set_gdbarch_register_convert_to_virtual (gdbarch, ia64_register_convert_to_virtual);
+  set_gdbarch_register_convert_to_raw (gdbarch, ia64_register_convert_to_raw);
+
+  set_gdbarch_use_struct_convention (gdbarch, ia64_use_struct_convention);
+  set_gdbarch_extract_return_value (gdbarch, ia64_extract_return_value);
+
+  set_gdbarch_store_struct_return (gdbarch, ia64_store_struct_return);
+  set_gdbarch_store_return_value (gdbarch, ia64_store_return_value);
+  set_gdbarch_extract_struct_value_address (gdbarch, ia64_extract_struct_value_address);
+
+  set_gdbarch_memory_insert_breakpoint (gdbarch, ia64_memory_insert_breakpoint);
+  set_gdbarch_memory_remove_breakpoint (gdbarch, ia64_memory_remove_breakpoint);
+  set_gdbarch_breakpoint_from_pc (gdbarch, ia64_breakpoint_from_pc);
+  set_gdbarch_read_pc (gdbarch, ia64_read_pc);
+  set_gdbarch_write_pc (gdbarch, ia64_write_pc);
+
+  /* Settings for calling functions in the inferior.  */
+  set_gdbarch_use_generic_dummy_frames (gdbarch, 1);
+  set_gdbarch_call_dummy_length (gdbarch, 0);
+  set_gdbarch_push_arguments (gdbarch, ia64_push_arguments);
+  set_gdbarch_push_return_address (gdbarch, ia64_push_return_address);
+  set_gdbarch_pop_frame (gdbarch, ia64_pop_frame);
+
+  set_gdbarch_call_dummy_p (gdbarch, 1);
+  set_gdbarch_call_dummy_words (gdbarch, ia64_call_dummy_words);
+  set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (ia64_call_dummy_words));
+  set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1);
+  set_gdbarch_init_extra_frame_info (gdbarch, ia64_init_extra_frame_info);
+  set_gdbarch_frame_args_address (gdbarch, ia64_frame_args_address);
+  set_gdbarch_frame_locals_address (gdbarch, ia64_frame_locals_address);
+
+  /* We won't necessarily have a frame pointer and even if we do,
+     it winds up being extraordinarly messy when attempting to find
+     the frame chain.  So for the purposes of creating frames (which
+     is all read_fp() is used for), simply use the stack pointer value
+     instead.  */
+  set_gdbarch_read_fp (gdbarch, generic_target_read_sp);
+  set_gdbarch_write_fp (gdbarch, generic_target_write_sp);
+
+  /* Settings that should be unnecessary.  */
+  set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
+
+  set_gdbarch_read_sp (gdbarch, generic_target_read_sp);
+  set_gdbarch_write_sp (gdbarch, generic_target_write_sp);
+
+  set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
+  set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
+  set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
+  set_gdbarch_call_dummy_start_offset (gdbarch, 0);
+  set_gdbarch_pc_in_call_dummy (gdbarch, generic_pc_in_call_dummy);
+  set_gdbarch_call_dummy_stack_adjust_p (gdbarch, 0);
+  set_gdbarch_push_dummy_frame (gdbarch, generic_push_dummy_frame);
+  set_gdbarch_fix_call_dummy (gdbarch, generic_fix_call_dummy);
+
+  set_gdbarch_decr_pc_after_break (gdbarch, 0);
+  set_gdbarch_function_start_offset (gdbarch, 0);
+
+  set_gdbarch_remote_translate_xfer_address (
+    gdbarch, ia64_remote_translate_xfer_address);
+
+  return gdbarch;
+}
+
+void
+_initialize_ia64_tdep (void)
+{
+  register_gdbarch_init (bfd_arch_ia64, ia64_gdbarch_init);
+
+  tm_print_insn = print_insn_ia64;
+  tm_print_insn_info.bytes_per_line = SLOT_MULTIPLIER;
+}
Index: config/ia64/linux.mh
===================================================================
RCS file: linux.mh
diff -N linux.mh
--- /dev/null	Tue May  5 13:32:27 1998
+++ linux.mh	Mon Mar 20 15:57:45 2000
@@ -0,0 +1,15 @@
+# Host: Intel IA-64 running GNU/Linux
+
+XM_FILE= xm-linux.h
+XDEPFILES= ser-tcp.o
+
+NAT_FILE= nm-linux.h
+NATDEPFILES= infptrace.o solib.o inftarg.o fork-child.o corelow.o \
+	core-aout.o core-regset.o ia64-linux-nat.o
+
+# Don't use gnu-regex.c; it interferes with some stuff in libc.
+REGEX=
+
+# NAT_CLIBS is a hack to be sure; I expect we'll be able to remove this
+# line in the near future
+NAT_CLIBS= -lc -lnss_dns -lnss_files -lresolv -lc
Index: config/ia64/linux.mt
===================================================================
RCS file: linux.mt
diff -N linux.mt
--- /dev/null	Tue May  5 13:32:27 1998
+++ linux.mt	Mon Mar 20 15:57:45 2000
@@ -0,0 +1,6 @@
+# Target: Intel IA-64 running GNU/Linux
+TDEPFILES= ia64-tdep.o
+TM_FILE= tm-linux.h
+
+GDBSERVER_DEPFILES= low-linux.o
+GDBSERVER_LIBS= -lc -lnss_dns -lnss_files -lresolv -lc
Index: config/ia64/nm-linux.h
===================================================================
RCS file: nm-linux.h
diff -N nm-linux.h
--- /dev/null	Tue May  5 13:32:27 1998
+++ nm-linux.h	Mon Mar 20 15:57:45 2000
@@ -0,0 +1,56 @@
+/* Native support for GNU/Linux, for GDB, the GNU debugger.
+   Copyright (C) 1999
+   Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef NM_LINUX_H
+#define NM_LINUX_H
+
+/* We define this if link.h is available, because with ELF we use SVR4 style
+   shared libraries. */
+
+#ifdef HAVE_LINK_H
+#define SVR4_SHARED_LIBS
+#include "solib.h"		/* Support for shared libraries. */
+#endif
+
+/* Note:  It seems likely that we'll have to eventually define
+   FETCH_INFERIOR_REGISTERS.  But until that time, we'll make do
+   with the following. */
+
+#define CANNOT_FETCH_REGISTER(regno) ia64_cannot_fetch_register(regno)
+extern int ia64_cannot_fetch_register (int regno);
+
+#define CANNOT_STORE_REGISTER(regno) ia64_cannot_store_register(regno)
+extern int ia64_cannot_store_register (int regno);
+
+#ifdef GDBSERVER
+#define REGISTER_U_ADDR(addr, blockend, regno) \
+	(addr) = ia64_register_u_addr ((blockend),(regno));
+
+extern int ia64_register_u_addr(int, int);
+#endif /* GDBSERVER */
+
+#define PTRACE_ARG3_TYPE long
+#define PTRACE_XFER_TYPE long
+
+/* Tell gdb that we can attach and detach other processes */
+#define ATTACH_DETACH
+
+#endif /* #ifndef NM_LINUX_H */
Index: config/ia64/tm-ia64.h
===================================================================
RCS file: tm-ia64.h
diff -N tm-ia64.h
--- /dev/null	Tue May  5 13:32:27 1998
+++ tm-ia64.h	Mon Mar 20 15:57:45 2000
@@ -0,0 +1,256 @@
+/* Definitions to target GDB to GNU/Linux on an ia64 architecture.
+   Copyright 1992, 1993 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef TM_IA64_H
+#define TM_IA64_H
+
+#if !defined(GDBSERVER)
+
+#define GDB_MULTI_ARCH 1
+
+#else /* defines needed for GDBSERVER */
+
+/* ia64 is little endian by default */
+
+#define TARGET_BYTE_ORDER LITTLE_ENDIAN
+
+/* Say how long (ordinary) registers are.  This is a piece of bogosity
+   used in push_word and a few other places; REGISTER_RAW_SIZE is the
+   real way to know how big a register is.  */
+
+#define REGISTER_SIZE 8
+
+#undef  NUM_REGS
+#define NUM_REGS 590
+
+/* Some pseudo register numbers */
+
+#define PC_REGNUM	IA64_IP_REGNUM
+#define SP_REGNUM	IA64_GR12_REGNUM
+#define FP_REGNUM	IA64_VFP_REGNUM
+
+/* Total amount of space needed to store our copies of the machine's
+   register state, the array `registers'.  On the ia64, all registers
+   fit in 64 bits except for the floating point registers which require
+   84 bits.  But 84 isn't a nice number, so we'll just allocate 128
+   bits for each of these.  The expression below says that we
+   need 8 bytes for each register, plus an additional 8 bytes for each
+   of the 128 floating point registers. */
+
+#define REGISTER_BYTES (NUM_REGS*8+128*8)
+
+/* Index within `registers' of the first byte of the space for
+   register N.  */
+
+#define REGISTER_BYTE(N) (((N) * 8) \
+  + ((N) <= IA64_FR0_REGNUM ? 0 : 8 * (((N) > IA64_FR127_REGNUM) ? 128 : (N) - IA64_FR0_REGNUM)))
+
+/* Number of bytes of storage in the actual machine representation
+   for register N.  */
+
+#define REGISTER_RAW_SIZE(N) \
+  ((IA64_FR0_REGNUM <= (N) && (N) <= IA64_FR127_REGNUM) ? 16 : 8)
+
+/* Largest value REGISTER_RAW_SIZE can have.  */
+
+#define MAX_REGISTER_RAW_SIZE 16
+
+
+#define GDBSERVER_RESUME_REGS { IA64_IP_REGNUM, IA64_PSR_REGNUM, SP_REGNUM, IA64_BSP_REGNUM, IA64_CFM_REGNUM }
+
+#endif /* GDBSERVER */
+
+
+/* Register numbers of various important registers */
+
+/* General registers; there are 128 of these 64 bit wide registers.  The
+   first 32 are static and the last 96 are stacked. */
+#define IA64_GR0_REGNUM		0
+#define IA64_GR1_REGNUM		(IA64_GR0_REGNUM+1)
+#define IA64_GR2_REGNUM		(IA64_GR0_REGNUM+2)
+#define IA64_GR3_REGNUM		(IA64_GR0_REGNUM+3)
+#define IA64_GR4_REGNUM		(IA64_GR0_REGNUM+4)
+#define IA64_GR5_REGNUM		(IA64_GR0_REGNUM+5)
+#define IA64_GR6_REGNUM		(IA64_GR0_REGNUM+6)
+#define IA64_GR7_REGNUM		(IA64_GR0_REGNUM+7)
+#define IA64_GR8_REGNUM		(IA64_GR0_REGNUM+8)
+#define IA64_GR9_REGNUM		(IA64_GR0_REGNUM+9)
+#define IA64_GR10_REGNUM	(IA64_GR0_REGNUM+10)
+#define IA64_GR11_REGNUM	(IA64_GR0_REGNUM+11)
+#define IA64_GR12_REGNUM	(IA64_GR0_REGNUM+12)
+#define IA64_GR31_REGNUM	(IA64_GR0_REGNUM+31)
+#define IA64_GR32_REGNUM	(IA64_GR0_REGNUM+32)
+#define IA64_GR127_REGNUM	(IA64_GR0_REGNUM+127)
+
+/* Floating point registers; 128 82-bit wide registers */
+#define IA64_FR0_REGNUM		128
+#define IA64_FR1_REGNUM		(IA64_FR0_REGNUM+1)
+#define IA64_FR2_REGNUM		(IA64_FR0_REGNUM+2)
+#define IA64_FR8_REGNUM		(IA64_FR0_REGNUM+8)
+#define IA64_FR9_REGNUM		(IA64_FR0_REGNUM+9)
+#define IA64_FR10_REGNUM	(IA64_FR0_REGNUM+10)
+#define IA64_FR11_REGNUM	(IA64_FR0_REGNUM+11)
+#define IA64_FR12_REGNUM	(IA64_FR0_REGNUM+12)
+#define IA64_FR13_REGNUM	(IA64_FR0_REGNUM+13)
+#define IA64_FR14_REGNUM	(IA64_FR0_REGNUM+14)
+#define IA64_FR15_REGNUM	(IA64_FR0_REGNUM+15)
+#define IA64_FR16_REGNUM	(IA64_FR0_REGNUM+16)
+#define IA64_FR31_REGNUM	(IA64_FR0_REGNUM+31)
+#define IA64_FR32_REGNUM	(IA64_FR0_REGNUM+32)
+#define IA64_FR127_REGNUM	(IA64_FR0_REGNUM+127)
+
+/* Predicate registers; There are 64 of these one bit registers.
+   It'd be more convenient (implementation-wise) to use a single
+   64 bit word with all of these register in them.  Note that there's
+   also a IA64_PR_REGNUM below which contains all the bits and is used for
+   communicating the actual values to the target. */
+
+#define IA64_PR0_REGNUM		256
+#define IA64_PR1_REGNUM		(IA64_PR0_REGNUM+1)
+#define IA64_PR2_REGNUM		(IA64_PR0_REGNUM+2)
+#define IA64_PR3_REGNUM		(IA64_PR0_REGNUM+3)
+#define IA64_PR4_REGNUM		(IA64_PR0_REGNUM+4)
+#define IA64_PR5_REGNUM		(IA64_PR0_REGNUM+5)
+#define IA64_PR6_REGNUM		(IA64_PR0_REGNUM+6)
+#define IA64_PR7_REGNUM		(IA64_PR0_REGNUM+7)
+#define IA64_PR8_REGNUM		(IA64_PR0_REGNUM+8)
+#define IA64_PR9_REGNUM		(IA64_PR0_REGNUM+9)
+#define IA64_PR10_REGNUM	(IA64_PR0_REGNUM+10)
+#define IA64_PR11_REGNUM	(IA64_PR0_REGNUM+11)
+#define IA64_PR12_REGNUM	(IA64_PR0_REGNUM+12)
+#define IA64_PR13_REGNUM	(IA64_PR0_REGNUM+13)
+#define IA64_PR14_REGNUM	(IA64_PR0_REGNUM+14)
+#define IA64_PR15_REGNUM	(IA64_PR0_REGNUM+15)
+#define IA64_PR16_REGNUM	(IA64_PR0_REGNUM+16)
+#define IA64_PR17_REGNUM	(IA64_PR0_REGNUM+17)
+#define IA64_PR18_REGNUM	(IA64_PR0_REGNUM+18)
+#define IA64_PR19_REGNUM	(IA64_PR0_REGNUM+19)
+#define IA64_PR20_REGNUM	(IA64_PR0_REGNUM+20)
+#define IA64_PR21_REGNUM	(IA64_PR0_REGNUM+21)
+#define IA64_PR22_REGNUM	(IA64_PR0_REGNUM+22)
+#define IA64_PR23_REGNUM	(IA64_PR0_REGNUM+23)
+#define IA64_PR24_REGNUM	(IA64_PR0_REGNUM+24)
+#define IA64_PR25_REGNUM	(IA64_PR0_REGNUM+25)
+#define IA64_PR26_REGNUM	(IA64_PR0_REGNUM+26)
+#define IA64_PR27_REGNUM	(IA64_PR0_REGNUM+27)
+#define IA64_PR28_REGNUM	(IA64_PR0_REGNUM+28)
+#define IA64_PR29_REGNUM	(IA64_PR0_REGNUM+29)
+#define IA64_PR30_REGNUM	(IA64_PR0_REGNUM+30)
+#define IA64_PR31_REGNUM	(IA64_PR0_REGNUM+31)
+#define IA64_PR32_REGNUM	(IA64_PR0_REGNUM+32)
+#define IA64_PR33_REGNUM	(IA64_PR0_REGNUM+33)
+#define IA64_PR34_REGNUM	(IA64_PR0_REGNUM+34)
+#define IA64_PR35_REGNUM	(IA64_PR0_REGNUM+35)
+#define IA64_PR36_REGNUM	(IA64_PR0_REGNUM+36)
+#define IA64_PR37_REGNUM	(IA64_PR0_REGNUM+37)
+#define IA64_PR38_REGNUM	(IA64_PR0_REGNUM+38)
+#define IA64_PR39_REGNUM	(IA64_PR0_REGNUM+39)
+#define IA64_PR40_REGNUM	(IA64_PR0_REGNUM+40)
+#define IA64_PR41_REGNUM	(IA64_PR0_REGNUM+41)
+#define IA64_PR42_REGNUM	(IA64_PR0_REGNUM+42)
+#define IA64_PR43_REGNUM	(IA64_PR0_REGNUM+43)
+#define IA64_PR44_REGNUM	(IA64_PR0_REGNUM+44)
+#define IA64_PR45_REGNUM	(IA64_PR0_REGNUM+45)
+#define IA64_PR46_REGNUM	(IA64_PR0_REGNUM+46)
+#define IA64_PR47_REGNUM	(IA64_PR0_REGNUM+47)
+#define IA64_PR48_REGNUM	(IA64_PR0_REGNUM+48)
+#define IA64_PR49_REGNUM	(IA64_PR0_REGNUM+49)
+#define IA64_PR50_REGNUM	(IA64_PR0_REGNUM+50)
+#define IA64_PR51_REGNUM	(IA64_PR0_REGNUM+51)
+#define IA64_PR52_REGNUM	(IA64_PR0_REGNUM+52)
+#define IA64_PR53_REGNUM	(IA64_PR0_REGNUM+53)
+#define IA64_PR54_REGNUM	(IA64_PR0_REGNUM+54)
+#define IA64_PR55_REGNUM	(IA64_PR0_REGNUM+55)
+#define IA64_PR56_REGNUM	(IA64_PR0_REGNUM+56)
+#define IA64_PR57_REGNUM	(IA64_PR0_REGNUM+57)
+#define IA64_PR58_REGNUM	(IA64_PR0_REGNUM+58)
+#define IA64_PR59_REGNUM	(IA64_PR0_REGNUM+59)
+#define IA64_PR60_REGNUM	(IA64_PR0_REGNUM+60)
+#define IA64_PR61_REGNUM	(IA64_PR0_REGNUM+61)
+#define IA64_PR62_REGNUM	(IA64_PR0_REGNUM+62)
+#define IA64_PR63_REGNUM	(IA64_PR0_REGNUM+63)
+
+
+/* Branch registers: 8 64-bit registers for holding branch targets */
+#define IA64_BR0_REGNUM		320
+#define IA64_BR1_REGNUM		(IA64_BR0_REGNUM+1)
+#define IA64_BR2_REGNUM		(IA64_BR0_REGNUM+2)
+#define IA64_BR3_REGNUM		(IA64_BR0_REGNUM+3)
+#define IA64_BR4_REGNUM		(IA64_BR0_REGNUM+4)
+#define IA64_BR5_REGNUM		(IA64_BR0_REGNUM+5)
+#define IA64_BR6_REGNUM		(IA64_BR0_REGNUM+6)
+#define IA64_BR7_REGNUM		(IA64_BR0_REGNUM+7)
+
+/* Virtual frame pointer; this matches IA64_FRAME_POINTER_REGNUM in
+   gcc/config/ia64/ia64.h. */
+#define IA64_VFP_REGNUM		328
+
+/* Virtual return address pointer; this matches IA64_RETURN_ADDRESS_POINTER_REGNUM
+   in gcc/config/ia64/ia64.h. */
+#define IA64_VRAP_REGNUM	329
+
+/* Predicate registers: There are 64 of these 1-bit registers.  We
+   define a single register which is used to communicate these values
+   to/from the target.  We will somehow contrive to make it appear that
+   IA64_PR0_REGNUM thru IA64_PR63_REGNUM hold the actual values. */
+#define IA64_PR_REGNUM		330
+
+/* Instruction pointer: 64 bits wide */
+#define IA64_IP_REGNUM		331
+
+/* Process Status Register */
+#define IA64_PSR_REGNUM		332
+
+/* Current Frame Marker (Raw form may be the cr.ifs) */
+#define IA64_CFM_REGNUM		333
+
+/* Application registers; 128 64-bit wide registers possible, but some
+  of them are reserved */
+#define IA64_AR0_REGNUM		334
+#define IA64_KR0_REGNUM		(IA64_AR0_REGNUM+0)
+#define IA64_KR7_REGNUM		(IA64_KR0_REGNUM+7)
+
+#define IA64_RSC_REGNUM		(IA64_AR0_REGNUM+16)
+#define IA64_BSP_REGNUM		(IA64_AR0_REGNUM+17)
+#define IA64_BSPSTORE_REGNUM	(IA64_AR0_REGNUM+18)
+#define IA64_RNAT_REGNUM	(IA64_AR0_REGNUM+19)
+#define IA64_FCR_REGNUM		(IA64_AR0_REGNUM+21)
+#define IA64_EFLAG_REGNUM	(IA64_AR0_REGNUM+24)
+#define IA64_CSD_REGNUM		(IA64_AR0_REGNUM+25)
+#define IA64_SSD_REGNUM		(IA64_AR0_REGNUM+26)
+#define IA64_CFLG_REGNUM	(IA64_AR0_REGNUM+27)
+#define IA64_FSR_REGNUM		(IA64_AR0_REGNUM+28)
+#define IA64_FIR_REGNUM		(IA64_AR0_REGNUM+29)
+#define IA64_FDR_REGNUM		(IA64_AR0_REGNUM+30)
+#define IA64_CCV_REGNUM		(IA64_AR0_REGNUM+32)
+#define IA64_UNAT_REGNUM	(IA64_AR0_REGNUM+36)
+#define IA64_FPSR_REGNUM	(IA64_AR0_REGNUM+40)
+#define IA64_ITC_REGNUM		(IA64_AR0_REGNUM+44)
+#define IA64_PFS_REGNUM		(IA64_AR0_REGNUM+64)
+#define IA64_LC_REGNUM		(IA64_AR0_REGNUM+65)
+#define IA64_EC_REGNUM		(IA64_AR0_REGNUM+66)
+
+/* NAT (Not A Thing) Bits for the general registers; there are 128 of these */
+#define IA64_NAT0_REGNUM	462
+#define IA64_NAT31_REGNUM	(IA64_NAT0_REGNUM+31)
+#define IA64_NAT32_REGNUM	(IA64_NAT0_REGNUM+32)
+#define IA64_NAT127_REGNUM	(IA64_NAT0_REGNUM+127)
+
+#endif /* TM_IA64_H */
Index: config/ia64/tm-linux.h
===================================================================
RCS file: tm-linux.h
diff -N tm-linux.h
--- /dev/null	Tue May  5 13:32:27 1998
+++ tm-linux.h	Mon Mar 20 15:57:45 2000
@@ -0,0 +1,31 @@
+/* Definitions to target GDB to GNU/Linux on IA-64 Linux.
+   Copyright 1992, 1993 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef TM_LINUX_H
+#define TM_LINUX_H
+
+#define IA64_GNULINUX_TARGET
+
+#include "ia64/tm-ia64.h"
+#include "tm-linux.h"
+
+#define TARGET_ELF64
+
+#endif /* #ifndef TM_LINUX_H */
Index: config/ia64/xm-linux.h
===================================================================
RCS file: xm-linux.h
diff -N xm-linux.h
--- /dev/null	Tue May  5 13:32:27 1998
+++ xm-linux.h	Mon Mar 20 15:57:45 2000
@@ -0,0 +1,37 @@
+/* Native support for GNU/Linux, for GDB, the GNU debugger.
+   Copyright (C) 1999 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef XM_LINUX_H
+#define XM_LINUX_H
+
+#define HOST_BYTE_ORDER LITTLE_ENDIAN
+
+#define HAVE_TERMIOS
+
+/* This is the amount to subtract from u.u_ar0
+   to get the offset in the core file of the register values.  */
+#define KERNEL_U_ADDR 0x0
+
+#define NEED_POSIX_SETPGID
+
+/* Need R_OK etc, but USG isn't defined.  */
+#include <unistd.h>
+
+#endif /* #ifndef XM_LINUX_H */


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] Notes on QUIT and STREQ et.al.
       [not found] ` <5m1z5emy7b.fsf@jtc.redbacknetworks.com>
@ 2000-04-01  0:00   ` Andrew Cagney
  0 siblings, 0 replies; 5+ messages in thread
From: Andrew Cagney @ 2000-04-01  0:00 UTC (permalink / raw)
  To: jtc; +Cc: GDB Patches

"J.T. Conklin" wrote:

> Even if the testing the first character does have a modest performance
> improvement, I'd rather that whenever a performance issue is found that
> we spend the effort on algorithmic optimizations than micro-optimizing.

Mind if I lift this paragraph?

	Andrew
From eliz@delorie.com Sat Apr 01 00:00:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: gdb-patches@sourceware.cygnus.com
Subject: [PATCH] "make install" in mmalloc to work on MS-DOS
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <200003191215.HAA08359@indy.delorie.com>
X-SW-Source: 2000-q1/msg00781.html
Content-length: 802

The following patch is required so that "make install" would work on
filesystems where libmmalloc.a.n is not a valid file name.

Okay to commit?

2000-03-17  Eli Zaretskii  <eliz@is.elta.co.il>

	* Makefile.in (install): Append "n", not ".n" to libmmalloc.a,
	since the latter loses on DOS 8+3 filesystems.

--- mmalloc/Makefile.i~0	Fri Apr 16 03:55:28 1999
+++ mmalloc/Makefile.in	Fri Mar 17 14:32:50 2000
@@ -121,9 +121,9 @@
 #	./a.out
 
 install:	all
-		$(INSTALL_DATA) $(TARGETLIB) $(libdir)/$(TARGETLIB).n
-		$(RANLIB) $(libdir)/$(TARGETLIB).n
-		mv -f $(libdir)/$(TARGETLIB).n $(libdir)/$(TARGETLIB)
+		$(INSTALL_DATA) $(TARGETLIB) $(libdir)/$(TARGETLIB)n
+		$(RANLIB) $(libdir)/$(TARGETLIB)n
+		mv -f $(libdir)/$(TARGETLIB)n $(libdir)/$(TARGETLIB)
 
 $(TARGETLIB):	$(TARGETOBJS)
 		$(RM) -rf $@
From ac131313@cygnus.com Sat Apr 01 00:00:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: [RFC] qfThreadExtraInfo -> qThreadExtraInfo
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <38E15968.BE3BC597@cygnus.com>
X-SW-Source: 2000-q1/msg01099.html
Content-length: 1905

This is just part one of the cleanups to the thread code.  It brings
this specific query into line with the spec.  Given it isn't deployed in
the field the change is ok.

I've other fixes but they aren't as urgent.

	Andrew
Index: gdb/ChangeLog
Tue Mar 28 18:28:40 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* remote.c (remote_threads_extra_info): Replace qfThreadExtraInfo
 	with qThreadInfo.

Index: gdb/doc/ChangeLog
Tue Mar 28 18:28:45 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* gdb.texinfo (Protocol): Replace ``qfThreadExtraInfo'' with
 	qThreadInfo.

Index: gdb/remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.6
diff -p -r1.6 remote.c
*** remote.c	2000/03/21 01:22:05	1.6
--- remote.c	2000/03/28 23:57:53
*************** remote_threads_extra_info (struct thread
*** 1654,1660 ****
  
    if (use_threadextra_query)
      {
!       sprintf (bufp, "qfThreadExtraInfo,%x", tp->pid);
        putpkt (bufp);
        getpkt (bufp, PBUFSIZ, 0);
        if (bufp[0] != 0)
--- 1654,1660 ----
  
    if (use_threadextra_query)
      {
!       sprintf (bufp, "qThreadExtraInfo,%x", tp->pid);
        putpkt (bufp);
        getpkt (bufp, PBUFSIZ, 0);
        if (bufp[0] != 0)
Index: gdb/doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.9
diff -p -r1.9 gdb.texinfo
*** gdb.texinfo	2000/03/28 16:46:24	1.9
--- gdb.texinfo	2000/03/28 23:58:40
*************** respond to each reply with a request for
*** 9461,9467 ****
  (lower-case el, for @code{'last'}).
  
  @item extra thread info
! @tab @code{qfThreadExtraInfo,}@var{<id>}
  @tab
  @item
  @tab
--- 9461,9467 ----
  (lower-case el, for @code{'last'}).
  
  @item extra thread info
! @tab @code{q}@code{ThreadExtraInfo}@code{,}@var{id}
  @tab
  @item
  @tab
From kingdon@redhat.com Sat Apr 01 00:00:00 2000
From: Jim Kingdon <kingdon@redhat.com>
To: gdb-patches@sourceware.cygnus.com
Subject: Re: patch: convert gdbserver to autoconf, add netbsd/i386 support
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <bwvo9c3l2.fsf@rtl.cygnus.com>
References: <5mn1p88ma8.fsf@jtc.redbacknetworks.com> <20000210192010.A12329@cygnus.com> <38A4FA26.B8C19E9A@cygnus.com>
X-SW-Source: 2000-q1/msg00135.html
Content-length: 137

> Its fine with me.

Looks like approval to me.  Checked in.

I didn't update the gdbserver/configure file beyond the one submitted.
From rdb@localhost Sat Apr 01 00:00:00 2000
From: Rodney Brown <rdb@localhost>
To: gdb-patches@sourceware.cygnus.com
Subject: 000215 some warning removal
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <200002171136.WAA00358@ppp110.dyn136.pacific.net.au>
X-SW-Source: 2000-q1/msg00222.html
Content-length: 2780

The hppah-nat.c patch is needed to build on hpux10.20.
The mmalloc, ui-out.c and remote.c patches are warning elimination.

2000-02-17  RodneyBrown@pmsc.com
	* ui-out.c:ui_out_set_flags Warning removal/fix
	* hppah-nat.c wait.h => gdb_wait.h
	* remote.c complete initializer
	* mmalloc/mm.c unistd.h for sbrk, lseek declaration
	* mmalloc/attach.c unistd.h for lseek declaration
	* mmalloc/mmap-sup.c unistd.h for lseek declaration
	* mmalloc/sbrk-sup.c unistd.h for sbrk declaration

--- gdb/ui-out.c.orig	Thu Feb  3 15:14:36 2000
+++ gdb/ui-out.c	Thu Feb 17 15:16:13 2000
@@ -492,7 +492,7 @@
 {
   int oldflags;
 
-  uiout->flags != mask;
+  uiout->flags |= mask;
 
   return oldflags;
 }
--- gdb/hppah-nat.c.orig	Thu Dec 23 08:45:06 1999
+++ gdb/hppah-nat.c	Wed Feb 16 19:39:50 2000
@@ -28,7 +28,7 @@
 #include "target.h"
 #include <sys/ptrace.h>
 #include "gdbcore.h"
-#include <wait.h>
+#include "gdb_wait.h"
 #include <signal.h>
 
 extern CORE_ADDR text_end;
--- gdb/remote.c.orig	Wed Feb  9 19:52:47 2000
+++ gdb/remote.c	Thu Feb 17 16:18:46 2000
@@ -425,6 +425,8 @@
 static struct memory_packet_config memory_write_packet_config =
 {
   "memory-write-packet-size",
+  0L,
+  0
 };
 
 static void
@@ -448,6 +450,8 @@
 static struct memory_packet_config memory_read_packet_config =
 {
   "memory-read-packet-size",
+  0L,
+  0
 };
 
 static void
--- mmalloc/sbrk-sup.c.orig	Sat Feb  5 18:30:16 2000
+++ mmalloc/sbrk-sup.c	Thu Feb 17 15:30:50 2000
@@ -19,6 +19,9 @@
 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>	/* Prototypes for sbrk (maybe) */
+#endif
 #include <string.h>	/* Prototypes for memcpy, memmove, memset, etc */
 
 #include "mmprivate.h"
--- mmalloc/mm.c.orig	Thu Feb 17 15:55:33 2000
+++ mmalloc/mm.c	Thu Feb 17 15:38:53 2000
@@ -21,6 +21,9 @@
 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA. */
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>	/* Prototypes for lseek, sbrk (maybe) */
+#endif
 #include "mcalloc.c"
 #include "mfree.c"
 #include "mmalloc.c"
--- mmalloc/attach.c.orig	Thu Feb 17 15:55:34 2000
+++ mmalloc/attach.c	Thu Feb 17 15:38:21 2000
@@ -24,6 +24,9 @@
 #include <fcntl.h> /* After sys/types.h, at least for dpx/2.  */
 #include <sys/stat.h>
 #include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>	/* Prototypes for lseek */
+#endif
 #include "mmprivate.h"
 
 #ifndef SEEK_SET
--- mmalloc/mmap-sup.c.orig	Thu Feb 17 15:55:35 2000
+++ mmalloc/mmap-sup.c	Thu Feb 17 15:37:44 2000
@@ -22,6 +22,9 @@
 
 #if defined(HAVE_MMAP)
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>	/* Prototypes for lseek */
+#endif
 #include <stdio.h>
 #include <fcntl.h>
 #include <sys/mman.h>
From ac131313@cygnus.com Sat Apr 01 00:00:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: GDB Patches <gdb-patches@sourceware.cygnus.com>
Subject: [PATCH] MI - new testsuite directory gdb/testsuite/gdb.mi
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <38B0EEEF.823E44D8@cygnus.com>
X-SW-Source: 2000-q1/msg00274.html
Content-type: multipart/mixed; boundary="----------=_1583534362-29877-26"

This is a multi-part message in MIME format...

------------=_1583534362-29877-26
Content-length: 195

Hello,

The atttatched addes a new gdb.mi testsuite directory.

	Andrew


Mon Feb 21 13:05:36 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* gdb.mi: New directory.
gdb.testsuite.gdb.mi.tar.bz2


------------=_1583534362-29877-26
Content-Type: application/x-bzip2; charset=binary;
 name="gdb.testsuite.gdb.mi.tar.bz2"
Content-Disposition: inline; filename="gdb.testsuite.gdb.mi.tar.bz2"
Content-Transfer-Encoding: base64
Content-Length: 54770

QlpoOTFBWSZTWfa8BfsCOqR/1///q5Z///////////////8JAABgEEEADqwA
BAhhGz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAA1UJoaaDTEwTTQ0YJkYmQwE000NGmCZMmEM
jaQxDBNAwCN6iBkwmAEyYAATEDAAAAJgTAIwAAEwAAAIGTCYATJgABMQMAAA
AmBMAjAAATAAAAJVVP/9VVMjBNMAAATAAAAJgBMAAAAAAAAQxGIGTCYATJgA
BMQMAAAAmBMAjAAATAAAAFRJCBAjQCGgCaACYTQAmgE000wACJjUzVPAjTKj
GmoGnVP/7f+0SSmKsU/8ExU/3Km1R/2Kaf97H/jWNP/orZ/5Y/Q6Oqv0xE/a
qYaLFr/wiSYYp4MeKhqppgmYISPtfmMiDJIkcn8J+1KY/a7Niv4Wn71U3b7V
qt3DFY3/f+d/udmnYhIYrSZhArRSMFVYR3sMKqtH/sNQGpEkfuVERKqQk4SK
g0o0MaaJCYqQFhBw5ITZINpEjStLBBpUkjSRE+tQKKiqkfqYaNKlKoqKqlRV
JUpSqVSpKEIqoipFQpSSKkKkkpRFSpCFSKkMUSSqwr9qpCTFSqkKVSuasVRU
opRVKpSCqVsxGJClVRUkipSqqqqlQVKB/M/5PU/u7tit2Mf8dMVVf/hVViq+
r5tG9T/3eIqiv6Uc1JoSGGhCpVeTGNCER/6qQafY4RHJVUpSlUqqpKKUqqFV
5KxUxSMUxhiRipioxUYU5Nwd7h3uD+l9rZ9ruf8n/3f+TsQeh/6sYf+bk8ne
6uA8FRDq9DzeL71eLzBsSTsdHmw/C0/A2Y2Twf4EKo0qGKKqVRSlUrZiYVFK
0phVOTc3bsSub3tm73qmzk00/+yo2VPxqkYqKKTzVMfSisPerFFP7roxp+Vy
eb3PtOThw+lzTk2OAxRio3U9qVjc+Juadz5k/5mxwr3PBjTkx96nVwr6Erds
Rwpik/5nvY/CpjdifoVHiVHJQVU/KdmJ1SvNzT1OTYeT4nyHk4bJ3KhGz5my
uj4t0T5kNOrZVPlaP+Snvfjburkxux+V63Jscn0vgQ5vi3e9E7Cv/J/ncFd4
YqKqvreD0JOjTcxU3aaaVIqtKmKxiJjGFSqqqYxiJipioUqVVVEqqqqjGMKx
iqqpipNNMDTGJikxSVisVUlYUpRpojSmiqUVRMUYqMVFSmOjolMaYknoc2xw
827h+ZUmytzEw/Eo9quEkn+5Xyt3i6K2fW2Yn+RSOyvsd71PqafM9Dkn3u46
Obs/U7K5PncnxIadnZh0KnV7HsUMUwaQfgbvY71bt3Rp4NmzGHtae9uTspJ6
VSSbKE9jHZObFU2V/7NNKpVK0xGP9LSSe5RNKk2PUKnm0gw6Nh4vN61cIc3p
fiV4OY3JTqnpVNFcn2NnNyaVj6X3PN6H1tG6vyNnuV+h1dWnrbIntbuZ/scn
c/Q3buTZ4ujs0fe9DzV8jxTo4dXe9DzNJoYlV9LwYxjHufW/1P9T5X+p0dU5
n6T8j9Cq0PxtGNDwYxjH8iner3urEdVPQ09DT3P1HZp3MaU09TGNn0ve+dFJ
8FJSp+FUMPJMFV+cUmlJpu6psp5GE+UrRsleL+Fj0K6NnCMchWOhp87Ymz2u
HNJ5vod7ufQj9oJ6WKfa5uj9ynm03d7yfeekr4HM5NjY5MIlKcz8zo2fhH+l
4kOQ6urGOHyOSafjdlVu4dzD0FUr6WJzaPcehWA7x637RU8QqI0SFI83cdzz
eZpTkw5DqxO4Vu0T5lO4qqqqKaVE+dURpQqkiqklRudVR4urFebmYchhW7GH
taYac0/Q0jmnzvBw06qY9j4uqSR1cjhwlHk5u9yROSNmJiEU+LANK0krHNEp
wfIbk2HJsxTo2cMbO9oxsTG6MGJ73VyORXJunVj3CminNsqSYqTEUxVUodkA
0nNU/8H/aV+x4u4eB9TuNKhpKxj9z5yq4Y/gVJ5q2VzSoqnJw7MdFVVVVSqq
lVVVVVVVVU6KxVVVVVVVYrFVVVVVVVVFVXc00mmNNMTTH7GJ9zk9Td3McmKc
I9Kv0KjB9zh2c006J/+GnJyVKpOFMVOrq3fgcPe+LhPe5hyUac2PwNHN0dGz
wbHRySditn2Ppc3Y8jdXc+R0OiVSqlVVUUnqKhPF/oYY8HZ5vrVuhO5UcKiq
qork4e94OxwOFKqMUTGj4oiaR+1w6P4H4m7/1dWO8+t5vIcngcKqPsdnqVH1
qGFV9THi5NlP4lGwf97cYiolGikk8XyvB9Lvdlbn4VOThu3SqmGnBj+J+NVV
VVVVWzq5qTT0tHvdydWkmPwNI+lXeqFU6OG7GMYmH/uaTq+VycyHgw/MrueD
0q/gVitO9+lp6mjufmV7mj1PkfqY/I/qf2H1n8LhyVubt3+5zbsfwt3Jw5ub
hzcmjo2bNnJu2cObZzdHNw5OTdyVw5KcnNzbjZs6Kxp0V0VpybG7DY0xp2bN
mzZurY2bNjZppppsbNMY2bNOjHVzdBs2Y5tnDZw003OSlVycGKrkcmN2kdXN
0acOjGm7o6Ojo0rZu6Oaujopyc2Ix0VjdzYbsNmNjTGmzZs2bNlbGzZsbNNN
NNjZpjGzZs4c3NsHNOaqpwbN3c7k/tPxkMPQ9wh5sNFKn8KkP5yFfSp/qfM5
vwubdIVVVSu5UkUUVFSSJOyoqpP4lTSSqrZjdGNNCqxswe4k2SGzRGko0owk
5EPufF85DESbENzhyfQ/E4el8R87+JPpd5Dq9L0H1Op2V+ox+ZyebwYk4HZ6
DmnB3IinDydnoepzbnmxiqqqqqqm71sexpjSqldz1Or0tj0nDzHi6N1bKn0P
uY9Dyf/Z+55vxvU+V+uRO8T+yVIcP1Jhuqd7js7n7WPB/E+D1vudTs/G9r2P
Bu7P+h+1+9sepU+I5MbK2fpYmHNiT2Pe9T1Pg2N3RjCq/A5NJs2bNMfyMYfv
TTB9D6Td/ye5jwcKqnzqx7EnebtK/ket8VfKrvH409aehOj9SVOqtjo+56nR
X2nD7RycmntY+l6Fe1X6nJ+FTh+tzPar2t3913ENPJWlaaRiIV8rR6070Hqe
l4N3kQrxdz3OTErYrYr0nc2Tk0YQqsKrGAfYknzqoqlFDDHVj7lPJUqiqmxu
Y6mP42zk2bsPBj2NO9oaVDhObo6K+Vs3TmrhSqgqp1Y5O9w3buDZ9rZ0VVVz
c3JjGOb8SVU9jd9zq3GijFT8bweT9r9r7X1P2vofudnN8r9T5mn7He+L1vg/
A4ebHD9b8jTm+CvgnI9rs9zhs07mzZpjGNnCVU+Dd8Hm3FaTBip0eDxfB8Hw
fB8HwfB2c3wfB8Gnwd72vW9r3OHmxw+D4NOb4K+VyfIU9zT9qvxPoYm6oeJD
Hi0nR9L5mKp5qx62HepJ9JyVKR9Ku5QYr8T8B97k+5jc8lIlVDdPlIfleL8L
hp6GPxPQHwUlUknc3dniYw/GqqaSRUruYr5nyoNkGwj1PWftdX7W71P7SvU0
ng9jk3bHrSve4YnV73Nu+L0m7T1PwubCiqpzY+Vw2aQ+RwwntKqqnrdzxcPU
SdlRwn5knJWKxQK5qw0lY/W00qaSThpinyq9KmjkqqxyaaVUmmK3QVhSqrTk
j+Jsx6Ff/hU/gI5KkR+lURYklKlT4xJO0ST0kn51iStoghHCoSVJ/7JSYqVU
kK+xJ3qmP7rDvNIOj6Hqeb0t0frfwFJOaUk6EMU2SAPviSVIgk73MhhUpJBI
81SSGn7RIUkJOZhiSqqpSoqKRHVU0qSRSklUiN2ySViGlElKkhKlSVUEn71G
yJSaUIoqSRhUn7VNCkaFRInskkm7ESqRpSVokxI/AqTShVSfzG0k4cNnzNK+
tWDg2JwTgwFNkwjT+d/YaDSoP77hMKlCqQjkcPoaczY+lokjRR/ZbGjSUwxG
D0KQ73oNne02exsYqK/GwTZREetRJ+V+z+K/WlVlRMpHqiSbOT7N6r7H0n8a
ubZjFV9DGzDZs4cNjhpwzdevZ+VIeCQ+hE+hs8n8SDvVjSk2IfUx/G73e5ni
7zqrhjh4vJXJpzdDh5OatnVhjkrockd6UJ6iVCqwngpI/K8WIk8nDH3KhihO
FSKpMRVfWqTE0qR9qmKkK0YVVVVVVUqqqqHMpiqpVV87m+hs2KqlVVKqqp/G
dGk5tz7lKpWknBFIn4FE6KkNKSP40FCTEc2D5R3oPqSd6k/er86D8z9TxYrh
zP0tne83NyOZXioxh+85HtdnZwnJppipu5tNDs7kHJsg6Iaabn7kQqqVSSEb
kT+0rSKjROSjhsbGkYlYlGMYkhpppVaGDEUpiJNKjRowaUaaYxhiNKJppPce
9IdH3tnZppydjdGzZhDTFMfI+5u0kJ6EYOGiO5ybpSG6bqKqqrGDm02aNxWl
VujoeRhTmm7dUVVKU2c3e2bK0lMUqpKKVRSqoUlbN08FbuRK03JwSgoKkqSq
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
HU2V632O92V4ObdzaOiurd4q9bd0Obh0cnJj4PYx6XJs5tnZjSu94HwbuHpP
I8HtfcpjzUpThWP1Hm+RW7webR3Kh3vSjzIeLg/+HoMHrUlVOxTFfoYxs5ph
p7Uk7KR0Kqu4afS2Pc5JuHm9g0Td+t+N2TxOzdp1aORpzbCsafONOGx6leLm
lR3uHNIburZ4vN3NJs4cPyMVWn6VY6o+t4vFs8EeDhyIf3k7H43DTm9BNPe0
YThjEnwbNDQNmGINMYk07Gmg2Y2Vpsx5MafYx8qu53vyu9pE2cnZwr3uzTd7
CvpbjHMrCmPleBpXi6PMx9796J3niVu5uryYw9T8ryex7HJ3ujvPnfjeZsY0
6Ojo7PyOrm7HeeBXtPJw8270kNg/W0Q9b/mOBpXROg/0tnN6ldmnCK+tjH1o
nrcJHRI+l8zFKQ8Gx1dH1vNpppVY/c9h9CD0uT6HVu8j0qdne2V3vY/wKQ4f
W7nVo5Mdzm5GmjZ9DsfkfUDvQcnVB+d5ncJ3J9rzd7kdz62MUpXMxIYpCnZ7
nwUckobP6WNNN3pNDTYrTE081NhzbtPA/jY3Qrd7Xc2P0MY0pyVPNj7XwdFO
xiuHI2aaSVUqn3qm5iYnNOrDZTdTdTTmxjvVzSu5zVXqdxpyK3Yqt2nek0/Y
p8j5272uTm0/Ark+5h6WiHzNMOTE5K/9VPar3I5McJphyeLZjTds8kck9h+J
yPkSps7ilRVKqFVsrkp0bMNKbldRjZidXCDd2d6aclfewfkV4Heebk2e55Pg
07ncrZXDhj7VR8iJ9xj+t0YifFzTTm/U7kjvVIex5PnfM6p0c1aV0ThJ63Z8
jveh3HNN2zm72x0bt2kT+FXe+8/Qrd8HscO54vS4Q3fgcMcOFIepjZw/rPFy
OFN33vW5Oyeb0vBO9pwBXRHJ0SHJUrkcne3f33N9LzfS/S73c/jPJ+l5vpbv
S+DHBu/uPI9DqwrzdnD2tPtcMe5jqQrgepSY6vmYx5PBppTEhj2vvYo/hUbp
piY+dw2farFe0w/C0NK+YxielX4HvY6lVUqKrvV3B9zY7Nncx2bPS5sfIexz
bEOFboOymz1P2ujgr4q3bvWxs6u49AqcicmOauyp3KadzHYVw2cORyfkdx63
N+d0MVHeiVJ8qo7NnzqbtKSHkdHirFTkpw/WqDEVhyY9r/C+xp0eDm8yaSeb
SaNN02aT8jdp9xDqibvFG7zVuSfS6Oitjo/GxHwROjD3OrD0Pvd7Sk8Xyq7m
zZFObRD4MY9p3Cu5o2Vux9RDkQ2dWN1ep2NPU5m7k+hph6XwY6PgewbtncQ7
Mbpp6HocOrq5Obo3aadBw02cMcFcJO5GK8CsaOY5tObo06NnDo5q2I9Dd8Wz
sjydnzHRyU9ad407xR2TTDvPBPJ5OThw7NMeRXNs7OybKTwJhRVVuc2MOw6u
rZ0cNOrZyeLh6mj8Dveh4PQ8TqByVGnzupRyel6DvVVPFUxOHc0qYxXcOzud
x6lTh5vNpzelhuVppjs6Mbncxw4Y4cMcMc3N5ujh0Y6NOSVzNmN3DThs4dGO
R3GObhj71eCmzZhwp0Y0qc2zorQ4McMcNJu3HRu4Vw4cjhJzVpu05uQxVKVV
dzdVVVKqkxNJSpW6oxuxhjZp3Opup4PxubGyv2PY04ehTh8j+hjwVsebE9I9
KUqqqpKlSlUUqVKKVVJSviQocNMVKqVSlVVVUpSlKnyuzCvUaTo6Ih5mnBTF
Sfc0dENmNKrTTzel8z2G5PFU2T9ruNnBSGPa6GkhyRspzczc9r+hhOZuPqTT
kruboxonViOrEabPwPnelyd7d2dWzSvijq7HztPJw6PMbMeCsfO4dTq7nc7n
B7TT3u405uyu94ujdunVNyvuaNibDsw0N1BinNFbEOTh+QfnY4fFo3afc+lM
GnkknJVVVVSiqiqkoqqqqqqqqqVRERERERERERERERERERERERERERERERER
FVVVVVVVVVFUqvceTcbvJ0d5/Ybh5uTo8iuZGKr0NHsIdnVskTojc2TDSqlV
VSqqp3Ju2NNm6vBgqjsEHxcmNN3CqmxpoaOTs00Obkn2ubduglVVTmg0e5oS
Q0dxDYh8hDThuqp0aaKpU0mMSmEmKR0cmz4EmHDRzO9/qd7wdXNjm+xs9J3G
5wcmO9wel3o5DvN3MjZppjZWPubsPQ3Y+ZUxSeCnNzcwfKrGD8jyYibvN/ad
SHk73RPB0ekhwf2yH9bHDk9TFR7D1myOqJs3adXZ62HtU6uDHk3aR6k0+hpj
mYnJuibNPubtmn0NN3RJG7GDRiu573Jp2Y3e9Cv4x96nVufjY6tPxPN9A7kO
HyPg/E735H3Oz0uY8mmPN96fI+xNnzPNj2sd7T0Pkdk7yhVbgbJhFYQ72jmk
5tmxs5GnNsaK7GFKUpTdhu3bmitzClKUpSmzZVVVVu2NylbmFKVKUpSlKUqq
qofI4Iczk5PSNNOr4OjHD3HM70m42NGmNKI5tlY0Q4Y0/hfFP+l2eTDvet0b
ubodXZ3ObT0uHwcOj1OjTdsnDqibvrVu7ODds5PWel8FfO2fO4HNOTm08VYw
jh5DZDFNnuGP5mxiaMfO5Gyv2Oqv1qfxPzuzg+LHM/E7HV4O9OapVTkoU5Pl
KVyY5K9yp5P3kj0qdVe05PB7jufpe8+U5I3PY7KlUVPFT0ujk8WxPne1s/SP
FzeLq+V7nJ2dzxfIp1Gz5XBw6Hen6U9L8TZ+oh0TZzfIdHqeg5vAKbMe95sc
3V6Hof33e7Or5WO8OygroqQ5qne/G2R4NhiQ6I6qw+JsxH8rox9iphXNXtOj
HZ1TTg4aVPN2cn0vA2Q4IeacMeTknqV9LGzTue5O5+19DZ6jyHsSMf1ug5q8
nZu/nRO96U9CpVHJUwx6isPS0+5s7G5sphRSmKYUUoqcMMKKUxphophSsKmF
UwpimFFMYMKKUUopRSimNI0NJRSilFKKUUopRSilFKKUUopRSilRSmilYYYU
rDDClYYKdmOrTTvdHVseDo8XgnV3GmmlG7Yx+R0Yd7ZOQcDZjZpoVu7nCsbn
DHU3R8p3Obk8G7kr2nJ2TRzdTh2bJDvH51eKoqhO55FbuDwfU6kcJuxweT1s
abK2fI+QdypVSVUkfW+V6UHoOSo7MNleDs06saeLHrabPBu/MqDg+p6Hod6J
yf2VcHJp3t26vxo4Y0qseDHueRhPQY9jsw4U+16XQhoc1T61J0cleLThsScN
m5sQryeLwbkOzYh3iG6iPAk3c3Ns03dHDhwbuoc07N3ZG7dXCnDqrZs5OHR1
IYpDZp0epW7o2dXJpyYJXZW7ThORXgrZjZo3UhU2VzVw8XDSObwJDskr+lyS
dzg6BU8HtPBJ2eDk8DTmQpDmx95Dwehu5vreg8Dq9DDg0cmj5iqp5Emz+p+l
seKfBJTEk9LFSVHiYx3NjYp3KocKVUp4sOFbHVWmkjEmzGzThjTm3cOE/UbN
N0knBwrTTSuHm3MNPFp1bP0OjY0eLqkehWzZIdGMSsUhjhps7yieDchs73Js
9rZu/O974OTojxdzyae8xJ3q6vY9oxR7w5OxOjB9LhXi9g08Cphj7Wxsrvfo
GO49LqkO90c31qpTHrNOrh5ur9bmMd73HucnpcGFdmlGmz63Z7xs8Tsx8DqY
qT+J1adGwiq3bEmPoR73BO8r8Dq9iclK6sSaY/Q+5yObyU/cxPcp8jdh2Vh1
fW2PYqE4exg5KdXtOpOTq3YlUqqoqlOaYmNMU9jGilbJjGzFVVTZjGlQUUqp
SpiqklVjEqsYRzbNkhp5MSTFROjZI9TghzTh9xoh9L5Ts3V2dUhp7lehXteL
doxjuOz0OrxeL3N3NobKbKHRo5vpdXR4uTHJXCYbMYqTobPY02dlYxhu9Rh4
pzMcK3McNMacNODYpSlOEVuc3VzcmmGN2jT+02TTdTZWkphjm4NkrStJybmj
GitFbsbtm7Z9Zu7NnCuDZ6X5z4HI/QfE/tH4T/nP+c8XZ6Xiehs7K9Bs2bPQ
95735Vek9Jwek9J6T0npPSdXoet0V4Ox4vS3bvQ2ebh8h+g+JzPa978Lvd75
nxfgeB4vlDHzonCvqaY/afQ9R5ujvVB3kOr1PndW6uzEdXV4qqubZHRPoIY/
Ij8JDZ0dFdHrfermdxDk8Wk8Hcmz9B1fQfyMepPzJppPsdzkfI6qn4Gh+VyV
1HJw5Kn9bkn1PYQ6PS5tPIh1dHVU3dXsOjk8SpIqJVfOxD8KlVENEkUE/UQ2
IjhpXRWPY2RMGlcJRQ975XztnQnIk4fK6oPzq7GMckbqqo+x4OaK0w+RX0Pv
fjfifjY4fO9bk8UHe7KUpSlKqpUqqVKUqUpTsbqmldXVg7ketVPcfSp5o+p2
cPc8XN4Pxvc9bm+dwdweB5u59RurhXVXyKqsV2Vsqq+5Xcr0q8FfvfUx8p0Y
3VVPQ2dGnVXZXcqqnJXcrk+xjdW6uytz7WKrGMdXkcO86DTd3qqtlfvV4K6m
MeCu9VV7FbK2VsqqxWKqu9XcrkcMcK4VVeKvBXZXermbMd6uqtjox0VVcK9K
uyt1bqqvEw5HI6HQnceJwdxyPE7x4O54K8FbK4N2OiuFdlbnJjqqqqtleStl
eSqrg4Y4VpW7G7Sq5q5K2Vuxu0quSvFXerc72MPcxjwYw0xh3MY7nZs8ivJ5
sY/Cbubq6PQ02V4qqvFW50Y4V4q7lbmMbq3VscmKrZ0cGNKrsrkrqrkqq6K3
V4q6K6nNjmrmqq7KxXtV2V3KqsbO52Vo5mjsOCq7leau872Oauiqror8iuyv
BWK5nJjkqq/vNn9DxfY/0vpTwbFUqm7o8XJ62n7Xe6J2J+NJjFJiKkr+00P6
Gwqon7XDYfpPFiSN1V/W8363reL4J9yiqfW2dzzSTzd40psfMqe1XZ+VufO7
3N87o3c06MdTxcjTZXvflcPyq+dycNPS9Do8zRs3fnYfjabHqc2KpuVux6X7
HgfnfkeCvYpsV0dHc6tNPxNmO9sx+N4MbmPa8XRp/ge50Tkrq8Tk2RVN1FVV
aPe0e597k03Qr2ngVj0Dq4PSe0/OfA/QfM+B8p4nV6DsfB7Xi/GeR8Dg9hu9
bo+DRhWx7GIblIdyfKYk9quaSqroo0/KnJUVTkYoqvnYTq4czFOjZ/ZbNzkr
Z0fI82myq2ebTTSmnix6HDh6Wzk5MfY3bNNmjFeh4mNK5McOGJs0xpo6tMdz
B3q5qelXNVbMO9W6nJ/MV8zyfEnNw/jY4O53PpY7m7T+24dH2urHkbGO8xu0
Q/AnvR5u59LdH3H/o/A+56R7XerH1Oro0RMcKxKeZBsr1MPN0cJufFoqk+Qh
6Dk+V7nROjhyP7aP3OYR8XsOTwaaNNnir86SK4Hc3dVD4q970Gzs2aSTHI5K
2TTHY4bH7jyYrT2uT+47J8Urmg9b0PpPnbuqj+J3vB4N3+RQ9LT7X1tNnN6D
zehOr51FfpYkKrs4aY9zZjo9Rj2GnVzYn/mNnoek9aYp8SscH0K0nD2PyPyN
n4nNs05Kmypwm7FaY/I4MeDsep4ujq/Q9Dm9JsKkehOTT2K6OSvB6zZ871PS
bq3V9zyO85vW8TZ87Y6OT5ni9TyTuflU8mOzuO56GisTqxiSPqSdCkVpiu48
HZ1cObZ0cjvfcx1cnD1MfKrTTGmmJVOydmPJKdzodzudzTucOruY7laaY00Y
V1Y7mjEm6vF2e57H6H436H6HzOrwfO+d5PS9R7XsY2el5lSdVebzebzebzeb
zebq83m83i83oPN5sbPS972vWwxjHsbqpuB61e5WMbKrFYpj4PJj3GmjGlbH
Q8HNo5le1p8Xm00xw95p1fS/uq0xwxs5O9+ps5q6PB8rxNPB4qrH0PIRUKSR
VBKlUqpVFUlUVFKqkVSlVVUpVUUVUqSSKpDdUYQeD0O9+x9T0PQ3aGmyu90b
N3BX4XDhpwrs7PY9DE0om6pJUxGCfajvGnZ1aH1nBDkKOD8T958GyD1v3vSn
Ir1K8W6f5wx1dnk8FRKVyYwiKlQ8FSR1dzc8n9D8jCpp+pJ1Qdj9yf0KMJJB
SHenZPFu2FKqVFKkqqqkShVQ3OGGCSSYxMNMTSpMVINH+civi4Yel/ncEcO8
/Y9jkAhN0iSR7X5mnobBOZoqhFUmFSSSeCYY8FME+spSqqsJJEYUowowJUMV
uxWDRJWKmBVYqTGmIYxiTFf61TDRgSGzdhsIrY2BoqlUqpulKVWxiqqiVWNm
ytBskqTElQqFSpUqYgNKaUKjZpsps2KVjCRhKmmitGhDSViaKYVGzTZWjFSq
2SQxjFNFGmNEY0wU2bNIjZUNk0laaSY0whgxWJNKfeo+t0Vp5p/O9L+N+1GP
i3fyMcNn7H5HcngqnvDEjEhU8WJ6WmD/0V/YaQxCUrZhiq4Q4YTSklSRhJCM
RDEn/UqIE+x6n2m6NiVHDEORTERRojRpiojQSMVJEpBTCSMYYJ7D+JgaDT3K
miSY3JsSFUhTswE2NCpCmMVArCmJMRSORSJpIgpoqSMCqkUkSkKJGKhVTRwc
IU0NigKpKqEVKhKklTcoYpGKcNGFJURNkmEkYSpRpskMNMRiYSqVuTdSqhVN
JINEkVUlUlKSKpCVsxIYhhBSYP77EYKUlKkhUmlDAj1n1j7XsYBpUlbIT+lI
neQ7HMn/i0n/c/5MSJ/yVB/6PJibsbN3Dhw6FCTolE//JCkSYpEpVSJFRKp1
MYqKipVKkkklYxhSqkKFMVJDFGKxUoVjGIhimFRjEMCUYVGKUYqQqoxFEryY
kSSYSSqFBRUk2YYBsqVUkMKiEqqqEqSoiVIqqrTG4SVP+Luf+Lm/8n/e4Vw2
cOHDhE/2vvel/cbIh+keKqqRI02fE/Kxj9bhO9TY96G7HzNk7OjCqxUSq+xT
SqlVVN3m0fYqqin/aY5OSuaU0krGPuVJopzNjGnDRg0fOVMStK/SUn3pSmxz
VGNDGKqu5p/kacmkYhOxXZRVaJKnNjBVJ6T1NIaOjm0mmlVipSMUwxIcMabq
2RXJXyvQbIR5KkSR0bjHNjRo00qH4EnCiKoiVEVs3TdPwuzY5NknVVVVUiqq
qqqqqrY002NGkxw2bNNmkkncSMbtJs05MMaUUdTs9LTkeB2Ypp+QU6DZs/xt
mz3v/gxTRDEFcx5AmIMDTFQeKClSDoqDSDzY9T4P+KH/WqBu0exwYfwvWk+V
0cK5lRyKSRyV+49bH5VT5m6v63+Qn5m796t39at39b4N2zdUn0lNlbMVjZX9
DuTxFSe19D50xJ7HvbP+skmx8pHDEkmKRHyv6HzvW/jfQ/C4e1/Wfyvg/uOj
2Oz/O/obNOTHudnk9x9o8mOT8jm2el8zs/xP9jc/OrZux9DH86et/2v8j0vS
oPlY/tsdz52n91+Np9TxfgfQw8nvd7Su9Pnf87+++Z8WzZVVuxU9T1q+9p0d
lfewe4YqmJNlMVTRK0SfFSeKkh8hJU71R+d9hgfW+VgbEilVVfeJUOag9Cn/
uoj6VSH3vzNKaVySR/oUJ/2v3N0SP9KjFEclTmVVVVKUqqVSUruJKfiV4NmF
djGKqUqlVJJHkrgn7D1Nlfjf6H43vfY/yODoT/I/W/Q97k+RpzfW6Nn6VeB3
vmfa/ysel+Zjyeb0j/C5Ojm2P+hUnoaYk5KOz6WFfW8TTmm4/U/hftdXyFUp
VUqlV63rP53ypX63kw96vlViqlbu54v1Hqe94MK+9s/ielIcPJ+N8XU6Or2P
tbIcEO9s08XITFet8xpp6n+1B8zZzV61P8x6Ekp/Cqvi/WbCRiGJFRFY9xHg
d6qqlVVKUmEK0x/7vY733PS3clK5PU+L5HoK+xu06qcKr7GPkc2zk5OThW74
tnVs5G6tnNjGzZyaOTH0vldHtbPFuoxwUbK0/a2Y9b2NGnc9J9p/pYhNnm7E
/E/rc1P2FSaGn5X1mm7Sn7UJoNK4eb1pscyt0lJ/eVKqFUqkxJUxRVYiVJEq
VKODkkilCSUqSf72IaRJ1TH4zsrREqv3tyeJSlKKkopSVKlOBzJipDhjCvoU
/rVp/yMTqrk/Yw9IlO4VKCkxVVWFFIx/uNNFShSqVRQ0xVYMYqqqmNxGEfFD
GKqOFGydwlFVTHmdThsBuJupjyYj2IlVUFIVKQqSNmNmiKQqsGMYiRMYqIlN
OpUpWkkFYVhhKpVFDYmkqHZyNPIlbjhSlRVDhMUjhiq2NjZhMStMKiqVRQ0k
lMFUVRKJgTTRVKaaRBiYiJSmhSaDRwVsVSqdxgOY9xT6k/sPzD3P9Zh6HzNk
0Tm6Ojwf2niSPpflf97+B+J0ftfjRPBj/g+96X2n8L9ZDkkfY3MflH53535n
5jTqwnYnqJ0PkV8XZ/uD6DZ8hCuj9b9b9T6juIf/Q9JCf8CHvPS9jufQr0EK
cmJ7HyP4H/WdXJPue46OhDZijZPY7kckfMrm/61fuU3d7+N8zvbPIel4HM3a
afM/GY5K4btHUnkpIbnMx6GjB1f3HN9b4nVIch1Y6ilafB4vU7IP/o6ubmmx
7FeLTyV2cG7GhitHg9JppG5Jh/ISe93onV0cnDkQ5vrepzeTwPzJUUVVSsPU
dSNhJJsJKkiYSpIjAwQ4YxUpVFVCpVVFVKopSmiGJBhITCQ7ioNJUg9ioJGx
RUpKpRUkqKRSUkpVRVQqiqkqgqlVVaSRiQKwhiSRKoHVUkkmhSeSQpiSqpQq
qVSlKqqqqVSpVKlFVFVKVEpSgVIUgVBJQpKipQKJKSpUKkqRQUoP0PEQaI04
TEOz2NkbKIkbKqkqpCqIKoVURVRVJFUKhUFSKpUlKlRVVUjGGK8DyNhP0Pwk
OT72Cc34m54keDDY9b1tyNGmnJskOjg0/YKwm5+Zwqpo2Ek8VJD86kiSVSSJ
VJI6uquboPzIVu9z4pVf9T1mPzJGxspjcHQMThUkpDZFcGxJwaVNKxNEYmmE
hHBRJuqSH5Gx+VUgqkel6275jwFUVSqV8CpIMYiSaRKJoaKpUIn6TFDGKrGM
VWMFYxKpCNH4nqfO/cg/uuiae49Dq9p/2v0JH85D/G73+Ih8ydXVMT1PxKKT
uST6UR/wIffA5oc1VW0TB738Ar9jSVR86oxXxV8VfO2Y2VsrZXBpp9DSNlI+
ViGnNyThwxpu5NmOHdB3JNKqn7jvKqqpTSafrKgxVUfqHobwV9ZVUpVVVKVV
VVUpVVVVVVVKpVVSqqqqqpVUpSqqqqqqqqqqqqlKqlVSlKUqqVVKUqqqqpVU
qqpSqqqx8R/ZeuNANOrTsiewj53ehySlKqEUd7vR5PF6H2selVGyq83qVWhz
JG4/pY2cmzT3OTm9z+w7OR0V0cNOTk4cO4nVVV/AkPN5KSoko9b3PSke5Jsj
m5n9kSPbApI6STZP6Chw4YqV6FehzkcxzSFOEm7uFTk5K9L5U3TdsrTdp7Xo
PY3dEjkqq2Yjclcm5NikTHJ62zknuOR1QlJKT4PgUrDTqqqqqxGkbvM+ZSlR
VKocIpHNilfa3Y5v8PvIacPXFDCuZCoxSqfwH4kQVMVSqpVUqqqqqo0qqxHe
mHuFVJ7hIVhN1VWJJJ+NOYqlU5E2RuqqSVVViSbpB73JJBiSYSbBwSqpJwqq
5pCilSYqq06JDtIjYj8avmV+ViThIVOw9QnQ4UFKIpXR8RBp/fK2QlVVbGzd
pyYxj+2ToTZs2YxjGMYxhjFVjGMYrGFcmjRppo00xUTSqolVVQlVVSqKrvYg
xyO8SPN/5PpP/JWlVVYVKVjFVjT7kYlTZTGMSqMNmmNipGKxUQ4OT3p6knuV
SNjZJ2ViDxJPQbwfgPQZIrk8Dh6SUmwmyek6pGKqtntOj1kPmN1UJwqq0kio
x2iJiYqvW/wNIaVVU+dVSj6lfU0w0rTT6mjZWzTZpsqppTnJ4pIWR6RI8kTE
kOh2TYYknNVVUN2P3sYRpSqbNHeVCeh6g6o6yK3IObm9jQjT6RHESKh5K8FS
eShJtJKgknY6E5Kk81MMYx6knEGmlRVSFVVIVVV9TCe4Tveh0eav3tMVpT4t
mydXqeppORzc2OTZ9iuGn8TTHD0NNGnZ+l0bOasTk6sfI5Mfc6uStMK/rfzN
PWpNlPgpw/WK3afKKqFcFeCt34WzY9Dcwx4tjzbpp5MO5XRXexyaYrycjzfy
uTs5uSqrZzdHZs6FTZg5K9SnUrs4eD3u4dHZjo5vW5scnV63J1fiOxzK6P7D
/mabvW4cyTZhjHVU2dw2Ruwkwk+Lh0buTdXc8GmyvQp/M04Vp1VjswxStj+h
jGnJwxps7nvabOHpcMaT0qbvgSdD3thyPY5tNP63NPM2fzPJw3bK8X9BDTYr
zc3Dq+VubPyPaPrU5vndHe5vufgftPNu3eKq/ExhPN7HV6G78Lm8TTm9qDRo
chj9KvSrgfU9iv6WMRH91X2hJ/M/ofcbI9JH2uqf+Bj4PacG5SJ/Qon9wSvi
qT0q736kr0pKqYiYSaSQeSSTcxMEmmIiYHD3EPJ6nJU/eUxjFbNOScnvfM/x
vJu9jokfe7Oqm70sSK72zopj7B+o+JikidzxabK2K+d9T3v5myfYpyKN38rh
u+VVQ2VpybsbNmmzZs2abNmlTZjTY2bNmzGNjGMYwrY7Ozm6K7HoY7nNzdzq
7OE0p0KORydzkcmmlaY0xjRpjSq00xTGMVjCsK2O5w5K7FbN3VydXRwOZsxG
nDq2aNMaaaaaYrGJjGMYxVVSqrq3cKcm7m6OTo4HIo5J0c3CqxjGMYxisVjF
VVVVVTo3cKcmzo4c3RwORRu2OHRyYrGMYqlVUdHDkpwnDkxzcnRwORR0bFUO
jTZThw6Obo5uByKOjRsViqVVR0bN1OHJycNhuUY5KqpHJpspw5N3RsN1GiOG
NKV6Hir0qx6X1jxT53cmx6UiSkhuKqSpDk/mV4JHN+lj9JDk2eaGwmN3i8n2
tnyuD6UGnxaQ4TS8uWuWNmNmmyNFRurm2RsVKpwbGBTTEYYqYRwrEmmIYlKh
KVImz4lOzR2fzKrqqsVuck3Tgxhh/WnDhycm5Dg5HZu2Kps3UobpWFMUxMVW
J/ZahEpfyOZVU4SqlGK71YmkqUqoqKqlYYxJKlIUhsbOFcn8D8L5Gm7hs3fw
K4ehuquhDhUkrdph0YcnNu5KpzacnROHRzbt2Mc2MaVNlOibGxpXRwxXQ6Nl
NHI6NMbObm5scXls358t+TjbfObjdjGOTTTTo5sGNmmnDHDZjY2bN3Js5sdG
nNw3aYrmro6NOGmm6tmN1VWmnJK6K8UOwVVUpVVSsOiqKUVKVKilFSlKlKqU
0HJXoNjClKo0UIqPNUmm6UqVVUqqpSpVKqqqoqqVSlYUoqUmJiYYphSnoaNJ
pwNMVUqKVKVVUpSqKVFUUqKqUpKqUqKqUqKqUqKqUqKqUqKqUqKqJSlSlVKc
nJXoVTD0pWNOphT9KSSeDyIbN3DHCpVCVVKVSSpKU81RjZsxjGMY0aetiTsn
ZJVVVFKkpUlKKVSqVSqVSqVSqVVVUpSUqSlRIpSRVVXmngMeAm6fwomjgUpS
UpFKRShVRVU6BCpSJHCNPyd/ej8BJ4vefe+YJ7EQVw2f5nVs0/6GnQ9DH6Wh
4vY+lMYqtP9z/nfan5ldA/0K7w/Winykn855qqv0MfSj378/ex+Clsiz5f/F
u9r4J8rRimMY+CvS7J66+avWr2afxuSTqnrdU5qSvS/vE+ZyE9o+J/ArwTw+
h6DhD+VpXgclPYe0w06KrxdX7/X6X7T5lTxfeSeL9R5PU+p9Q9TEf4nrSSev
+R7n53td6u5isGMVWMY9p7KktWrS0lq1atWrS0S1fykYyrVq1av9ZPxiHB+V
7mOb8Bj1mmkO/xvJ2du5JJ3PwNm3sf33yPBu373J1TvbnwkSfvfkWYhPS/vP
4n527+N/G02fqdFKfvfWxwrhu05Obm7J/2xJK5uHJjGK/vsdlK707nIg2VJP
51Rjk5t2w2OxhP7b5HzP9D+V9DoSfnPzmOzq0MTuaaKj1MTGlH0P6n43i8Xi
73g8XeQ+Z4jvPqV4MOFIP/hMUm6ST5FJyTh6DExhipJFSvyEnQ/Q4SGOROxS
KrD5j3GzZVf33CMSHuR/GVUVKVE5yJO9XpNzgk05q06OrZs2abNmilSTZ7Bh
waPe5n9T4nWmjc4clYnM00V3O4hwcN26sfK5NmyuxuY6ujmcNm7k8mk2dHR2
FczdN3Nzc2xziScne2czc05K5Cac4ScG5pWzTchu8G5ubuGmjSu9pycnDZPg
+D4Oz2DxY+Dk96mzdh3KK9IkVRKpVCu5K7ld6v8zTT+R9j+h/YcnQo+ZJWBC
qd72tNIVSSVUkUVJE9yom6kjs2buFd7TdMSTdomEkx4PnQ2VJKNyTSoKqCpi
t3g6tPaFRObs+5wx8ivkdWzhWmne6uTwbOjox0dyuboxzdXD9b9Z0fof1MYx
4ucSTrzV2Y7n6DqJ87miTdXgqRipJp8753zvnfO3e5Pset6nmdnuU8TRs5qP
WaOT2va5o2ODg5NNjmSve6qMKqFMYbNnI5NKrzfhfW5D733sJSVO57Hsex7H
scn2Pa6GnuPgpCqVVK8VYqKpuww0r3JK4ewrhTCekQ6Jp4EPNsqipVUqqkk2
TZR6U7PUjufK+1pydkx3D/U+h/dfvf6D+puY3V9TH+Jv/4OTdw2V/mVzcmNm
b9Hodk7lPzFMaV/1vNibFVVPQ/nYPnV+hUaKHyvyJGnJHxe10KcEKlNOr3vy
NknVsQqH8RUeRU/yMYrlIk00nirxVJycydWOrm2R+Z6nij/pHqeRHDo9CdzE
UmJJ5GNleTZim7kYwaeSvJTk7E73J8TSbO4hs4OHjidzbyaY9CY7KjudXZHe
kTs7jp+RzSbObHRW6eDojDk5mxpSw3Syq71GK5sc1TTo6Jzc2z0KTucmMSJV
l8VTsbMfwu9popVV3sd7xeT0eKc/F0bq71e3q9DT85YknZsMHcxO96Xenc5n
ef0mHRydHROZsxJUQ/lJJjq0cOHg7nrPufgY/K/C/K6tnyq8VPxD3PBw/K/K
xw3VyVNH6VRMPyoxJH99o9aqhKpHmpVH6jGlepsxp637n7n7n7nNyc3RFIYo
p4JPcnvbve4RpTZN2EknCfFzU0qNmPBX0NnD1G6sKqnJMTGJiOFNmmxo0+h+
IMep7HvJ0ad4kKpVdX3KV3Ts03Megw6KeLZX2K7n1MPJ/A7nJ2claael3uqt
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
7nxV/U/c2bHNw+L0P+d73Zp+5+h63R4P5z6nU9T70+tXk9Kc3seZw/iT73xe
l5nBX4n6W73OjvfgVj0HRI6KiTZ5uzm73DZs2fO2bNmzh60bu4w0nset8GO4
jZs9Toek4dG6ujd1eLhs8nixw5uT/G7PJwMV2TT6nN8rk4abK7nRyOTd6Wzk
rHQxWOZiaVppjSlVppzP6HoPJ63R+R62O99z8DueDq7OTudHg9byfc/A9Lsd
zGKxWMMV8x5vNs9j6nNyfB/I/Y+Vzexw73g6N3mr5W75Xg+V5uGz2saVzcny
NnzI72nyJMKn9apjhzfU+RubPe7nk5PufnV/rfK/I+h+xw/6XzvmfB+Ihhyf
pVXoRO85vkfte09T1v0kPQPi9ifE9T1PyGn8DzYr3seppJw3cm7YxW7TE8XJ
0Gj1t0/5EKkN0T5SvSVh+F9D6n43ytybPoepX+1+9H7iQqoqpJFVH9hsjD/A
VsqJ6WhupNAmlJKUifte1/0vc9qvpfwNGnc3e1727Gyv/BIdiRFVEH8KhPW/
axO5TofqfsaSPUo6KlKng7n1GH1NDFfkeLHV5MSYmmFU03VXDucPBu5NlcPF
W7Tm2cmGOjhJpX4T8L6XJ2eh1et/CY/yOw5Kk8FdHN+Z1V/O6NmzxYr0OD+J
0fqc3Rw2bOHD+JjdzY4K/I0cnV7XZ1cMOzhyc3Q3dHpaadHknreJ3PF2Ozof
haaaKpzdWzZsdzvdHZjs5uTkbPJ0bNjm002adzZybuEx3tO42bNmjhhhs6Oz
vfmdyujq7K5nNs2c3eaabmHg05Njhs6urhw4Oivc6OpydHi6N3Y6vU6uyt25
u8nRw8Xg08nZ0bPJXoOzyeDzY8X72PJ6H8Cc0Hm5J+grwfQ4Y83sY+iOj/K/
aw+49h+19Svpd7wTkqqh3u48z/of6nDs4blStMOFaPQ09akTcKoSoOiRBSf6
SYTCYSpGx5ujmRslIqUSpJJOHsMbEDCpA+CSoJNkmzoQU3SpNhsoxSVKYpMF
YxFVCqRMQjGiYDdJ8hJsI0JK3cODETZUkqbNDEw2OCcPlU0bI3SuSTkUMbMR
KxhGylHyNxiOY5OE0krucnCjZGFJzchXBoG7mabipsoqq3NDcw0NiNhsYwYi
YwYTqrFV2YpNmO5sDCVKRUV8CFQMT4kGJEYScik0EaTHBGN0iKitMDZFYqUq
oaVit0mMVGxSQxKhSCojZKImIUkaQnJI5uBN05BhwgmkpKlKpJJOEUwlIqjk
UkjmOSQfhep9b9ylcOSdkO8dzZRg2SilSikjEVJJMU0kDCQ+1opRohK6k3TB
UmBVVRVVVVVIYmMKpKqqqqqqkJVQKgmmiNNGm7wcnCtjGMJX2K0xjGMY5NnZ
3HRW6lVJs3eD7j5Tk4RwocOTTubse53nyn2oOY+snwET/Gn4VSo/M7NNE/W/
iT3pJpKG5X7W7Zup95UnN6X1J5qKqSPNP1P+D8ySIT5zqGHk3fMfnfFJ+Fp7
Xg+hWnsV8rGmytg2eLBu2bq0flP8af1qryk0MQ8z9ih8yQ0T7lP+dXCVJoRS
fqIVPkKHZExOiv95CkjCK/wKqo/sofwHtIaP1EP9yP7pPyH/kOBXyoj/YnNU
He6P86f/B9D/ITmTH+4hoh0IbEPE5jvQf9B/5kPQQ6KNkbpJ3O96k7EkVX8q
KV8TD+ch/1k/6k/83ibvJ0MRH+simyvyv9r/S0Paf7EhjB4RjkNJ3PQ/3uT/
cOb534n0H6WnI7lbviQ9iPwt3N3Ozm6MQw7FJMcMR1fI5DwIfhN272I+hPAo
qip0RHDZIWYidyoF3TqdCqdzT+UnDsrk7O57UHJNx60kqRs8DscNiIHNRHgf
M6P2EV6ng0YxVafQ3fQ4SaU9ZDYbFRsxsUxycn0n2oPtRs6HJiDZ9aOET5jd
3I7P3PmU9BipWOGlegxGxuaex9Q7O96SFd70He+srCupCnA8WyOTSVQ7JI71
IV82Ob7Anm/608EHucFPA+Z8zoBu8z5kwh84+ClVIwn0KPmMR8D5ngrHxVjm
8m7Td0etybOHJydUkfnOaPY0kncUJJj6fIe49bdH0hoV5GiROb3GyVSKUN0h
uBukibqj5E+Qr0kPwPrf4XzInJ7z4GKcyGK6sVH2mPN8Ekk+hHqciHUcG59J
8APUn0DCf3iHJ4ub2HR8qSTTDucD1EOhDwIVHcqbKiTucwk7nw9iORDYnN7n
8b/E0Jo0/nVWh2RFPqck7iGMSqlU5D7D7GJ4IqeZ4G5u2IeD6SqhVVU9h6mk
6iQ96kK/hkRw2f61Yjm4SH/Q+5Iwh1GJOB0bAfFBUkqsYxJHzmPufenqXdwq
KKfMin1v6n4AnY+whiBgrycPtI/kMdU/CwrGj63rdHDoqfmR1bEPnUhh+JJE
0aIbhHrVQqfiVMUj53g9r8KO8JUfFCbgVPsIY5PxkKr8aN05GEPifcbI4Q/2
Kntc3VObvblKQ/gKr/KOEeBDZ4ErwfBVYx+cUqqeT6jZG6vB6T3Pg6NyHzKi
Ex8rdIbkPeQwT0PkPWPQQ5kPkGPNBpWmOaE0JohhDopDsQ+mrUmydE/ExJiu
5+YhjudGNzZjHyu53NNlHJXRXJX/w3YcjhTxKaNmGzSVTk2Ich2O53ENivxv
N7UPW/G5I0OHeEqdnztkk2fK3NPe5GK6Kkj6EVIFKJGKnqc3kqvEh8z3Nmz8
jucNK82zd4kN3gdnxaSTk6FTDh1TubEMfIQwh3NCMIbkO8cjD+cjskRDyQUg
f51IwonoVJD7FMUUfO5JInN8SntH3u4hzT6UekhSPNRVaIdDSQ2V9L63m4eS
k8lIqkYp5KR8D/ax9j0PE0ORSH0oO8xEKinQlJ1e0e5T9r8DBpUjdPymEOx5
N3qIesI8XMR5pFEfe/O/kaP/dX7ip7yViIf0o/pFRNGifS2fsf0v9Lkmycis
OSpiaP6WNhTZRORp+I/1PzuaTvUVT6Xg5JJp/wcEORumPyvQ+00ckSeB/mYE
7lTsIlSESSvtdGK/S/uq0/nfvf6386v53pepOH957X6H+BudH639Tm7kY5NJ
zf8z9x0d6ne+d/iTc9zdw0epXRU2JT/M6tJ0bFcjHkn/OqI73i9TGnk6PS2e
k/K9J/tbOb63D/W2cH3EGFcJVFY7jSaf4mMRSiaVNlYo8CsUY2TFK4Tye14s
ep7CGnsSR3H0vYng+DFfEAfMfQxVehwU9DvaYx6E2PSY2aadHc/3va/xv9D5
nqdnZ2dnZ2dnZ2dnZ2bOzs7O93O53NNNNP97vc3Nu0x85u6uGzq6uro6ubq5
uiujo6Ojo6Ojo5Ojo6Ojo6Ojo6NO85uro6Ojh0dHJycnJyf6HDhw4cOHNzdD
m5ubm5ubo7n5HZ/zNObwc3e6vBu73Rjud71DvSikVUlVJOqdHpcho0YOR5hS
U+QV7kg6mxyORyT5CGjEmypTDxaTg2Vs4NFbE2fFBySD1HyKqlUSqkpUbJN0
nBOY5jyHUegekeY5HqB6U7Mf5U9qYJ7z3v9j2tzcnqT/Q/1v1Ng+RN0xKnwT
xTT2jDHtPgaSo9z5BMMSUr5ETTxdHRR63rSBzSSJ+ID0pJJMJ9z+06PUnk9h
6WK0xppzaBsKnpeh8z5nzPmcH2PEntcHNhom6fMqPYphXyPW2d7m73V3u90O
50Y+Lq9LzU+L1PUfM5vS5OytJj3mHsdGmiadHe7nJ5vN5vN5vNzc3Nzc3Nzc
3N8Xpdjs7Ozs7Ozs7Ozqd71JXclGlT1O98U9b5XqOA4c3raD4vWwPN/pdEVj
1qnexVY6JWJ1Th8BNNNncrGhSqSqklVVDGMaPYxNCqrSps9L2Op62zm9jTRO
G7GmzGxppoP5WzE5NzHJp1NGnJs2Q2Vso2KNOaGBWKSMVFUqKooSoUSOG7hN
1aTYm7SG5Km7ZGmNjSlbKxK2bNPIOb2OE2T0sY9SaT4vi5o+RU8XD870Pa+t
9R9oRSUgP8akRCp/nSlKUqpVSqlVKqVUqpVTAVUFVIxWKSqRVFVJVQkxSSJi
qqSqlKiqiJSkiSlKqQlUn2p9D7zq5pun+lQqv1KYqqqq/+pjFSGxsOz7HtfY
6PF/uc38r0vefjOx3j5XQ7kKRXyvi2fibur3sPkUrm5KFfIxHzmmJp3n4GkY
Hc3eaY0mkbvJX3J+E2VwrGzuVXJP2KlVVGNKpp+wwjY/SwjdihjZuY2VurZW
6m5oYkbDc0bjwPueLxcjwdHyMPEr1uh4Or9Jp1bGzZ97T8T0sY/EcObhzNmn
qbK005Mc3VycnNu3dHM5OTHRuxs2Vu5N27Z0NNNlPF3u88VY8VebY3JVD1NM
aNK0+d6nrVjhsrdVKk8k7nk6th7Ule0bMSMY+QQj7ikifSokmAUhUpJ+BiTC
KkqJIoVGioQfWqE0hphs0xBKqJsVMcMIDFSQVRVSDq+d+Z7WlaafrH/1ftfs
fxvnOh5HzPi9j8T+N+R7k73qPNX4xGKVun8z+dD5GzZu2Q3Q6K2cKEqJN31M
aVUJ/IpCfIqJB+FUiDs9j0Oruftdzq5kh9KpD3vF7xo/xPoebTZMVP+D/qf7
H7XDEdH6nqTzeo/gUlVJiYYk/7D4Pc6if5XMkwRP2PaxGncnpfB+cThPmKKV
T4CUTFKhVVKVKlUpSlUopUjBMMUlSqqqqhUjs5qVSqmlKxWFUrFYYVMUrFTB
SqqmKwxoaNClVVNKxKVKYVMFKqqYqTCVKpVTFfSSfY/Kn3K9TGEkrGmNlbJ+
ps3V+tWPyOp0VVV1e0N1JUo7nxSHBIV8X0PlewBw6HiYk7Cnuc3N1PlU/kY+
p1YV+p+pp+9VY0/e/su8OTqGBj7HtHyHtUbE9J871Pa9gnD3o97ROhX8LHyJ
iuGH6Gne+Zw0+LHIbq2abNDZXiQ5NN2xJit1buG7Thw00xs03SR/UpHJKkit
DBMVIErm6O5yc36XN2c02aVWMY6IaUhVIpUK2O56GlcHDE0dnZh1TYxwrs5N
OTY71bJsnJ2RDq8lPseSJ1JJVdnViY3E/K+l/naCA9r9L6ni/pdz+NX1v6mP
crwY+waeao4cKbJ0aCqOSsUj0PW+Dk2TkfUe9RJD3PqelJ4J8hyYEm5SY0xs
CbCe0kp86E9iYKJ7WkIn4VCH0DoKT95SYxGMYrRBNNFYTEpgqKjBiSRTClVi
RExJSJioaYwjGNK0rQqpiJudTmlCofSwkMJORWlQwxKrZoTYTZTEipDGMYwM
UDglVKETRg0wklFIlaU0UUoqmKlRPrSGzCBpUkilVVVVVVKbClKwmJjFJoww
pUqRisMYViQ/K9L+N96v7j+N5vW+Z/W/G2eLZ0Vp+R+4x/Sr5n8ro7OHe3fE
/6T1oMT8aflT7GlVo0fafafgPzH3n3n7D2P+p6Hc7nc72nxfO9JDo09R72Pn
V9T9zo/C/Wf3VbPxuETZ4P8TRJK/vP1kKaUqTqSebzVjH2ubhVfsbvkOGOT4
sPg5PI7CVT1p3P6nm737WET4ObmpG6sQRJwqSJ9x+w2R+Af2U+5Sf4TE/SaU
o/wqaElf5n4z/qPkSf9T1pPmSn3J9qVFVVKqqqiqVU9D9CJ+AhSY+9RWzE/C
fvJCMROSJzOSHBR+gkn9404ByKjA3JubOSGyGiSTZOqJPpRN0jE/Wg2dyoT8
rmTDhhVKpzdxTvcnyN2mjRpWJo0rkP3FczZJEkYjmnciOR0TY8EJUftYoxVV
K5FSc0wTBOEHBo2Gx3kRikIxJOSpSqgqpVKUqlRSpUVKpPBKfyIOTsqh4PA6
uppQHekKqqgSRo8ToHkVPF3lTomE/ckk2NyHQOR0ODRDmnkOaJ8U3G7zK6v/
l3J/CbJOHQxjDCPUiPFwelJDoNHmeSO4nNN0NyHgTyJ2NnA2SmxoE4cFUqpg
m56iGmmlKphWFMVisVEPe8Ek0NPBIE9aPUpVRpU7KmlRpU0qNKqqqqqqqqCo
aMKpSipUmKYVIpUxUaKDCKRoqVUlUxUqmKmKYqMFEoqGisVKppjFUpVUqpVK
qVVSUKFEUSpJFBQ0YYKKkUlEUKFVjGFUVUVWKGkpNJRUUhVTEqSYk0wxVVVa
biqKqKqFVVUpKpVKoVSlJVKqqCqiSVKkVKklIYhieJoYcESldwhiSPU2SVVc
Hkd6pVSfpQ3SdENzdHoKUqpsnMnkKdiYqQ7Jo5Hg3VTDEpVJjEwnVEneTyaK
pVVXNBwdCczcbIIk9KqiUiuFekrveLGGjGFVGJMMSNMSsaVjTvbG7Tc03aTQ
NJMTStNNNNxWkKk2IbNNNGm52SGlKnMnQ5nYdk6jY6sTobjm4djwaaSIGDDw
d7h1KpVOCj2OhzSVKqiv5kfmUncr71YqKqVUY0xJ/GPM/oTuR/7N3Nsm6R97
+wr8ToNlaVOxphikp9LBOStkw/HEk/Y/O2foNMP0pswoUpzPS9b3oit0icys
FJu5MJI2K9rd8WMfF8h1fBsxXM6FdCnsGnubN0kkdz/i3T9Q0abn95U9Cvwt
Pa0NmzZs2aaTEebq9Kqr0vJ6GmPFiD5n7XoeaV4DucH1p3vimiGiYqaYwJpU
hPoYYNIrYqVWjTERhClIVVVppVUrSECsPpaJ+UjcRhsY3YIaDFaSgYx7HNJ8
jZB5mnsQ/0PmMVj+lpNkqaVhUpjCUqKxKwqiqmKSqmxUYxiaY2MVoxTQo0VG
ypGz/O3bGyqm6pN1K2KYqlYxK2VppImiVBoUbFTGzGIStlRp/3GjSV9r5Wmi
pUpurHZ5own53wVB6iGB6x9KTyPNUExFfMf9iDGz8KkHzxZCTkDHN0bubSIj
sH4wdkqVFSoV0VMIkUxSGgj1oP7KJVKpKVKFQqSqQpUKqqKqlSKiUUPmJgGn
5RORyOQpGGyonwPkaQ71RoflKhVRKUeQmDElSd70RJP2JCpD4v1NnRB9RDq9
pJJPUQqD9KkPJUpCtCGKqUifjKQmIYmOz0QgY96lU3ZJJhogPcwbN3cw6FVH
1lTxE02JE3cOTdUQ0etE5JippEOSRzP8rk2SObFYcknJVVUqqVVKVUkqlUYp
I5Ng6EYk8XEjdumzdMKpQxiQqldEHIjmh2c0e9CeSsE4RNxDq5lU4fKrqpVS
NikiV9JumlT6FOrdiUhJslHRUh2eLDobpJO5pJSpO9jBI82yYSP8bZEn/UqQ
R2PQkg7lSRFVIVSqU+BVf6FNCmkwqKrFCSGJJIpKUVKKikpUSlRVKjYk0/yv
F2bN2J2J4MYrFYkblSfUMYSTFbFfK2OGxickdHNsoeolKSp9appUhuo+dSaU
qomypioqpK3YhhSNKmCivoFJghXsQOTBO9PFEwkxO4lJKsEVIipJI/MI/hEe
QbP7HVJH6lfK3YkMSqqQqVW5JPIruf9xWJDdIdyiKYjk0+tFT1PlRyiSeL3m
mElFJGyjSlVpXDSMaYbKaVExjGNMRU3c2E0qGzEbrERErSYxu3aaTZRGJFER
N0lREdknISJFSaOYn6XV1aSdyQlEc1SimJDESdjm2eauCJhSq2FKpKUUKFFV
Wk8DCfnUhPFscCpSoVUo/EkkPYSpMNINElFfkdD0IfFRBSlKEIqiMSPSfc8X
kN34WEOwdn8BMT9qkBpQlfe82MCqxpzRJ6U9SFVUPMRUifM8j6GHU+8r6Xiw
9AlVj9DSYUkfUx+M5BVQqk8nwD5SHeqD4kK+dw+D52kiSel7EToQqJzSQetI
h6pCR5IVFQqJ/qRPWiabPnRipJVeRDHMowpzd5KPJoPFXre16VPyFVGFJUNP
vVubMYU3UlTBhUrdTEiStCkTGysRSK0hUMUpKqqViSKoPeQ9b1OxWzkQ4STG
I3bGzYJskVskge0mFiToYxJGnIVElSUklIqlUqd6mCpuYMSlR3MDH41YDZUh
PBU0nmwYilVRQ2KR3KKrQo4QnDRyVsm5XNjdGjk0kThuQ8zSdkRwc1OTHDq6
N2zhw+4bnM5OTditkJuVo5Acm6bGiHBDEhCc0pTdHk+CuyPcQ9hDsSOiSd6T
m/GId6HZXUie1CvUSPepVYaO90HQfUeSOqpHrU2NMdVIkmSSgnJpj5HZ7D5y
nrAVPFiv0Ip5KabmGEle4hg4bGmzCmmMSmn4B2dnQc0nNQHBFSSdD9ivwPyE
NNNMYxiVicDh0ciHZPoTvP1v2OTgIJOh9CISofapI7zowj8CsIrD6FwjxSQf
RAx1HkkikVJDEIwoT5hXwEkStJI9LhVaKw5iVisaeo2bKqqqv3KwqaeDH6Vb
FSvYxyIfrEKekSeSA/jSSeSeIxiSsIxgkxVJQxSGCpisFQpFJKVIipRDEUUU
qUhBSoyBSpgxIqkKiiRsKJGEiVSG50ieRJOCTdQT1D3uD8Dgw9ZwkOTgnRu0
Feo+pTFB6THcOhUjFRVEwqSqSKkmKxioVUPuU0qVYOjkqq3JupN0hOzCoKkq
kVKpRQp1SJ4P9qYlHiSdT7kHBChSGD2Pa0NGkeDB7T2tjG5po0xjGMYxoiPQ
kidzCJPUr/G5iY/hfQj1exJ9ip5PJ3DSfhOSlIbnVyJo/K3aDdDhPQbHc06J
Em7ZwTGGFaSuZs+t5Js73DSSFORXI5NObG6jh8XNORUd5zT3J4N24qlP43R8
rHNuqpXMTk5PArsroxUkickToqu5KwhXg4jDh4n1K+pjGMYxieThUoqSJJRN
k8k7Or0Mdzq5t3koJPrfY9I7k2KkkkqfOlY8zs9DsiYd5InmqREYSUg5Ig2G
JE8iSRPSqJGHg8lVR+N3K3FMYj+JWwK2Y9qe5UnxfFwZEk/6Uh87sA+RukcP
WmP2qaUTCpTROQbNn0GwfK0SbKmKkmxsgwckRzBGIQ6lckqqj2oK72xshXrO
QclVPYhyHRUinueo73+p7BPUP5UdHvVVVVSqlKkVUiKqVKiqiqE2RD7VSYeC
mjEaeDGDvbtzwH8rmQ5hD5UMcJw6HJum7DcE9SSurmiaMJiVu1IYo6pPxKRP
UpI+VQPF+JIMQ9ik9yvakMY/2q2KmMYaVsiqg9r/ISqiqhUjSdmJpUoV9BKY
YxjGMSsMSmMKkowUUKGCUTClFGEpMOSmKqq0FSsK4GmmMYqqxKxorGJ+lVPq
YpWKqqqvkTGNMVjTorZik02YrDFYxjGJhsbMNlYpsNlYrZjHIbNNnoSHpVJJ
Tkiq7KRMKVUTkpVV8GJ63CPUlemD8qSSQ6PMqlCqKqlVJVRVJSqVEqpFKkVK
VVVFSoUpUqI5DvSm5KUqRNlIVSSKokFURVIVVUjAmlCVRJVJDEqRilUqmNiQ
0SSY4EVzE9buJIdUke9J5NJHtUH3IUI+RzbNOpVQ+DCYkqoUUrFJGKRZJIrG
FS2qYxKomEkxgKhSpFUrTCOZKiRI/K7nZ3PF/S9jyTQ2SWTokkmkxURRUVIk
qJwVFpK5PEqdStz870QiVojklSQqCoKpVKnBu0k5uTZ4orZFKFOFVSqiqquS
aKqkopWgrFRXwY/erxf8X/e0fBSHI9q4WtIOiH4TT8KnCpI8kSoK7khTHDki
YjQaJ3pI0iPFXoKSPW+tjhSqjmYhzPNCibJUpSqqopsxhUqmKVjDFVUVVTFS
SVhKphjGKx8jRg0qujGKaUmytFVHDBRRsphDqSe9j2vegkxPkP1KV2MBKkpS
qSKVVUoQpRSpUlFKqFVCCV70kUnJER3tgppUxUUYwk0TCRpVVhROqm6UxEUE
5Jx63ohE8hpunzCmFVKYKxiKxiMPmfM8BpsTDkbqVwiNFbvSwc0d4NmiSbmG
FOCtk72zRUiiu9h2cNho5P1NJpVSU0KQ05lY2VVRNm6TA0o4IrEUSVjTFaMQ
pUrZjkKxuYrZhoVjcxGitKqFNMcGm6Q5OGm7FSFMcK0lRKrdKnBWzZGKVppT
G5sw4VSqYYVphiYYhhVTTZMaRUcKw3Fdzdg2GyuDRwVu2UwjGySkxVSqaUwh
pOTTuYxsVwbvFs7O5w4bsbmz8jZuNidDoYqk71JNGjCpU5sd40OFcNkcCpps
eL+A/Y8kcOp1VR4tg6GyKg0UIbokMCRilNAlVjdporoxXDSNN1Y3iE4E4Yqq
VLapUwEjYJNnZpX+Ru3blYcne2eTycOG7G5s8mzvcEg70gVJA4IlEkqoVUiK
pKIVCDkwxGP0v0vSe88jkOFeTE5pKiaEYnoRg6qbAKR5EKYQqbpuN3Ibm42G
6fuR7Dd0YUVVJOqpUiopFIj61FUfOg95g/Qp9T6XxaT6n3khO5IT9BISD9B6
1RVUpKiSJ8E+ZVR7WExKj9Cfag9QnqU5EwpPJIelJEkcnuO9jFIlTknkkNww
/Cp/rebm+VPoDd3k6BSoSqoGDElcnREckSU8nzNBwqtlDhWKV708jdIfjV5B
yJH2pPQ2cMdn1PrabvoYxp6GmnJjk5OGm7kxjTk6NKk5JI4InNKrm5O8rm0S
P5mxI6OHV0cObTdVVjmrknirGnZwdDkdDocjRuUpTDkcxiYqYqbK3bmlcKxw
5OE5KSSpKiqjZpu4cm7TdVVjkrkVs3Yxu3Vw05NGGGGjg4NG5SlMOClVgrG7
hu2VwrDk4YabuTk5N2m6qrHCjkGnNwqugwqlVilbK3VBSH9aDEG6N0fpYfpV
o9bISTmlBp9aqwmE0J6kg1JPc2dxCkKJJ4B+JBVSHzsT0p/wcknJGyJU7iV3
P1sJSt1SH7G4YiNKIwRjHrURoimlMVSiYSg/0kkkTmh5E9z7W7GFHJow0qqq
qpWPU0aVsxiVseRCH8iGwhBiSHNIfjKV9z1NCVVaGCyYqUkVUh4FUc3zElTQ
9SJ9T6XMr7n9L63gm5upg8U+hWN1TqfWxu5JP1DQVK/CwqpiVuxh6HRu7Pyt
OZCkPW5ENJw7jDo4UrvHoVVV5MYqsbEO42Y7yHNMVVV1fQpGIOpE6qiTdGkG
NlSEwTG4xJpNmNxzY4GzkaEMckmH87vbK3PJBo3bHN4MNMcncaeCo5CSnMhs
4Kp2dyu9yMSldnNHcxsVpzaaVIaMY5NBUr7HuOiBshDoqQcOg0ciHmkJ5uTm
p1bkdlcnVurTvbO4rubKrccGmOTuY07MY3VyUknIx5MNIoxhiYwxMYxsk/4n
qTFbOTvHMhjyN3N3OTBVQrq5uzZsY0jdJNnNFJu5JDorE0p3McKrm5ujh2Th
1OqDwSaObZw0pwaSKxWhoOhhpIaN1bu5s8VcPFjc0nZ0egrd3EOrkrvY5q8D
72N2yDDHiqaU72ni08E3YHDBRRKjwVMVHcY72KY7yGjZp4orwPBg2VXg5OTq
8m46NImyuTdgjqVwmzEhTc6q3NmNNzdRs7zDd1VyQcni7mzoldnMhjo8VY7m
yaVOFV1YxXRyNDRVO52GNKSFNmzTSlUqlUqlVKqRUjo7xs2OrTwNzuMdHJzR
yY7nQ6Ogdk7ncqdAxGne7lVVVKorZjFVVVVTm8Gzmipp2VpjsrvbHiijs5Mf
73Dk5MRuFVUNK3TGNGnNu3Ic1YabuElVDDhpOzY02RjknDxTk3aR5pD1OrdG
OaOjZhXJs2Sbq9LsxyeCdWHoMdW6bENnN3NNnpcnJ3J2V2Ibu8hWnJ3ORpu3
Q9J1OqtnM3elUTs73g2MN2JPS3Yd7Zu72xohw005q3IY3cmMaTwcNO5s5DYx
4HoQmPBp0dTTZ0JJ0Y6tFSq5KxVRSq03aN2MRph5MdzubHNs4KiiqqJ3qdW7
CGK8E4RilTuSkN1Pa2aY5o0ehTvfIxwrdyU6vQ6nRzdG7k7Pcp0bvM3SN1J7
FUrhu83e2J6FdVRpycmhs4YnVVU2bsN1aVu05o2U4bJ1MaVsjgpyVWIYxVdT
GKqtlJVNk5JzMRXJs7jq/W9Tk5vQ9D1ur1tOE7xTqqeZCvB727R4ODQrueKR
ETvcJJAqojZUm6E0iaTmkNk2VOjq2K2bt3JW70q2OHJyTThXRTm2Y2d72ORs
07Mc1cJzdnc2dTcxUlTc7kw08yLEieamlVRZaqqSSxwkk4OaVVBSiqoROjZz
K7JDk0myNnI2StmkTq7xhpGyYm6qdVdVSaVO5W6aIdGHe2dmnRpw8mO5w6NH
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
VVd44Tcit1RJ5EnepVd4OZ6ymI9xDHRVfQCfWiE5j4t0IwqkqSlcmPcMSDBP
ip8Xxdmk+Lm7k98SH8A3SHmeh0cj3mlYMMKNFftY6CJueohU4cKqqVVVVVVV
hSsYVRVVToP2KbKiSTDGKpWFMMKUpSo4TGGlCqmk0RiGmBMJSByUYlFVGyVh
sHwV6lckqke0jDkpPgwwMYYRjDEqpGMMJMYYJ/saaO5E8FKoU5MOioxoxjTE
xjmpDGiI0iqic0ThKgqVJKlT4ujB8iq2cHzKpNnxTSSPinZUifMSpin/yqH2
E3IlQkqSEeLdRPF9D3pJX42mjSlTEFRjFYKTFJKxiFaaYxX4nmbNKpGyaN31
sbtCbOic26OGhUxiaaJMHY02aIrYY0mK2aVJjFNmJBpGhppjCYjSo2Vs+Vua
Q2NxBpiRoSTETTfRDZW7ZsIldmOwkcE2TRwkOB5OZD6WJXzjCqkTFSHtYqn+
89iEpI2T5lHgO8qIfkeLR/weTwfcqvxIYpFT7lPudz0NJ9zgk8E08xHckiNJ
60RgeY0d4kibyJJP5EhiSSQ+SCSe16io0pOhKqlSoomKwpQ0VFUgidUh95Pl
cJ9isKqSknUqYqDwIcxCMcyDFRVKkFO5H71VUTRJWkdX3aMSHxGPa9r5mNHR
+NrSpKLU+LGL+ArG7hhqqVGmSYqlKlqyt2TG7GNjMKrZTKlVLVVVRozFJUpV
FWqrFZUhUqpUlUqqlS1VS1jGGMwVUxmFUxWUqpaOvWoklVuJWnvSTmYmP61B
jSmJVExhEfKkhOwJjZEU6t1VMMfaQ2fMlJIRSVSaMTAqlVVUlSFUiVUVUVSq
ilKpVSVRWwbvkP62kw3DBuSk3DGGKVsin53qfEnscDFaP1KnkQqc2xVIoo3f
MkJyST97Zuldldz0sSE8W6fKhNKSUr51R8hJ2SQx3pKQpJpZIkmlSqQ0lTAj
FFUElKCVO8hXep86Q2Tcc0+Yk5saTDkMNyuSmmmlVI0UipKqVJipWytNKMTD
GKqfO0+AdybjkpscMFKKUVUlY3aOyQqRUpWyI2K/eqbJJXCsNiYmGJw6Nkmy
NwxhsrY0xXJXCVSqVs2Yk6KmmjZQ0xI3cjRsY2VWm42QqpWjTDSpjhRwmMfp
TZppurhSU0qsVskpilbGGNGytJpSqbNOTH/W03RzYjHJJCqKlSEk4NHDZzbp
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
VSqoUlSVFSUlChRRSphowhSYTSTRzVVeKSsaREeg3SRPQSPFBI0hJNkcHIno
EjTQf0qSPMhyYjqeRgjETFf2GnJ3JB3FJMSipSipVVFSSiSIpzJJIoe9PRsq
lSSiiE3HRUwE0SbvFBu0YiEKrdppCYjvSIlaK0gV5Gmk4DEYqQ2aU/tqTYbK
bNEwNIxhjCaYjQ0mknrcilbNiqbKiqpKlK3KGhRFSFbpjAqhzQUbN1OZUeg5
pT9KIMSH/Q/G/AieZ/GWSSQpFQkcjxfoRBjsSH8ykgqqoiqRKpDqmiFCp6iT
yUqlQaQeo9B6Wz0MOSQoT+NIT4KKSeZ6yf4HBgD9LA+1JTvPQUSh4E0mlVX9
kpkFaIle9TvKj6Ugg0npEUVWzZs+I7khpJ5ooNkkNEkYnQqMH6CH1NH91/dY
8kp5OcHidESOqQ7JNngSTwERVSB9CURD2KkJE5J9KSJuVotKp7kqNIk0h3P3
pCkpU3bNiSqrge1UqkY0+Qk5v0EitK5EbnysTo9j4vEw9qtKpW6JJOSTmpD0
JIqoVZCp0VE0K0U7nzMGzwRE8VRFFJCPnPFJwg0JCeQdUnxSaR8qIdjomydX
pdgnJ6UTvRuCJ4kPFEaRDxRTStmlRMNitNKmFFTFVhJJjBO9jQFbFKUJVSqo
oqpClNFbG7EqkijFGCTEKqoqgwpGKokxJCkilRTCk3IiSdE5IqFK2U//liYP
gkh5q97528ROSNCGz1uSR/3JImyIx+dh3TvUnRjBVR97GJIp4vFHcoxJBx8z
TT3vtY+Ldw/Sxj8bHNpUfYbNJK00xBWHJsc27Zoc2JJ8zTZ6GzRppWzGFVhj
Gzhuc2hslOSc1CGI6N3c5sbEpRXMxJJzVDqx1V1NjZW473I9zHe2buqorkrG
lFSsTCNyng+DFP74w8XcObseCm7o6m7R4HIxuxNmMVzVpsqFeCVyO9wORspV
K5uRiVXRU0+ls4SdRMbp86uaFbKrHZXRJ4qY7mN3ocN3JNlYIV3PBVU9KbE7
huYRHDSYrdTZsrqrxbMV6VdW7HR0STTudW7yfoOrm5N3crTZinRUmKYwx8qm
laQVjq73Zuk2K+lwneoqdlSpWxjucHc7k3cnRXVTgqoqnCgwbqVTkQrHg7nU
rZs6sY5FVzaYQmnQmxDY2Oqt2zT52mybpVUYpjZhjhMMYxjExMUqlUpSV6ld
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

------------=_1583534362-29877-26--
From eliz@delorie.com Sat Apr 01 00:00:00 2000
From: Eli Zaretskii <eliz@delorie.com>
To: gdb-patches@sourceware.cygnus.com
Cc: ezannoni@cygnus.com
Subject: [PATCH] Comparing tv_sec in event-loop.c
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <200003050841.DAA10174@indy.delorie.com>
X-SW-Source: 2000-q1/msg00520.html
Content-length: 989

While working on the select-related changes, I've found a case of
mixing signed and unsigned which could really bite someone.  (In
DJGPP, time_t is unsigned, so the compiler complained.)

Here's the patch:


2000-03-04  Eli Zaretskii  <eliz@is.elta.co.il>

	* event-loop.c (poll_timers): Don't compare delta.tv_sec with
	zero, since time_t might be unsigned.


--- gdb/event-loop.c~0	Mon Feb 21 18:17:16 2000
+++ gdb/event-loop.c	Sat Mar  4 14:38:28 2000
@@ -1114,8 +1105,11 @@ poll_timers (void)
 	}
 
       /* Oops it expired already. Tell select / poll to return
-         immediately. */
-      if (delta.tv_sec < 0)
+         immediately.  (Cannot simply test if delta.tv_sec is negative
+         because time_t might be unsigned.)  */
+      if (timer_list.first_timer->when.tv_sec < time_now.tv_sec
+	  || (timer_list.first_timer->when.tv_sec == time_now.tv_sec
+	      && timer_list.first_timer->when.tv_usec < time_now.tv_usec))
 	{
 	  delta.tv_sec = 0;
 	  delta.tv_usec = 0;
From ac131313@cygnus.com Sat Apr 01 00:00:00 2000
From: Andrew Cagney <ac131313@cygnus.com>
To: Todd Whitesel <toddpw@windriver.com>
Cc: Philippe De Muyter <phdm@macqel.be>, "gdb-patches@sourceware.cygnus.com" <gdb-patches@sourceware.cygnus.com>
Subject: Re: PATCH/RFA: regerror link error
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <38E02D8B.FB289AD1@cygnus.com>
References: <200003280329.TAA16525@alabama.wrs.com>
X-SW-Source: 2000-q1/msg01076.html
Content-length: 539

Todd Whitesel wrote:
> 
> > >         * gnu-regex.c (regerror): Function renamed from `__regerror'.
> >
> > The change is fine.  It's already in the official glibc.
> 
> The -exact- change??
> 
> Is 'regerror' part of the defined API?  I sure hope so. (If it's not, then
> removing the underscores means a new potential namespace conflict.)
> 
> --
> Todd Whitesel
> toddpw @ windriver.com

I believe the change was identical:

http://sourceware.cygnus.com/cgi-bin/cvsweb.cgi/libc/posix/regex.c.diff?r1=1.47&r2=1.48&cvsroot=glibc

	Andrew
From fnasser@redhat.com Sat Apr 01 00:00:00 2000
From: Fernando Nasser <fnasser@redhat.com>
To: David Whedon <davidw@gordian.com>
Cc: gdb-patches@sourceware.cygnus.com, Elena Zannoni <ezannoni@cygnus.com>
Subject: Re: [REPOST] patch: command deprecator
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <38B3FBAD.7E7664A5@redhat.com>
References: <Pine.BSF.3.96.1000222201302.23851V-100000@ares.gordian.com>
X-SW-Source: 2000-q1/msg00334.html
Content-length: 5014

David,

I have not looked in the details, but this is looks like a model
submission, with testcase, documentation fixes etc.  Thank you very
much.

The maintainers are both Elena and I.  I am leaving for one week, so I
wonder if Elena could do me a favor of dealing with your patch.  Will
you Elena?  Please...

Cheers,
Fernando

David Whedon wrote:
> 
> I cleaned up my patch, deleted worthless lines, etc. thanks for the
> suggestions Elena. I may not have found all missing gnu-isms, but I gave
> it a shot. I do wonder what the thinking is as far as keeping things
> looking the same within one file, i.e K & R style functions for most, but
> new ones standard.
> 
> I want to make a few quick notes about why I chose to do this the way that
> I did, so things make a bit of sense, and also so that someone can find a
> better way if they want, and it also will help those looking at the logic
> of what I did.
> 
> I decided that I wanted the warning to print out the full command name,
> for example:
> (gdb) set end b
> Warning: command 'set endian big' is deprecated.
> Use 'bigendian'.
> (gdb)
> 
> At the time the command 'big' is called, we only have that command name
> "big".  I thought that a warning message:
> Warning: command 'big' is deprecated.
> 
> would be confusing. Also:
> Warning: command 'set end b' is deprecated.
> 
> looks somewhat dumb.
> 
> I found that I needed therefore to decode the command
> line in order to figure out what the actual command name was.  This is
> because postfix commands (don't know of a better name, I mean the ones
> that come after prefix commands) don't retain any knowledge of their
> prefix command. If they did, then we could simply lookup the prefixname on
> the prefix command, and we would be set.  I don't see an easy way of
> adding that info since when a command is added it is added to a list, and
> that list doesn't have any knowledge of the commands that are using it
> (the list) as a prefixlist (I'd call it a postfixlist).
> 
> This led me to write lookup_cmd_composition which is admittedly an
> iterative version of lookup_cmd_1.  The recursive version can't work (as
> far as I can tell) with what I am trying to do because we need to know
> both the command that is going to be executed _and_ its prefix command.
> 
> In addition, I wanted to be able to deprecate aliases alone. That is,
> deprecate the alias and not the command.
> 
> Tests were done on i686-pc-linux-gnu.
> 
> Test results before:
> 
>                 === gdb Summary ===
> 
> # of expected passes            6356
> # of unexpected failures        13
> # of expected failures          200
> # of unresolved testcases       3
> 
> Test results after, I added about 10 new tests that test the deprecator:
> 
>                 === gdb Summary ===
> 
> # of expected passes            6368
> # of unexpected failures        13
> # of expected failures          200
> # of unresolved testcases       3
> 
> And now, here comes the patch:
> 
> 1999-02-22 David Whedon <dwhedon@gordian.com>
> 
>         * top.c (execute_command): checks all commands beore executing
>         to see if the user needs to be warned that the command is
>         deprecated, warns user if appropriate.
>         (add_info), (add_info_alias), (add_com) , (add_com_alias): changed
>         return values from void to struct cmd_list_element *.
> 
>         * command.c (lookup_cmd_1): check aliases before following link
>         in case user needs to be warned about a deprecated alias.
>         (deprecate_cmd): new exported function for command deprecation,
>         sets flags and posibly a replacement string.
>         (deprecated_cmd_warning): new exported funciton to warn user about
>         a deprecated command.
>         (lookup_cmd_composition): new exported function that determines
>         alias, prefix_command, and cmd based on a string.  This is useful
>         is we want to full name of a command.
> 
>         * command.h : added prototypes for deprecate_cmd,
>         deprecated_warn_user and lookup_cmd_composition, added flags to
>         the cmd_list_element structure, changed return values for
>         add_com_* and add_info_* from void to cmd_list_element.
> 
>         * maint.c : (maintenance_deprecate): new function to deprecate a
>         command.  This exists only so that the testsuite can deprecate
>         commands at runtime and check the warning behavior.
>         (maintenance_undeprecate) : new function, drops deprecated flags.
>         (maintenance_do_deprecate): actually does the (un)deprecation.
>         (initialize_maint_cmds): added the above new deprecate commands.
> 
>         * gdbint.texinfo : added paragraph about command deprecation.
> 
>         * commands.exp : added command deprecator tests.
> 
> 

-- 
Fernando Nasser
Red Hat, Inc. - Toronto                 E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300           Tel:  416-482-2661 ext. 311
Toronto, Ontario   M4P 2C9              Fax:  416-482-6299
From dima@Chg.RU Sat Apr 01 00:00:00 2000
From: Dmitry Sivachenko <dima@Chg.RU>
To: shebs@apple.com
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: typo in gdb.texinfo
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <200003160914.MAA54432@netserv1.chg.ru>
References: <200003151932.WAA39200@netserv1.chg.ru> <38CFEAA9.E74A4A9F@apple.com>
X-SW-Source: 2000-q1/msg00731.html
Content-length: 571

   > 
   > There is no value for GDBINIT!
   > Consider this fix:

   Good catch!  This was supposed to come from the configuration file, but that's
   being phased out, I must have missed the GDBINIT ref.  I'll figure out
   what to
   say here and check something in; it shouldn't be @code{.gdbinit} literally,
   because a) it's not correct for Unix, and b) it's possible to have a config-
   specific name, such as .vxgdbinit for VxWorks.

OK, then it is probably better to replace @value{GDBINIT} with simply
'user initialization file' or something similar.

--dima
From davidw@gordian.com Sat Apr 01 00:00:00 2000
From: David Whedon <davidw@gordian.com>
To: gdb-patches@sourceware.cygnus.com
Subject: problem in /gdb-20000202/include/coff/arm.h
Date: Sat, 01 Apr 2000 00:00:00 -0000
Message-id: <Pine.BSF.3.96.1000203120203.6128A-100000@ares.gordian.com>
X-SW-Source: 2000-q1/msg00073.html
Content-length: 834

struct external_reloc is redefined, gcc doesn't like this.  I don't know
which one is right, or how this should be handled. My guess is that it is
a misapplied diff, from the cvs repository:


===================================================================
RCS file: /cvs/gdb/gdb/include/coff/arm.h,v
retrieving revision 1.1.1.5
retrieving revision 1.1.1.6
diff -u -r1.1.1.5 -r1.1.1.6
--- gdb/include/coff/arm.h      1999/12/22 21:45:34     1.1.1.5
+++ gdb/include/coff/arm.h      2000/01/06 03:07:10     1.1.1.6
@@ -278,8 +278,19 @@
   char r_vaddr[4];
   char r_symndx[4];
   char r_type[2];
+};
+
+#define RELOC struct external_reloc
+#define RELSZ 10
+
+struct external_reloc
+{
+  char r_vaddr[4];
+  char r_symndx[4];
+  char r_type[2];
   char r_offset[4];
 };
 
 #define RELOC struct external_reloc
 #define RELSZ 14
+




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [RFC] Notes on QUIT and STREQ et.al.
       [not found] <200003131412.PAA16094@landau.wins.uva.nl>
@ 2000-03-13  9:15 ` Jim Kingdon
  0 siblings, 0 replies; 5+ messages in thread
From: Jim Kingdon @ 2000-03-13  9:15 UTC (permalink / raw)
  To: gdb-patches

> Well, STRCMP really doesn't make any sense.  A decent compiler in
> combination with appropriate headers will take care of the
> optimization.

I agree.  Trying to second-guess the compiler/library might even be
slower (not that I've done any benchmarking, mind you, just that I
have a hunch that comparing the first word rather than the first byte
might be a win on some architectures/situations).

> I'm not sure if we want STREQ to go.  I think that `STREQ (a, b)' is
> both easier to read and easier to type than `strcmp (a, b) == 0'.

Well, perhaps it is because I have gotten used to the strcmp == 0
idiom, but I find it to be pretty annoying to have to look up a macro
like this (sure, it _probably_ is defined in the obvious way, but you
don't know that for sure when digging into a new program).  Granted
strcmp == 0 is hard to understand until/unless you know the standard C
library well enough for it to be second nature.

As for QUIT, I agree that it should be possible to be a function.  If
the functional call overhead ends up mattering, it is being called too
often (for one thing, the test of quit_flag and interactive_flag are
also going to slow things down unnecessarily).
From fnasser@cygnus.com Mon Mar 13 10:50:00 2000
From: Fernando Nasser <fnasser@cygnus.com>
To: Daniel Berlin <dan@cgsoftware.com>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [PATCH]: add set/show debug, move gdb debugging flags into it
Date: Mon, 13 Mar 2000 10:50:00 -0000
Message-id: <38CD37F8.D1B20C40@cygnus.com>
References: <Pine.LNX.4.10.10003130852170.6968-200000@localhost.localdomain>
X-SW-Source: 2000-03/msg00234.html
Content-length: 4359

Daniel,

Your patch is something we've been looking forward to.  In the perspective of the CLI (which I am the maintainer) I am
eager to see it checked in.  It touches other files though, so I would rather wait for Andrew to see them overnight (his
day).

However...  your patch is removing the old command formats.  I have not yet checked in David Whedon patch for
deprecating commands (I've been *real* busy these days) so we can't use it yet.

This leaves us with two choices: we wait a week or so and use David deprecating thing, or just leave the old commands
alive for now.  In either case you would have to adjust your patch, I hope you don't mind.

Thank you very much for doing this.  This "set xyxsdert$#@%$debug" commands were really weird.

Best regards,
Fernando


Daniel Berlin wrote:
> 
> Attached is a patch to add "set debug" and "show debug", and move the gdb
> debugging stuff (targetdebug,expressiondebug,etc) into those lists.
> 
> I renamed targetdebug,expressiondebug,etc (all the debug settings i
> moved), to remove the "debug" from their name, so you do "set debug target
> 1" rather than "set debug targetdebug 1".
> 
> The new command lists are named setdebuglist/showdebuglist, and are in
> command.c.
> I put set_debug and show_debug into command.c, for lack of a better place.
> The point of all this is to make it much easier to see what debugging
> flags you can set for GDB, and what they were set to. It also declutters
> the set list.
> I also enabled monitordebug, since it said int he comment it was waiting
> for "set debug".
> 
> I have no idea who needs to approve this, since it touches a bunch of
> stuff, but is only related to one domain so to speak.
> 
> I'm working on a changelog entry,  i wanted to get comments first.
> 
> Example of what you get with the patch installed:
> (gdb) help set debug
> Generic command for setting gdb debugging flags
> List of set debug subcommands:
> set debug arch -- Set architecture debugging
> set debug event -- Set event debugging
> set debug expression -- Set expression debugging
> set debug remote -- Set debugging of remote protocol
> set debug serial -- Set serial debugging
> set debug target -- Set target debugging
> set debug varobj -- Set varobj debugging
> Type "help set debug" followed by set debug subcommand name for full
> documentation.
> Command name abbreviations are allowed if unambiguous.
> (gdb)
> 
> (gdb) help show debug
> Generic command for showing gdb debugging flags
> List of show debug subcommands:
> show debug arch -- Show architecture debugging
> show debug event -- Show event debugging
> show debug expression -- Show expression debugging
> show debug remote -- Show debugging of remote protocol
> show debug serial -- Show serial debugging
> show debug target -- Show target debugging
> show debug varobj -- Show varobj debugging
> Type "help show debug" followed by show debug subcommand name for full
> documenta
> tion.
> Command name abbreviations are allowed if unambiguous.
> (gdb)
> (gdb) show debug
> arch:  Architecture debugging is 0.
> event:  Event debugging is 0.
> expression:  Expression debugging is 0.
> remote:  Debugging of remote protocol is 0.
> serial:  Serial debugging is 0.
> target:  Target debugging is 0.
> varobj:  Varobj debugging is 0.
> (gdb) set debug
> "set debug" must be followed by the name of a print subcommand.
> List of set debug subcommands:
> set debug arch -- Set architecture debugging
> set debug event -- Set event debugging
> set debug expression -- Set expression debugging
> set debug remote -- Set debugging of remote protocol
> set debug serial -- Set serial debugging
> set debug target -- Set target debugging
> set debug varobj -- Set varobj debugging
> Type "help set debug" followed by set debug subcommand name for full
> documentati
> on.
> Command name abbreviations are allowed if unambiguous.
> (gdb)
> 
>   ------------------------------------------------------------------------------------------------------------------------
>                     Name: setdebug.diff
>    setdebug.diff    Type: Plain Text (TEXT/PLAIN)
>                 Encoding: BASE64

-- 
Fernando Nasser
Red Hat - Toronto                       E-Mail:  fnasser@cygnus.com
2323 Yonge Street, Suite #300           Tel:  416-482-2661 ext. 311
Toronto, Ontario   M4P 2C9              Fax:  416-482-6299
From rearnsha@arm.com Mon Mar 13 11:20:00 2000
From: Richard Earnshaw <rearnsha@arm.com>
To: gdb-patches@sourceware.cygnus.com
Cc: rearnsha@arm.com
Subject: ARM patch -- extra info about cpsr register
Date: Mon, 13 Mar 2000 11:20:00 -0000
Message-id: <200003131918.TAA21085@cam-mail2.cambridge.arm.com>
X-SW-Source: 2000-03/msg00235.html
Content-length: 632

Time I sorted out some of my local changes...

This patch provides a useful additional decoding of the CPSR register for 
ARM ports of GDB for commands such as "info reg".  It translates the 
setting of the CPSR into a set of mnemonic letters representing the 
settings of the various flag bits as documented in the data sheet (upper 
case for set bits, lower case for clear bits) -- generally I find this 
much more intelligible than the raw numbers.

<date>  Richard Earnshaw (rearnsha@arm.com)

	* arm-tdep.c (arm_print_register_hook): New function.
	* arm/tm-arm.h (PRINT_REGISTER_HOOK): Call it.
	(FLAG_*): New bits in CPSR.



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2000-04-01  0:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <38CCC819.1071F28E@cygnus.com>
2000-03-13  8:28 ` [RFC] Notes on QUIT and STREQ et.al Kevin Buettner
2000-03-13 11:50   ` J.T. Conklin
2000-04-01  0:00 ` Andrew Cagney
     [not found] ` <5m1z5emy7b.fsf@jtc.redbacknetworks.com>
2000-04-01  0:00   ` Andrew Cagney
     [not found] <200003131412.PAA16094@landau.wins.uva.nl>
2000-03-13  9:15 ` Jim Kingdon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox