* 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, + ®buf[REGISTER_BYTE (IA64_FR8_REGNUM)], valbuf); + else + memcpy (valbuf, ®buf[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), + ®isters[REGISTER_BYTE (floatreg)]); + floatreg++; + } + } + + if (struct_return) + { + store_address (®isters[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, + ®isters[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
[parent not found: <5m1z5emy7b.fsf@jtc.redbacknetworks.com>]
* 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 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 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
[parent not found: <200003131412.PAA16094@landau.wins.uva.nl>]
* 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