import gdb-1999-12-13 snapshot
authorJason Molenda <jmolenda@apple.com>
Tue, 14 Dec 1999 01:06:04 +0000 (01:06 +0000)
committerJason Molenda <jmolenda@apple.com>
Tue, 14 Dec 1999 01:06:04 +0000 (01:06 +0000)
63 files changed:
gdb/ChangeLog
gdb/Makefile.in
gdb/blockframe.c
gdb/breakpoint.c
gdb/breakpoint.h
gdb/c-typeprint.c
gdb/c-valprint.c
gdb/config/fr30/tm-fr30.h
gdb/config/h8300/tm-h8300.h
gdb/config/i386/tm-i386nw.h
gdb/config/i386/tm-i386v4.h
gdb/config/m32r/tm-m32r.h
gdb/config/m68k/tm-m68kv4.h
gdb/config/m68k/tm-monitor.h
gdb/config/m88k/tm-delta88v4.h
gdb/config/mcore/tm-mcore.h
gdb/config/mips/tm-mipsv4.h
gdb/config/mn10200/tm-mn10200.h
gdb/config/mn10300/tm-mn10300.h
gdb/config/nm-nbsd.h
gdb/config/sh/tm-sh.h
gdb/config/sparc/nbsd.mh
gdb/config/sparc/nbsd.mt
gdb/config/sparc/nbsdelf.mh [new file with mode: 0644]
gdb/config/sparc/nm-nbsd.h
gdb/config/sparc/nm-nbsdelf.h [new file with mode: 0644]
gdb/config/sparc/tm-sparclite.h
gdb/config/v850/tm-v850.h
gdb/config/xm-nbsd.h
gdb/configure.host
gdb/defs.h
gdb/doc/ChangeLog
gdb/doc/gdbint.texinfo
gdb/eval.c
gdb/event-loop.c
gdb/frame.h
gdb/gdb-events.h
gdb/gdb-events.sh
gdb/gdbarch.c
gdb/gdbarch.h
gdb/gdbarch.sh
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/infptrace.c
gdb/infrun.c
gdb/language.c
gdb/language.h
gdb/m2-exp.y
gdb/main.c
gdb/mips-tdep.c
gdb/remote.c
gdb/target.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/break.exp
gdb/testsuite/gdb.base/setvar.exp
gdb/testsuite/gdb.base/watchpoint.exp
gdb/top.c
gdb/top.h
gdb/tracepoint.c
gdb/valarith.c
sim/common/ChangeLog
sim/common/sim-arange.c
sim/common/sim-options.c

index 43a507c60c43a1cd8e56efd08d2586a5af78b2fc..efe4adb2f3a660dcf21cc7b5bab0460b4bc1442f 100644 (file)
@@ -1,3 +1,200 @@
+1999-12-13  Michael Snyder  <msnyder@cleaver.cygnus.com>
+
+       * breakpoint.h (enum bptype): add new BP type bp_thread_event.
+       This will be used when a target needs to set an invisible 
+       breakpoint to detect events such as thread creation.
+       * breakpoint.c (interlan_breakpoint_number): remove ifdefs.
+       (create_thread_event_breakpoint): new function.
+       (remove_thread_event_breakpoints): new function.
+       (bpstat_what): don't stop at invisible thread_event breakpoints.
+       (update_breakpoints_after_exec): if bp_thread_event breakpoins
+       still exist after an exec, delete them.  They'll need to be 
+       found and installed anew anyway.
+       (print_it_typical): don't announce bp_thread_event breakpoints.
+       (print_one_breakpoint): account for new breakpoint type.
+       (mention): don't mention invisible bp_thread_event breakpoints.
+       (delete_command): don't delete invisible bp_thread_event bp's.
+       (breakpoint_re_set_one): don't touch bp_thread_event bp's.
+       
+Mon Dec 13 11:10:59 1999  Jimmy Guo    <guo@cup.hp.com>
+
+       * language.h (longest_raw_hex_string, longest_local_hex_string,
+       longest_local_hex_string_custom): Declare.
+       * language.c: New functions, and misc. fixes.
+       (longest_raw_hex_string, longest_local_hex_string,
+       longest_local_hex_string_custom): New functions.
+
+       * c-typeprint.c
+       (c_type_print_varspec_prefix,c_type_print_varpsec_suffix): Add
+       TYPE_CODE_TEMPLATE case and default case.
+       (c_type_print_base): Revise how demangled_no_class is found;
+       print '}' before printing local file:line info.
+       * c-valprint.c (c_value_print): print reference type to class.
+
+       * valarith.c (value_binop): Add support for exponentiation,
+       equal, not equal.
+       (my_strcmp): New function.
+       (value_equal,value_less): Add string equality comparison support.
+
+       * m2-exp.y (lex): add default case statement to capture
+       unhandled token and call error().
+
+1999-12-13  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
+
+       * main.c (main): Remove unused variable.
+
+       From Hubert VERSTRAETE (hubertV@bigfoot.com):
+       * main.c (captured_main): Disambiguate command line option '-d' by
+       preferring --directory over --dbx.
+
+       * top.c (return_to_top_level): Do not do exec cleanups if the
+       target is executing. Those cleanups are supposed to be done when
+       the target has stopped.
+
+Mon Dec 13 20:52:37 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * breakpoint.c (do_captured_breakpoint_query,
+       gdb_breakpoint_query): New functions.  Implement a breakpoint
+       query.
+
+       * defs.h (enum gdb_rc): Declare.
+       (gdb_breakpoint_query): Declare.
+
+Mon Dec 13 14:18:06 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * gdb-events.h: Fix typo in description of breakpoint events.
+       * gdb-events.sh: Update.
+
+Mon Dec 13 13:57:26 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * breakpoint.c (ep_type_description_t): Delete.
+       (print_one_breakpoint): Add local declaration of struct
+       ep_type_description.
+
+Mon Dec 13 12:38:31 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * top.h: Delete #include <setjmp.h>.  Moved to top.c.
+       (SIGJMP_BUF, SIGSETJMP, SIGLONGJMP, SIGJMP_BUF, SIGSETJMP,
+       SIGLONGJMP): Delete.  Moved to top.c
+       (error_return, quit_return): Delete extern declarations.
+
+       * top.c: #include <setjmp.h>.
+       (error_return, quit_return): Make static.
+       (SIGJMP_BUF, SIGSETJMP, SIGLONGJMP, SIGJMP_BUF, SIGSETJMP,
+       SIGLONGJMP): Define.
+
+Mon Dec 13 11:54:12 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * tracepoint.c (trace_start_command, tracepoints_info): Print
+       step_count using %ld.
+       * Makefile.in (tracepoint.o): Compile tracepoint.o with -Werror.
+
+1999-12-12  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
+
+       * target.h (enum target_waitkind): Add new enumeration value
+       TARGET_WAITKIND_IGNORE. For inferior events that we should do
+       nothing about.
+
+       * remote.c (remote_async_wait): After each character of console
+       output from the inferior, return to the event loop with an event
+       kind of TARGET_WAITKIND_IGNORE instead of looping here.
+
+       * infrun.c (handle_inferior_event): In case of
+       TARGET_WAITKIND_IGNORE, return immediately, and set things up so
+       that we are still waiting for the inferior.
+
+1999-12-12  Elena Zannoni  <ezannoni@kwikemart.cygnus.com>
+
+       * event-loop.c (handle_timer_event): When calling the timer
+       procedure, use the saved_timer data, not the timer_ptr data,
+       because the latter has been already freed.
+
+Fri Dec 10 12:01:43 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * eval.c (evaluate_subexp): Only inline when GNUC and not STDC.
+
+Sat Dec 11 17:52:03 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * breakpoint.c (print_one_breakpoint): New function.  Move
+       breakpoint print code to here.
+       (breakpoint_1): From here.
+
+Mon Dec  6 20:31:28 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * gdbarch.sh: Replace field init_p with invalid_p.
+       (TARGET_BFD_VMA_BIT): New architecture vector method.  Defaults to
+       architecture bits_per_address.
+       * gdbarch.h, gdbarch.c: Update.
+       * defs.h (TARGET_BFD_VMA_BIT): Provide default of TARGET_PTR_BIT
+       for non- multi-arch case.
+
+       * gdbtypes.h (builtin_type_bfd_vma, builtin_type_ptr,
+       builtin_type_CORE_ADDR): New GDB specific address types.
+       * gdbtypes.c (_initialize_gdbtypes, build_gdbtypes): Initialize
+       new builtin types.
+
+Wed Dec  8 17:48:56 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * config/sparc/nm-nbsd.h (FETCH_INFERIOR_REGISTERS): Delete
+       definition.  Already defined in config/nm-nbsd.h.  Include the
+       more explicit config/nm-nbsd.h.
+
+       * config/sparc/nbsd.mt (TDEPFILES): Move solib.o from here.
+       * config/sparc/nbsd.mh (NATDEPFILES): To here.
+       * config/xm-nbsd.h: #include <sys/param.h> to get definition of
+       NGROUPS needed by <limits.h> and missing on some systems.
+       * config/nm-nbsd.h: Only macro's that match NetBSD definitions
+       with what is expected by solib.c when not SVR4_SHARED_LIBS.
+
+       * configure.host: Add patterns for sparc-*-netbsdaout* and
+       sparc-*-netbsdelf*.
+       * config/sparc/nm-nbsdelf.h: New file.
+       * config/sparc/nbsdelf.mh: New file.
+
+Wed Dec  8 19:56:48 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * frame.h, blockframe.c: Rename default_frame_chain_valid to
+       file_frame_chain_valid.  Rename alternate_frame_chain_valid to
+       func_frame_chain_valid.
+
+       * config/sparc/tm-sparclite.h, config/mips/tm-mipsv4.h,
+       config/m88k/tm-delta88v4.h, config/m68k/tm-m68kv4.h,
+       config/m68k/tm-monitor.h, config/i386/tm-i386nw.h,
+       config/i386/tm-i386v4.h, config/h8300/tm-h8300.h: Update.
+       * mips-tdep.c (mips_gdbarch_init): Update.
+       
+Wed Dec  8 19:12:17 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * blockframe.c (generic_file_frame_chain_valid): Rename
+       generic_file_frame_chain_valid.
+       * frame.h: Update.
+       * config/fr30/tm-fr30.h, config/m32r/tm-m32r.h,
+       config/mn10200/tm-mn10200.h, config/mn10300/tm-mn10300.h,
+       config/sh/tm-sh.h, config/v850/tm-v850.h, config/mcore/tm-mcore.h:
+       Update.
+
+       * blockframe.c (generic_func_frame_chain_valid): New function.
+       Implement dummy-frame equivalent of function based frame chain
+       valid.
+       * frame.h (generic_func_frame_chain_valid): Declare.
+
+Wed Dec  8 16:26:27 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * blockframe.c (alternate_frame_chain_valid,
+       default_frame_chain_valid): Swap implementations.  The change Mon
+       Nov 30 11:18:48 1998 Andrew Cagney <cagney@chook> which converted
+       several macros to functions was backwards.
+
+       * mips-tdep.c (mips_gdbarch_init): Update.  Call
+       alternate_frame_chain_valid and not default_frame_chain_valid.
+
+Wed Dec  8 15:29:48 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * infptrace.c: Simplify handling of <sys/wait.h>. Always include
+       "wait.h" from the ../include/wait.h directory.  #include
+       <sys/wait.h> was added as part of Mon Nov 29 12:14:10 1999 Andrew
+       Cagney <cagney@b1.cygnus.com> but the ChangeLog was omitted.
+
 1999-12-07  Jim Blandy  <jimb@cygnus.com>
 
        Add support for SSE registers in core files.
index b7e548d79d5f767e73945b9946b5f492359767d9..9fbb5e0b72201f61d82d9ddb50c5b28f4293f1ee 100644 (file)
@@ -229,7 +229,7 @@ CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE) \
 ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
 ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
 
-VERSION = 19991207
+VERSION = 19991213
 DIST=gdb
 
 LINT=/usr/5bin/lint
@@ -1158,12 +1158,9 @@ findvar.o: findvar.c $(defs_h) $(gdbcore_h) $(inferior_h) target.h \
 fork-child.o: fork-child.c $(wait_h) $(defs_h) $(gdbcore_h) \
        $(inferior_h) target.h terminal.h gdbthread.h gdb_string.h
 
-# Due to several ``enum enabled'' declaration clashes it is difficult
-# to fix breakpoint.c's compiler warnings.
 tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \
        $(gdbtypes_h) $(expression_h) $(gdbcmd_h) $(value_h) target.h \
        language.h gdb_string.h $(readline_headers) $(remote_h)
-       $(CC) -c $(INTERNAL_WARN_CFLAGS) $(NO_WERROR_CFLAGS) $<
 
 gdbarch.o: gdbarch.c $(defs_h) $(bfd_h) $(gdbcmd_h)
 
index b4f42d2cc5a83f51df9e4c02f3ea5762c00086e1..6ce753ef02e4194badeb1e78b77ef22f72c8fc01 100644 (file)
@@ -41,13 +41,12 @@ void _initialize_blockframe (void);
    frame is the outermost one and has no caller. */
 
 int
-default_frame_chain_valid (chain, thisframe)
+file_frame_chain_valid (chain, thisframe)
      CORE_ADDR chain;
      struct frame_info *thisframe;
 {
   return ((chain) != 0
-         && !inside_main_func ((thisframe)->pc)
-         && !inside_entry_func ((thisframe)->pc));
+         && !inside_entry_file (FRAME_SAVED_PC (thisframe)));
 }
 
 /* Use the alternate method of avoiding running up off the end of the
@@ -55,12 +54,13 @@ default_frame_chain_valid (chain, thisframe)
    the comments in objfiles.h. */
 
 int
-alternate_frame_chain_valid (chain, thisframe)
+func_frame_chain_valid (chain, thisframe)
      CORE_ADDR chain;
      struct frame_info *thisframe;
 {
   return ((chain) != 0
-         && !inside_entry_file (FRAME_SAVED_PC (thisframe)));
+         && !inside_main_func ((thisframe)->pc)
+         && !inside_entry_func ((thisframe)->pc));
 }
 
 /* A very simple method of determining a valid frame */
@@ -1104,7 +1104,7 @@ pc_in_call_dummy_at_entry_point (pc, sp, frame_address)
  * zero, and CALL_DUMMY_LOCATION to AT_ENTRY.  Then you must remember
  * to define PUSH_RETURN_ADDRESS, because no call instruction will be
  * being executed by the target.  Also FRAME_CHAIN_VALID as
- * generic_frame_chain_valid and FIX_CALL_DUMMY as
+ * generic_{file,func}_frame_chain_valid and FIX_CALL_DUMMY as
  * generic_fix_call_dummy.  */
 
 /* Dummy frame.  This saves the processor state just prior to setting
@@ -1270,7 +1270,7 @@ generic_pop_dummy_frame ()
    and false for the CRT0 start-up frame.  Purpose is to terminate backtrace */
 
 int
-generic_frame_chain_valid (fp, fi)
+generic_file_frame_chain_valid (fp, fi)
      CORE_ADDR fp;
      struct frame_info *fi;
 {
@@ -1282,6 +1282,20 @@ generic_frame_chain_valid (fp, fi)
            && !inside_entry_file (FRAME_SAVED_PC (fi)));
 }
 
+int
+generic_func_frame_chain_valid (fp, fi)
+     CORE_ADDR fp;
+     struct frame_info *fi;
+{
+  if (PC_IN_CALL_DUMMY ((fi)->pc, fp, fp))
+    return 1;                  /* don't prune CALL_DUMMY frames */
+  else                         /* fall back to default algorithm (see frame.h) */
+    return (fp != 0
+           && (INNER_THAN (fi->frame, fp) || fi->frame == fp)
+           && !inside_main_func ((fi)->pc)
+           && !inside_entry_func ((fi)->pc));
+}
+
 /* Function: fix_call_dummy
    Stub function.  Generic dumy frames typically do not need to fix
    the frame being created */
index 06d9471c8edf9b56c027c5fbd11bf0335bc97330..1ffda2b1f97f1c2b85651d2e0f615f75b71055ab 100644 (file)
@@ -260,9 +260,7 @@ void set_breakpoint_count PARAMS ((int));
 
 extern int addressprint;       /* Print machine addresses? */
 
-#if defined (GET_LONGJMP_TARGET) || defined (SOLIB_ADD)
 static int internal_breakpoint_number = -1;
-#endif
 
 /* Are we executing breakpoint commands?  */
 static int executing_breakpoint_commands;
@@ -1128,6 +1126,13 @@ update_breakpoints_after_exec ()
        continue;
       }
 
+    /* Thread event breakpoints must be set anew after an exec().  */
+    if (b->type == bp_thread_event)
+      {
+       delete_breakpoint (b);
+       continue;
+      }
+
     /* Step-resume breakpoints are meaningless after an exec(). */
     if (b->type == bp_step_resume)
       {
@@ -1907,6 +1912,13 @@ print_it_typical (bs)
       return PRINT_NOTHING;
       break;
 
+    case bp_thread_event:
+      /* Not sure how we will get here. 
+        GDB should not stop for these breakpoints.  */
+      printf_filtered ("Thread Event Breakpoint: gdb should not stop!\n");
+      return PRINT_NOTHING;
+      break;
+
     case bp_catch_load:
       annotate_catchpoint (bs->breakpoint_at->number);
       printf_filtered ("\nCatchpoint %d (", bs->breakpoint_at->number);
@@ -2832,6 +2844,9 @@ bpstat_what (bs)
        case bp_shlib_event:
          bs_class = shlib_event;
          break;
+       case bp_thread_event:
+         bs_class = bp_nostop;
+         break;
        case bp_catch_load:
        case bp_catch_unload:
          /* Only if this catchpoint triggered should we cause the
@@ -2975,28 +2990,19 @@ bpstat_get_triggered_catchpoints (ep_list, cp_list)
   *cp_list = bs;
 }
 
-/* Print information on breakpoint number BNUM, or -1 if all.
-   If WATCHPOINTS is zero, process only breakpoints; if WATCHPOINTS
-   is nonzero, process only watchpoints.  */
-
-typedef struct
-{
-  enum bptype type;
-  char *description;
-}
-ep_type_description_t;
-
+/* Print B to gdb_stdout. */
 static void
-breakpoint_1 (bnum, allflag)
-     int bnum;
-     int allflag;
+print_one_breakpoint (struct breakpoint *b,
+                     CORE_ADDR *last_addr)
 {
-  register struct breakpoint *b;
   register struct command_line *l;
   register struct symbol *sym;
-  CORE_ADDR last_addr = (CORE_ADDR) -1;
-  int found_a_breakpoint = 0;
-  static ep_type_description_t bptypes[] =
+  struct ep_type_description
+    {
+      enum bptype type;
+      char *description;
+    };
+  static struct ep_type_description bptypes[] =
   {
     {bp_none, "?deleted?"},
     {bp_breakpoint, "breakpoint"},
@@ -3014,6 +3020,7 @@ breakpoint_1 (bnum, allflag)
     {bp_watchpoint_scope, "watchpoint scope"},
     {bp_call_dummy, "call dummy"},
     {bp_shlib_event, "shlib events"},
+    {bp_thread_event, "thread events"},
     {bp_catch_load, "catch load"},
     {bp_catch_unload, "catch unload"},
     {bp_catch_fork, "catch fork"},
@@ -3022,235 +3029,293 @@ breakpoint_1 (bnum, allflag)
     {bp_catch_catch, "catch catch"},
     {bp_catch_throw, "catch throw"}
   };
-
+  
   static char *bpdisps[] =
   {"del", "dstp", "dis", "keep"};
   static char bpenables[] = "nynny";
   char wrap_indent[80];
 
-
-
-  ALL_BREAKPOINTS (b)
-    if (bnum == -1
-       || bnum == b->number)
+  annotate_record ();
+
+  /* 1 */
+  annotate_field (0);
+  printf_filtered ("%-3d ", b->number);
+
+  /* 2 */
+  annotate_field (1);
+  if (((int) b->type > (sizeof (bptypes) / sizeof (bptypes[0])))
+      || ((int) b->type != bptypes[(int) b->type].type))
+    internal_error ("bptypes table does not describe type #%d.",
+                   (int) b->type);
+  printf_filtered ("%-14s ", bptypes[(int) b->type].description);
+
+  /* 3 */
+  annotate_field (2);
+  printf_filtered ("%-4s ", bpdisps[(int) b->disposition]);
+
+  /* 4 */
+  annotate_field (3);
+  printf_filtered ("%-3c ", bpenables[(int) b->enable]);
+  
+  /* 5 and 6 */
+  strcpy (wrap_indent, "                           ");
+  if (addressprint)
+    strcat (wrap_indent, "           ");
+  switch (b->type)
     {
-/*  We only print out user settable breakpoints unless the allflag is set. */
-      if (!allflag
-         && b->type != bp_breakpoint
-         && b->type != bp_catch_load
-         && b->type != bp_catch_unload
-         && b->type != bp_catch_fork
-         && b->type != bp_catch_vfork
-         && b->type != bp_catch_exec
-         && b->type != bp_catch_catch
-         && b->type != bp_catch_throw
-         && b->type != bp_hardware_breakpoint
-         && b->type != bp_watchpoint
-         && b->type != bp_read_watchpoint
-         && b->type != bp_access_watchpoint
-         && b->type != bp_hardware_watchpoint)
-       continue;
+    case bp_none:
+      internal_error ("print_one_breakpoint: bp_none encountered\n");
+      break;
 
-      if (!found_a_breakpoint++)
-       {
-         annotate_breakpoints_headers ();
-
-         annotate_field (0);
-         printf_filtered ("Num ");
-         annotate_field (1);
-         printf_filtered ("Type           ");
-         annotate_field (2);
-         printf_filtered ("Disp ");
-         annotate_field (3);
-         printf_filtered ("Enb ");
-         if (addressprint)
-           {
-             annotate_field (4);
-             printf_filtered ("Address    ");
-           }
-         annotate_field (5);
-         printf_filtered ("What\n");
+    case bp_watchpoint:
+    case bp_hardware_watchpoint:
+    case bp_read_watchpoint:
+    case bp_access_watchpoint:
+      /* Field 4, the address, is omitted (which makes the columns
+        not line up too nicely with the headers, but the effect
+        is relatively readable).  */
+      annotate_field (5);
+      print_expression (b->exp, gdb_stdout);
+      break;
+      
+    case bp_catch_load:
+    case bp_catch_unload:
+      /* Field 4, the address, is omitted (which makes the columns
+        not line up too nicely with the headers, but the effect
+        is relatively readable).  */
+      annotate_field (5);
+      if (b->dll_pathname == NULL)
+       printf_filtered ("<any library> ");
+      else
+       printf_filtered ("library \"%s\" ", b->dll_pathname);
+      break;
+      
+    case bp_catch_fork:
+    case bp_catch_vfork:
+      /* Field 4, the address, is omitted (which makes the columns
+        not line up too nicely with the headers, but the effect
+        is relatively readable).  */
+      annotate_field (5);
+      if (b->forked_inferior_pid != 0)
+       printf_filtered ("process %d ", b->forked_inferior_pid);
+      break;
+      
+    case bp_catch_exec:
+      /* Field 4, the address, is omitted (which makes the columns
+        not line up too nicely with the headers, but the effect
+        is relatively readable).  */
+      annotate_field (5);
+      if (b->exec_pathname != NULL)
+       printf_filtered ("program \"%s\" ", b->exec_pathname);
+      break;
 
-         annotate_breakpoints_table ();
-       }
+    case bp_catch_catch:
+      /* Field 4, the address, is omitted (which makes the columns
+        not line up too nicely with the headers, but the effect
+        is relatively readable).  */
+      annotate_field (5);
+      printf_filtered ("exception catch ");
+      break;
 
-      annotate_record ();
-      annotate_field (0);
-      printf_filtered ("%-3d ", b->number);
-      annotate_field (1);
-      if ((int) b->type > (sizeof (bptypes) / sizeof (bptypes[0])))
-       error ("bptypes table does not describe type #%d.", (int) b->type);
-      if ((int) b->type != bptypes[(int) b->type].type)
-       error ("bptypes table does not describe type #%d?", (int) b->type);
-      printf_filtered ("%-14s ", bptypes[(int) b->type].description);
-      annotate_field (2);
-      printf_filtered ("%-4s ", bpdisps[(int) b->disposition]);
-      annotate_field (3);
-      printf_filtered ("%-3c ", bpenables[(int) b->enable]);
-
-      strcpy (wrap_indent, "                           ");
+    case bp_catch_throw:
+      /* Field 4, the address, is omitted (which makes the columns
+        not line up too nicely with the headers, but the effect
+        is relatively readable).  */
+      annotate_field (5);
+      printf_filtered ("exception throw ");
+      break;
+      
+    case bp_breakpoint:
+    case bp_hardware_breakpoint:
+    case bp_until:
+    case bp_finish:
+    case bp_longjmp:
+    case bp_longjmp_resume:
+    case bp_step_resume:
+    case bp_through_sigtramp:
+    case bp_watchpoint_scope:
+    case bp_call_dummy:
+    case bp_shlib_event:
+    case bp_thread_event:
       if (addressprint)
-       strcat (wrap_indent, "           ");
-      switch (b->type)
        {
-       case bp_watchpoint:
-       case bp_hardware_watchpoint:
-       case bp_read_watchpoint:
-       case bp_access_watchpoint:
-         /* Field 4, the address, is omitted (which makes the columns
-            not line up too nicely with the headers, but the effect
-            is relatively readable).  */
-         annotate_field (5);
-         print_expression (b->exp, gdb_stdout);
-         break;
-
-       case bp_catch_load:
-       case bp_catch_unload:
-         /* Field 4, the address, is omitted (which makes the columns
-            not line up too nicely with the headers, but the effect
-            is relatively readable).  */
-         annotate_field (5);
-         if (b->dll_pathname == NULL)
-           printf_filtered ("<any library> ");
-         else
-           printf_filtered ("library \"%s\" ", b->dll_pathname);
-         break;
-
-       case bp_catch_fork:
-       case bp_catch_vfork:
-         /* Field 4, the address, is omitted (which makes the columns
-            not line up too nicely with the headers, but the effect
-            is relatively readable).  */
-         annotate_field (5);
-         if (b->forked_inferior_pid != 0)
-           printf_filtered ("process %d ", b->forked_inferior_pid);
-         break;
-
-       case bp_catch_exec:
-         /* Field 4, the address, is omitted (which makes the columns
-            not line up too nicely with the headers, but the effect
-            is relatively readable).  */
-         annotate_field (5);
-         if (b->exec_pathname != NULL)
-           printf_filtered ("program \"%s\" ", b->exec_pathname);
-         break;
-       case bp_catch_catch:
-         /* Field 4, the address, is omitted (which makes the columns
-            not line up too nicely with the headers, but the effect
-            is relatively readable).  */
-         annotate_field (5);
-         printf_filtered ("exception catch ");
-         break;
-       case bp_catch_throw:
-         /* Field 4, the address, is omitted (which makes the columns
-            not line up too nicely with the headers, but the effect
-            is relatively readable).  */
-         annotate_field (5);
-         printf_filtered ("exception throw ");
-         break;
-
-       case bp_breakpoint:
-       case bp_hardware_breakpoint:
-       case bp_until:
-       case bp_finish:
-       case bp_longjmp:
-       case bp_longjmp_resume:
-       case bp_step_resume:
-       case bp_through_sigtramp:
-       case bp_watchpoint_scope:
-       case bp_call_dummy:
-       case bp_shlib_event:
-         if (addressprint)
-           {
-             annotate_field (4);
-             /* FIXME-32x64: need a print_address_numeric with
-                field width */
-             printf_filtered
-               ("%s ",
-                local_hex_string_custom
-                ((unsigned long) b->address, "08l"));
-           }
-
-         annotate_field (5);
-
-         last_addr = b->address;
-         if (b->source_file)
+         annotate_field (4);
+         /* FIXME-32x64: need a print_address_numeric with
+            field width */
+         printf_filtered
+           ("%s ",
+            local_hex_string_custom
+            ((unsigned long) b->address, "08l"));
+       }
+      annotate_field (5);
+      *last_addr = b->address;
+      if (b->source_file)
+       {
+         sym = find_pc_sect_function (b->address, b->section);
+         if (sym)
            {
-             sym = find_pc_sect_function (b->address, b->section);
-             if (sym)
-               {
-                 fputs_filtered ("in ", gdb_stdout);
-                 fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
-                 wrap_here (wrap_indent);
-                 fputs_filtered (" at ", gdb_stdout);
-               }
-             fputs_filtered (b->source_file, gdb_stdout);
-             printf_filtered (":%d", b->line_number);
+             fputs_filtered ("in ", gdb_stdout);
+             fputs_filtered (SYMBOL_SOURCE_NAME (sym), gdb_stdout);
+             wrap_here (wrap_indent);
+             fputs_filtered (" at ", gdb_stdout);
            }
-         else
-           print_address_symbolic (b->address, gdb_stdout, demangle, " ");
-         break;
+         fputs_filtered (b->source_file, gdb_stdout);
+         printf_filtered (":%d", b->line_number);
        }
-
-      if (b->thread != -1)
-       printf_filtered (" thread %d", b->thread);
-
+      else
+       print_address_symbolic (b->address, gdb_stdout, demangle, " ");
+      break;
+    }
+  
+  if (b->thread != -1)
+    {
+      printf_filtered (" thread %d", b->thread);
+    }
+  
+  printf_filtered ("\n");
+  
+  if (b->frame)
+    {
+      annotate_field (6);
+      printf_filtered ("\tstop only in stack frame at ");
+      print_address_numeric (b->frame, 1, gdb_stdout);
       printf_filtered ("\n");
-
-      if (b->frame)
-       {
-         annotate_field (6);
-
-         printf_filtered ("\tstop only in stack frame at ");
-         print_address_numeric (b->frame, 1, gdb_stdout);
-         printf_filtered ("\n");
-       }
-
-      if (b->cond)
-       {
-         annotate_field (7);
-
-         printf_filtered ("\tstop only if ");
-         print_expression (b->cond, gdb_stdout);
-         printf_filtered ("\n");
-       }
-
-      if (b->thread != -1)
+    }
+  
+  if (b->cond)
+    {
+      annotate_field (7);
+      printf_filtered ("\tstop only if ");
+      print_expression (b->cond, gdb_stdout);
+      printf_filtered ("\n");
+    }
+  
+  if (b->thread != -1)
+    {
+      /* FIXME should make an annotation for this */
+      printf_filtered ("\tstop only in thread %d\n", b->thread);
+    }
+  
+  if (show_breakpoint_hit_counts && b->hit_count)
+    {
+      /* FIXME should make an annotation for this */
+      if (ep_is_catchpoint (b))
+       printf_filtered ("\tcatchpoint");
+      else
+       printf_filtered ("\tbreakpoint");
+      printf_filtered (" already hit %d time%s\n",
+                      b->hit_count, (b->hit_count == 1 ? "" : "s"));
+    }
+  
+  if (b->ignore_count)
+    {
+      annotate_field (8);
+      printf_filtered ("\tignore next %d hits\n", b->ignore_count);
+    }
+  
+  if ((l = b->commands))
+    {
+      annotate_field (9);
+      while (l)
        {
-         /* FIXME should make an annotation for this */
-         printf_filtered ("\tstop only in thread %d\n", b->thread);
+         print_command_line (l, 4, gdb_stdout);
+         l = l->next;
        }
+    }
+}
 
-      if (show_breakpoint_hit_counts && b->hit_count)
-       {
-         /* FIXME should make an annotation for this */
-         if (ep_is_catchpoint (b))
-           printf_filtered ("\tcatchpoint");
-         else
-           printf_filtered ("\tbreakpoint");
-         printf_filtered (" already hit %d time%s\n",
-                          b->hit_count, (b->hit_count == 1 ? "" : "s"));
-       }
+struct captured_breakpoint_query_args
+  {
+    int bnum;
+  };
 
-      if (b->ignore_count)
+static int
+do_captured_breakpoint_query (void *data)
+{
+  struct captured_breakpoint_query_args *args = data;
+  register struct breakpoint *b;
+  CORE_ADDR dummy_addr = 0;
+  ALL_BREAKPOINTS (b)
+    {
+      if (args->bnum == b->number)
        {
-         annotate_field (8);
-
-         printf_filtered ("\tignore next %d hits\n", b->ignore_count);
+         print_one_breakpoint (b, &dummy_addr);
+         return GDB_RC_OK;
        }
+    }
+  return GDB_RC_NONE;
+}
 
-      if ((l = b->commands))
-       {
-         annotate_field (9);
+enum gdb_rc
+gdb_breakpoint_query (/* output object, */ int bnum)
+{
+  struct captured_breakpoint_query_args args;
+  args.bnum = bnum;
+  /* For the moment we don't trust print_one_breakpoint() to not throw
+     an error. */
+  return catch_errors (do_captured_breakpoint_query, &args,
+                      NULL, RETURN_MASK_ALL);
+}
 
-         while (l)
-           {
-             print_command_line (l, 4, gdb_stdout);
-             l = l->next;
-           }
-       }
-    }
+/* Print information on breakpoint number BNUM, or -1 if all.
+   If WATCHPOINTS is zero, process only breakpoints; if WATCHPOINTS
+   is nonzero, process only watchpoints.  */
 
+static void
+breakpoint_1 (bnum, allflag)
+     int bnum;
+     int allflag;
+{
+  register struct breakpoint *b;
+  CORE_ADDR last_addr = (CORE_ADDR) -1;
+  int found_a_breakpoint = 0;
+  
+  ALL_BREAKPOINTS (b)
+    if (bnum == -1
+       || bnum == b->number)
+      {
+       /* We only print out user settable breakpoints unless the
+          allflag is set. */
+       if (!allflag
+           && b->type != bp_breakpoint
+           && b->type != bp_catch_load
+           && b->type != bp_catch_unload
+           && b->type != bp_catch_fork
+           && b->type != bp_catch_vfork
+           && b->type != bp_catch_exec
+           && b->type != bp_catch_catch
+           && b->type != bp_catch_throw
+           && b->type != bp_hardware_breakpoint
+           && b->type != bp_watchpoint
+           && b->type != bp_read_watchpoint
+           && b->type != bp_access_watchpoint
+           && b->type != bp_hardware_watchpoint)
+         continue;
+       
+       if (!found_a_breakpoint++)
+         {
+           annotate_breakpoints_headers ();
+           annotate_field (0);
+           printf_filtered ("Num ");
+           annotate_field (1);
+           printf_filtered ("Type           ");
+           annotate_field (2);
+           printf_filtered ("Disp ");
+           annotate_field (3);
+           printf_filtered ("Enb ");
+           if (addressprint)
+             {
+               annotate_field (4);
+               printf_filtered ("Address    ");
+             }
+           annotate_field (5);
+           printf_filtered ("What\n");
+           annotate_breakpoints_table ();
+         }
+       
+       print_one_breakpoint (b, &last_addr);
+      }
+  
   if (!found_a_breakpoint)
     {
       if (bnum == -1)
@@ -3259,11 +3324,15 @@ breakpoint_1 (bnum, allflag)
        printf_filtered ("No breakpoint or watchpoint number %d.\n", bnum);
     }
   else
-    /* Compare against (CORE_ADDR)-1 in case some compiler decides
-       that a comparison of an unsigned with -1 is always false.  */
-  if (last_addr != (CORE_ADDR) -1)
-    set_next_address (last_addr);
+    {
+      /* Compare against (CORE_ADDR)-1 in case some compiler decides
+        that a comparison of an unsigned with -1 is always false.  */
+      if (last_addr != (CORE_ADDR) -1)
+       set_next_address (last_addr);
+    }
 
+  /* FIXME? Should this be moved up so that it is only called when
+     there have been breakpoints? */
   annotate_breakpoints_table_end ();
 }
 
@@ -3556,6 +3625,42 @@ disable_longjmp_breakpoint ()
     }
 }
 
+struct breakpoint *
+create_thread_event_breakpoint (address)
+     CORE_ADDR address;
+{
+  struct breakpoint *b;
+  struct symtab_and_line sal;
+  char addr_string[80];                /* Surely an addr can't be longer than that. */
+
+  INIT_SAL (&sal);             /* initialize to zeroes */
+  sal.pc = address;
+  sal.section = find_pc_overlay (sal.pc);
+  if ((b = set_raw_breakpoint (sal)) == NULL)
+    return NULL;
+  
+  b->number = internal_breakpoint_number--;
+  b->disposition = donttouch;
+  b->type = bp_thread_event;   /* XXX: do we need a new type? 
+                                  bp_thread_event */
+  b->enable = enabled;
+  /* addr_string has to be used or breakpoint_re_set will delete me.  */
+  sprintf (addr_string, "*0x%s", paddr (b->address));
+  b->addr_string = strsave (addr_string);
+
+  return b;
+}
+
+void
+remove_thread_event_breakpoints (void)
+{
+  struct breakpoint *b, *temp;
+
+  ALL_BREAKPOINTS_SAFE (b, temp)
+    if (b->type == bp_thread_event)
+      delete_breakpoint (b);
+}
+
 #ifdef SOLIB_ADD
 void
 remove_solib_event_breakpoints ()
@@ -4040,6 +4145,7 @@ mention (b)
     case bp_call_dummy:
     case bp_watchpoint_scope:
     case bp_shlib_event:
+    case bp_thread_event:
       break;
     }
   if (say_where)
@@ -6280,6 +6386,7 @@ delete_command (arg, from_tty)
       {
        if (b->type != bp_call_dummy &&
            b->type != bp_shlib_event &&
+           b->type != bp_thread_event &&
            b->number >= 0)
          breaks_to_delete = 1;
       }
@@ -6292,6 +6399,7 @@ delete_command (arg, from_tty)
          {
            if (b->type != bp_call_dummy &&
                b->type != bp_shlib_event &&
+               b->type != bp_thread_event &&
                b->number >= 0)
              delete_breakpoint (b);
          }
@@ -6465,6 +6573,10 @@ breakpoint_re_set_one (bint)
          starts and we really don't want to touch it.  */
     case bp_shlib_event:
 
+      /* Like bp_shlib_event, this breakpoint type is special.
+        Once it is set up, we do not want to touch it.  */
+    case bp_thread_event:
+
       /* Keep temporary breakpoints, which can be encountered when we step
          over a dlopen call and SOLIB_ADD is resetting the breakpoints.
          Otherwise these should have been blown away via the cleanup chain
index 94492dd3bda23ea160aca8e7317efd6907be8464..d0aa8bd661a9b079d3727b935c88ba0b5e28b14b 100644 (file)
@@ -94,6 +94,16 @@ enum bptype
        dynamic libraries.  */
     bp_shlib_event,
 
+    /* Some multi-threaded systems can arrange for a location in the 
+       inferior to be executed when certain thread-related events occur
+       (such as thread creation or thread death).
+
+       By placing a breakpoint at one of these locations, GDB will get
+       control when these events occur.  GDB can then update its thread
+       lists etc.  */
+
+    bp_thread_event,
+
     /* These breakpoints are used to implement the "catch load" command
        on platforms whose dynamic linkers support such functionality.  */
     bp_catch_load,
@@ -641,8 +651,12 @@ extern void make_breakpoint_permanent PARAMS ((struct breakpoint *));
 
 extern struct breakpoint *create_solib_event_breakpoint PARAMS ((CORE_ADDR));
 
+extern struct breakpoint *create_thread_event_breakpoint PARAMS ((CORE_ADDR));
+
 extern void remove_solib_event_breakpoints PARAMS ((void));
 
+extern void remove_thread_event_breakpoints PARAMS ((void));
+
 extern void disable_breakpoints_in_shlibs PARAMS ((int silent));
 
 extern void re_enable_breakpoints_in_shlibs PARAMS ((void));
index d6eca3042b7846e04b0c5cd04618f873d30cebfd..90b626d8a95cfc58bb875654de1dce22632fb306 100644 (file)
@@ -338,9 +338,13 @@ c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
     case TYPE_CODE_BITSTRING:
     case TYPE_CODE_COMPLEX:
     case TYPE_CODE_TYPEDEF:
+    case TYPE_CODE_TEMPLATE:
       /* These types need no prefix.  They are listed here so that
          gcc -Wall will reveal any types that haven't been handled.  */
       break;
+    default:
+      error ("type not handled in c_type_print_varspec_prefix()");
+      break;
     }
 }
 
@@ -530,9 +534,13 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
     case TYPE_CODE_BITSTRING:
     case TYPE_CODE_COMPLEX:
     case TYPE_CODE_TYPEDEF:
+    case TYPE_CODE_TEMPLATE:
       /* These types do not need a suffix.  They are listed so that
          gcc -Wall will report types that may not have been considered.  */
       break;
+    default:
+      error ("type not handled in c_type_print_varspec_suffix()");
+      break;
     }
 }
 
@@ -766,7 +774,6 @@ c_type_print_base (type, stream, show, level)
              if (TYPE_HAS_VTABLE (type) && (STREQN (TYPE_FIELD_NAME (type, i), "__vfp", 5)))
                continue;
              /* Other compilers */
-             /* pai:: FIXME : check for has_vtable < 0 */
              if (STREQN (TYPE_FIELD_NAME (type, i), "_vptr", 5)
                  && is_cplus_marker ((TYPE_FIELD_NAME (type, i))[5]))
                continue;
@@ -924,13 +931,13 @@ c_type_print_base (type, stream, show, level)
                  else
                    {
                      char *p;
-                     char *demangled_no_class = demangled_name;
+                     char *demangled_no_class = strrchr (demangled_name, ':');
 
-                     while ((p = strchr (demangled_no_class, ':')))
-                       {
-                         demangled_no_class = p;
-                         if (*++demangled_no_class == ':')
-                           ++demangled_no_class;
+                      if (demangled_no_class == NULL)
+                        demangled_no_class = demangled_name;
+                      else
+                        {
+                          ++demangled_no_class; /* skip over last ':' */
                        }
                      /* get rid of the static word appended by the demangler */
                      p = strstr (demangled_no_class, " static");
@@ -955,12 +962,12 @@ c_type_print_base (type, stream, show, level)
                }
            }
 
+         fprintfi_filtered (level, stream, "}");
+
          if (TYPE_LOCALTYPE_PTR (type) && show >= 0)
            fprintfi_filtered (level, stream, " (Local at %s:%d)\n",
                               TYPE_LOCALTYPE_FILE (type),
                               TYPE_LOCALTYPE_LINE (type));
-
-         fprintfi_filtered (level, stream, "}");
        }
       if (TYPE_CODE (type) == TYPE_CODE_TEMPLATE)
        goto go_back;
index f8882624051f06d7851ab6e4902ab76ebc53139c..bc3666ab027d78b3942595b20ad2fc3bf96523b7 100644 (file)
@@ -483,20 +483,24 @@ c_value_print (val, stream, format, pretty)
        {
          /* Pointer to class, check real type of object */
          fprintf_filtered (stream, "(");
-         type = value_rtti_target_type (val, &full, &top, &using_enc);
-         if (type)
+          real_type = value_rtti_target_type (val, &full, &top, &using_enc);
+          if (real_type)
            {
              /* RTTI entry found */
-             type = lookup_pointer_type (type);
-             type_print (type, "", stream, -1);
-           }
-         else
-           {
-             /* No RTTI fields, do whatever we can */
-             type = VALUE_ENCLOSING_TYPE (val);
-             type_print (type, "", stream, -1);
-             fprintf_filtered (stream, " ?");
-           }
+              if (TYPE_CODE (type) == TYPE_CODE_PTR)
+                {
+                  /* create a pointer type pointing to the real type */
+                  type = lookup_pointer_type (real_type);
+                }
+              else
+                {
+                  /* create a reference type referencing the real type */
+                  type = lookup_reference_type (real_type);
+                }
+              /* Note: When we look up RTTI entries, we don't get any 
+                 information on const or volatile attributes */
+            }
+          type_print (type, "", stream, -1);
          fprintf_filtered (stream, ") ");
        }
       else
@@ -521,6 +525,8 @@ c_value_print (val, stream, format, pretty)
          /* Print out object: enclosing type is same as real_type if full */
          return val_print (VALUE_ENCLOSING_TYPE (val), VALUE_CONTENTS_ALL (val), 0,
                         VALUE_ADDRESS (val), stream, format, 1, 0, pretty);
+          /* Note: When we look up RTTI entries, we don't get any information on
+             const or volatile attributes */
        }
       else if (type != VALUE_ENCLOSING_TYPE (val))
        {
index 0bd54767c31c67e1396826fda833db2a61d9192d..c530ad3ba731145338f8306352d45ea5a324441b 100644 (file)
@@ -198,7 +198,7 @@ extern int fr30_frameless_function_invocation PARAMS ((struct frame_info * frame
 extern void fr30_init_extra_frame_info PARAMS ((struct frame_info * fi));
 #define INIT_EXTRA_FRAME_INFO(fromleaf, fi) fr30_init_extra_frame_info (fi)
 
-#define FRAME_CHAIN_VALID(FP, FI)      generic_frame_chain_valid (FP, FI)
+#define FRAME_CHAIN_VALID(FP, FI)      generic_file_frame_chain_valid (FP, FI)
 
 extern CORE_ADDR
   fr30_push_arguments PARAMS ((int nargs, struct value ** args, CORE_ADDR sp,
index e91f142955906723799652cd0d34e902d66b122a..44b5e0d3e7aba4ae3028ba0151aa134bdefca902 100644 (file)
@@ -205,7 +205,7 @@ CORE_ADDR h8300_frame_chain PARAMS ((struct frame_info *));
    the frame chain or following frames back into the startup code.
    See the comments in objfile.h */
 
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 /* Define other aspects of the stack frame.  */
 
index 1000b77c2fd04f31cd7a3b4f123d03b09b147151..d61934ae06f165f198c1278dca3572f45953a76b 100644 (file)
@@ -25,7 +25,7 @@
 
 /* Stop backtracing when we wander into main.  */
 
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 
 /* Offsets (in target ints) into jmp_buf.  Not defined in any system header
index 7680a882621e50fd336ab9a666c424f8e33ad95b..cdda76d74889c9684629ca4e31b8ca4f8f2f6ee3 100644 (file)
@@ -32,7 +32,7 @@
 
 /* Use the alternate method of determining valid frame chains. */
 
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 /* Offsets (in target ints) into jmp_buf.  Not defined in any system header
    file, so we have to step through setjmp/longjmp with a debugger and figure
index 97f08807ec62481f993a97c1702dd5f43f7ff40c..7aad4c95e12b1c22f4137b54ac4743383b6ea9f3 100644 (file)
@@ -131,7 +131,7 @@ extern CORE_ADDR m32r_frame_chain PARAMS ((struct frame_info * fi));
 /* mvs_check  FRAME_CHAIN */
 #define FRAME_CHAIN(fi)                m32r_frame_chain (fi)
 
-#define FRAME_CHAIN_VALID(fp, frame)   generic_frame_chain_valid (fp, frame)
+#define FRAME_CHAIN_VALID(fp, frame)   generic_file_frame_chain_valid (fp, frame)
 
 extern CORE_ADDR m32r_find_callers_reg PARAMS ((struct frame_info * fi,
                                                int regnum));
index 9fd246075c5e523272a92c86fdacddc4b0b6644a..84ebb0e92dbcb9fbf441f8e1297224ada8e0aa62 100644 (file)
@@ -31,7 +31,7 @@
 
 /* Use the alternate method of determining valid frame chains. */
 
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 #include "tm-sysv4.h"
 #include "m68k/tm-m68k.h"
index 24c044d119b1b02d83d2c739b1f67b25816349b9..914f82596e87c648e71a131a3303738c0303608b 100644 (file)
@@ -40,6 +40,6 @@
 /* Need to do this for ELF targets, where we can't figure out the boundaries of
    the entry file.  This method stops the backtrace when we reach main.  */
 
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 /* FIXME, should do GET_LONGJMP_TARGET for newlib.  */
index 6804d9804df76e210cc65bc9066863287526867c..f583ed6e62602ab9d6409d71a9832ed476dfc975 100644 (file)
@@ -24,7 +24,7 @@
 #include "tm-sysv4.h"
 
 /* If we don't define this, backtraces go on forever.  */
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 #define IN_SIGTRAMP(pc, name) ((name) && (STREQ ("signalhandler", (name)) \
                                           || STREQ("sigacthandler", (name))))
index ddf5d90f03b29aed310031a2e2213fd1cd02a03a..cea17a08f170eb59f5fbadc5654bd1284a5adfe7 100644 (file)
@@ -81,7 +81,7 @@ extern void mcore_init_extra_frame_info (struct frame_info *fi);
 
 extern CORE_ADDR mcore_frame_chain (struct frame_info *fi);
 #define FRAME_CHAIN(FI) mcore_frame_chain ((FI))
-#define FRAME_CHAIN_VALID(FP, FI) generic_frame_chain_valid ((FP), (FI))
+#define FRAME_CHAIN_VALID(FP, FI) generic_file_frame_chain_valid ((FP), (FI))
 
 extern CORE_ADDR mcore_frame_saved_pc (struct frame_info *);
 #define FRAME_SAVED_PC(FI) (mcore_frame_saved_pc ((FI)))
index 02e188c0b6c0a7e660175c491f3c7c23aa93d6cf..03fa499d2e7047b3f697866088169cde7de8c7f8 100644 (file)
@@ -40,7 +40,7 @@
 #define SIGFRAME_FPREGSAVE_OFF (SIGFRAME_BASE + 40 + 36 * 4)
 
 /* Use the alternate method of determining valid frame chains. */
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 /* Convert a DWARF register number to a gdb REGNUM.  */
 #define DWARF_REG_TO_REGNUM(num) ((num) < 32 ? (num) : (num)+FP0_REGNUM-32)
index cb2a57f371c2fde3dd0955461cc234959ccb1bd7..f8843610690c15a6ef1034ab8b36a4bc35982fbe 100644 (file)
@@ -109,7 +109,7 @@ extern void mn10200_frame_find_saved_regs PARAMS ((struct frame_info *,
 
 extern CORE_ADDR mn10200_frame_chain PARAMS ((struct frame_info *));
 #define FRAME_CHAIN(fi) mn10200_frame_chain (fi)
-#define FRAME_CHAIN_VALID(FP, FI)      generic_frame_chain_valid (FP, FI)
+#define FRAME_CHAIN_VALID(FP, FI)      generic_file_frame_chain_valid (FP, FI)
 
 extern CORE_ADDR mn10200_find_callers_reg PARAMS ((struct frame_info *, int));
 extern CORE_ADDR mn10200_frame_saved_pc PARAMS ((struct frame_info *));
index 4bc76fd165daa14b19420afb8828b9b51920c64d..7969679bac4c5459997336060dacc2fe383db5d3 100644 (file)
@@ -82,7 +82,7 @@ extern void mn10300_init_extra_frame_info PARAMS ((struct frame_info *));
 
 extern CORE_ADDR mn10300_frame_chain PARAMS ((struct frame_info *));
 #define FRAME_CHAIN(fi) mn10300_frame_chain (fi)
-#define FRAME_CHAIN_VALID(FP, FI)      generic_frame_chain_valid (FP, FI)
+#define FRAME_CHAIN_VALID(FP, FI)      generic_file_frame_chain_valid (FP, FI)
 
 extern CORE_ADDR mn10300_find_callers_reg PARAMS ((struct frame_info *, int));
 extern CORE_ADDR mn10300_frame_saved_pc PARAMS ((struct frame_info *));
index c7c1fb5c4d2cf098dbf27762880c0b4f959df234..29112881b3eb3e015957e96753a3a42abc4b7d04 100644 (file)
@@ -1,5 +1,5 @@
 /* Native-dependent definitions for NetBSD.
-   Copyright 1994, 1996 Free Software Foundation, Inc.
+   Copyright 1994, 1996, 1999 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #define ATTACH_DETACH
 
 #include "solib.h"             /* Support for shared libraries. */
+#if defined (SVR4_SHARED_LIBS)
+#include "elf/common.h"                /* Additional ELF shared library info. */
+#endif
+
+#if !defined (SVR4_SHARED_LIBS)
 
 /* make structure definitions match up with those expected in solib.c */
 #define link_object    sod
@@ -85,3 +90,5 @@
 #define ldd            d_debug
 #define ld_un          d_un
 #define ld_2           d_sdt
+
+#endif
index 0c1c109e7a88795647d3cd43b1c1f191c8a1a856..c6769e0c7c2e48d1d99ea982c9b50e0f9dd40076 100644 (file)
@@ -249,7 +249,7 @@ extern CORE_ADDR sh_push_return_address PARAMS ((CORE_ADDR, CORE_ADDR));
 extern CORE_ADDR sh_frame_chain PARAMS ((struct frame_info *));
 #define FRAME_CHAIN(FRAME)           sh_frame_chain(FRAME)
 #define PUSH_DUMMY_FRAME             generic_push_dummy_frame ()
-#define FRAME_CHAIN_VALID(FP, FRAME) generic_frame_chain_valid (FP, FRAME)
+#define FRAME_CHAIN_VALID(FP, FRAME) generic_file_frame_chain_valid (FP, FRAME)
 #define PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP, FP)
 #define PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \
     (sh_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR))
index 310838d6acfeac58edc6b7d11fc8a608083aeeb9..292cc2b993290d2b43c4c8fdd42221f34bb53399 100644 (file)
@@ -2,5 +2,5 @@
 XDEPFILES= ser-tcp.o
 XM_FILE= xm-nbsd.h
 NAT_FILE= nm-nbsd.h
-NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o
+NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o solib.o
 HOST_IPC=-DBSD_IPC
index be8a348909528e6c1f3cc2c564d872b36ff8b945..5c89318bfe926887891c0f03950f4d121020b650 100644 (file)
@@ -1,3 +1,3 @@
 # Target: Sun 4 or Sparcstation, running NetBSD
-TDEPFILES= sparc-tdep.o solib.o
+TDEPFILES= sparc-tdep.o
 TM_FILE= tm-nbsd.h
diff --git a/gdb/config/sparc/nbsdelf.mh b/gdb/config/sparc/nbsdelf.mh
new file mode 100644 (file)
index 0000000..d76e7cb
--- /dev/null
@@ -0,0 +1,6 @@
+# Host: Sun 4 or Sparcstation, running NetBSD
+XDEPFILES= ser-tcp.o
+XM_FILE= xm-nbsd.h
+NAT_FILE= nm-nbsdelf.h
+NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o sparc-nat.o solib.o
+HOST_IPC=-DBSD_IPC
index 7668f9f58e3ff7e62c3e0fe338edfd106d517c87..72f77b9ddf28692f694c4625ee2f0312e8d1300c 100644 (file)
@@ -24,9 +24,7 @@
 
 /* Get generic NetBSD native definitions. */
 
-#include "nm-nbsd.h"
-
-#define FETCH_INFERIOR_REGISTERS
+#include "config/nm-nbsd.h"
 
 /* Before storing, we need to read all the registers.  */
 
diff --git a/gdb/config/sparc/nm-nbsdelf.h b/gdb/config/sparc/nm-nbsdelf.h
new file mode 100644 (file)
index 0000000..7f5e251
--- /dev/null
@@ -0,0 +1,27 @@
+/* Native-dependent definitions for Sparc running NetBSD ELF, for GDB.
+   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_NBSDELF_H
+#define NM_NBSDELF_H
+
+#define SVR4_SHARED_LIBS
+#include "sparc/nm-nbsd.h"
+
+#endif
index e419fe9dff1b38378802f702a9bfe6c63f49c0c4..2e63418b63993f93012def66322a7e8c1b238ad3 100644 (file)
@@ -39,7 +39,7 @@
 
 #define DECR_PC_AFTER_HW_BREAK 4
 
-#define FRAME_CHAIN_VALID(fp,fi) alternate_frame_chain_valid (fp, fi)
+#define FRAME_CHAIN_VALID(fp,fi) func_frame_chain_valid (fp, fi)
 
 #undef NUM_REGS
 #define NUM_REGS 80
index 03efe94342597dd9b31a43f0338527b0056a4714..256606a96c706912d3f1deb7e22f25b304eff6a3 100644 (file)
@@ -108,7 +108,7 @@ extern void v850_frame_find_saved_regs PARAMS ((struct frame_info * fi, struct f
 
 extern CORE_ADDR v850_frame_chain PARAMS ((struct frame_info * fi));
 #define FRAME_CHAIN(fi) v850_frame_chain (fi)
-#define FRAME_CHAIN_VALID(FP, FI)      generic_frame_chain_valid (FP, FI)
+#define FRAME_CHAIN_VALID(FP, FI)      generic_file_frame_chain_valid (FP, FI)
 
 extern CORE_ADDR v850_find_callers_reg PARAMS ((struct frame_info * fi, int regnum));
 extern CORE_ADDR v850_frame_saved_pc PARAMS ((struct frame_info *));
index 18a668d3bf8a2b9d42e8ce781c3a8ede16611715..e9a00b52d2fe1296881e8cfcccd81d14232e4f7f 100644 (file)
@@ -1,5 +1,5 @@
 /* Host-dependent definitions for any CPU running NetBSD.
-   Copyright 1993, 1994, 1996 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1996, 1999 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+/* Include this to get things like NGROUPS which <limits.h> doesn't
+   define on some systems. */
+#include <sys/param.h>
+
 /* We have to include these files now, so that GDB will not make
    competing definitions in defs.h.  */
 #include <limits.h>
index a4acf1b46f4bbd3b0c089db8bfe14407446d18cf..b1160018cb12ff660b9318dbe9d1215433ee9802 100644 (file)
@@ -146,6 +146,8 @@ rs6000-*-*)         gdb_host=rs6000 ;;
 
 sparc-*-linux*)                gdb_host=linux ;;
 sparc-*-lynxos*)       gdb_host=sparclynx ;;
+sparc-*-netbsdelf*)    gdb_host=nbsdelf ;;
+sparc-*-netbsdaout*)   gdb_host=nbsd ;;
 sparc-*-netbsd*)       gdb_host=nbsd ;;
 sparc-*-solaris2*)     gdb_host=sun4sol2 ;;
 sparc-*-sunos4*)       gdb_host=sun4os4 ;;
index 99a9eb6b58364479f010eff7c1bc6f05d6d8272d..7825680953f7e8f8b1781c88adade59d2de52531 100644 (file)
@@ -1052,6 +1052,11 @@ extern char *alloca ();
 #define TARGET_PTR_BIT TARGET_INT_BIT
 #endif
 
+/* Number of bits in a BFD_VMA for the target object file format. */
+#if !defined (TARGET_BFD_VMA_BIT)
+#define TARGET_BFD_VMA_BIT TARGET_PTR_BIT
+#endif
+
 /* If we picked up a copy of CHAR_BIT from a configuration file
    (which may get it by including <limits.h>) then use it to set
    the number of bits in a host char.  If not, use the same size
@@ -1306,4 +1311,32 @@ extern int use_windows;
 #define ISATTY(FP)     (isatty (fileno (FP)))
 #endif
 
+\f
+/* FIXME: cagney/1999-12-13: The following will be moved to gdb.h /
+   libgdb.h or gdblib.h. */
+
+/* Return-code (RC) from a gdb library call.  (The abreviation RC is
+   taken from the sim/common directory.) */
+
+enum gdb_rc {
+  /* The operation failed.  The failure message can be fetched by
+     calling ``char *error_last_message(void)''. The value is
+     determined by the catch_errors() interface. */
+  /* NOTE: Since ``defs.h:catch_errors()'' does not return an error /
+     internal / quit indication it is not possible to return that
+     here. */
+  GDB_RC_FAIL = 0,
+  /* No error occured but nothing happened. Due to the catch_errors()
+     interface, this must be non-zero. */
+  GDB_RC_NONE = 1,
+  /* The operation was successful. Due to the catch_errors()
+     interface, this must be non-zero. */
+  GDB_RC_OK = 2
+};
+
+
+/* Print the specified breakpoint on GDB_STDOUT. (Eventually this
+   function will ``print'' the object on ``output''). */
+enum gdb_rc gdb_breakpoint_query (/* struct {ui,gdb}_out *output, */ int bnum);
+
 #endif /* #ifndef DEFS_H */
index 45e1cdbe262468b5e8548bfd89772a5116507daf..f1150b869f7e02d8b334f7eabdbfed8c9fd369b6 100644 (file)
@@ -1,3 +1,8 @@
+Wed Dec  8 19:53:08 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * gdbint.texinfo (FRAME_CHAIN_VALID): Add the generic frame-chain
+       valid functions.
+
 1999-11-05  Stan Shebs  <shebs@andros.cygnus.com>
 
        * gdb.texinfo: Clarify regular expressions used in rbreak.
index 25666c39c2a2aa8a5796bef8108e7d465494649a..21ec1e3ab675c72a0f68ebc4420e4a27927c6a83 100644 (file)
@@ -1381,13 +1381,17 @@ Presently only defined for HP PA.
 @item FRAME_CHAIN_VALID(chain,thisframe)
 
 Define this to be an expression that returns zero if the given frame is
-an outermost frame, with no caller, and nonzero otherwise.  Three common
-definitions are available. @code{default_frame_chain_valid} (the
-default) is nonzero if the chain pointer is nonzero and given frame's PC
-is not inside the startup file (such as @file{crt0.o}).
-@code{alternate_frame_chain_valid} is nonzero if the chain pointer is
-nonzero and the given frame's PC is not in @code{main()} or a known
-entry point function (such as @code{_start()}).
+an outermost frame, with no caller, and nonzero otherwise.  Several
+common definitions are available. 
+
+@code{file_frame_chain_valid} is nonzero if the chain pointer is nonzero
+and given frame's PC is not inside the startup file (such as
+@file{crt0.o}).  @code{func_frame_chain_valid} is nonzero if the chain
+pointer is nonzero and the given frame's PC is not in @code{main()} or a
+known entry point function (such as @code{_start()}).
+@code{generic_file_frame_chain_valid} and
+@code{generic_func_frame_chain_valid} are equivalent implementations for
+targets using generic dummy frames.
 
 @item FRAME_INIT_SAVED_REGS(frame)
 See @file{frame.h}.  Determines the address of all registers in the
index 44e173ac6427607d243d413f275cf5982598a98e..d054ac7ffbd3cfb996d91f01f4d64f5cc156072f 100644 (file)
@@ -59,7 +59,7 @@ static LONGEST
   init_array_element PARAMS ((value_ptr, value_ptr, struct expression *,
                              int *, enum noside, LONGEST, LONGEST));
 
-#ifdef __GNUC__
+#if defined (__GNUC__) && !__STDC__
 inline
 #endif
 static value_ptr
index 7e3e02c890c3e55d948b57ac18db0da45cf3e0fe..191515634b1a23ce931898e6cbc6d133b8ec4b9a 100644 (file)
@@ -1082,7 +1082,7 @@ handle_timer_event (int dummy)
       saved_timer = timer_ptr;
       timer_ptr = timer_ptr->next;
       /* Call the procedure associated with that timer. */
-      (*saved_timer->proc) (timer_ptr->client_data);
+      (*saved_timer->proc) (saved_timer->client_data);
       free (saved_timer);
     }
 
index b7ab53031ccc300024e83a45fdee730ec8a5f353..ad329c5e776cf56427e86a4fcbc01faca5b7c246 100644 (file)
@@ -129,22 +129,24 @@ extern void frame_saved_regs_zalloc PARAMS ((struct frame_info *));
    the definition here by providing one in the tm file.
 
    XXXX - both default and alternate frame_chain_valid functions are
-   deprecated.  New code should use generic dummy frames. */
+   deprecated.  New code should use dummy frames and one of the
+   generic functions. */
 
-extern int default_frame_chain_valid PARAMS ((CORE_ADDR, struct frame_info *));
-extern int alternate_frame_chain_valid PARAMS ((CORE_ADDR, struct frame_info *));
+extern int file_frame_chain_valid (CORE_ADDR, struct frame_info *);
+extern int func_frame_chain_valid (CORE_ADDR, struct frame_info *);
 extern int nonnull_frame_chain_valid PARAMS ((CORE_ADDR, struct frame_info *));
-extern int generic_frame_chain_valid PARAMS ((CORE_ADDR, struct frame_info *));
+extern int generic_file_frame_chain_valid (CORE_ADDR, struct frame_info *);
+extern int generic_func_frame_chain_valid (CORE_ADDR, struct frame_info *);
 extern void generic_save_dummy_frame_tos PARAMS ((CORE_ADDR sp));
 
 #if !defined (FRAME_CHAIN_VALID)
 #if !defined (FRAME_CHAIN_VALID_ALTERNATE)
-#define FRAME_CHAIN_VALID(chain, thisframe) default_frame_chain_valid (chain, thisframe)
+#define FRAME_CHAIN_VALID(chain, thisframe) file_frame_chain_valid (chain, thisframe)
 #else
 /* Use the alternate method of avoiding running up off the end of the frame
    chain or following frames back into the startup code.  See the comments
    in objfiles.h. */
-#define FRAME_CHAIN_VALID(chain, thisframe) alternate_frame_chain_valid (chain,thisframe)
+#define FRAME_CHAIN_VALID(chain, thisframe) func_frame_chain_valid (chain,thisframe)
 #endif /* FRAME_CHAIN_VALID_ALTERNATE */
 #endif /* FRAME_CHAIN_VALID */
 
index ab6051717f26d25523ac77ef1053d5f0a803097a..3985ffed85cb19826760bb70221078df290a5910 100644 (file)
@@ -67,8 +67,8 @@ struct gdb_events
 
 
 /* Interface into events functions.
-   Where a *_p() predicate is present, it must called before calling
-   the hook proper. */
+   Where a *_p() predicate is present, it must be called before
+   calling the hook proper. */
 extern void breakpoint_create_event (int b);
 extern void breakpoint_delete_event (int b);
 extern void breakpoint_modify_event (int b);
index 5854e8439d3440378cfc73e83431d486fca1dd40..620322d932cc46ba51abfc62260a3d21e63a1a31 100755 (executable)
@@ -213,8 +213,8 @@ echo ""
 echo ""
 cat <<EOF
 /* Interface into events functions.
-   Where a *_p() predicate is present, it must called before calling
-   the hook proper. */
+   Where a *_p() predicate is present, it must be called before
+   calling the hook proper. */
 EOF
 function_list | while eval read $read
 do
index f7fbea45eac01df7816e030d25daa69d780cf324..49d7bf4ca702c7bf449ef9595a59363b1a255591 100644 (file)
@@ -125,6 +125,7 @@ struct gdbarch
 
      */
 
+  int bfd_vma_bit;
   int ptr_bit;
   int short_bit;
   int int_bit;
@@ -224,6 +225,7 @@ struct gdbarch default_gdbarch = {
   0, NULL, NULL,
   /* Multi-arch values */
   8 * sizeof (void*),
+  8 * sizeof (void*),
   8 * sizeof (short),
   8 * sizeof (int),
   8 * sizeof (long),
@@ -325,6 +327,7 @@ gdbarch_alloc (const struct gdbarch_info *info,
   gdbarch->byte_order = info->byte_order;
 
   /* Force the explicit initialization of these. */
+  gdbarch->bfd_vma_bit = TARGET_ARCHITECTURE->bits_per_address;
   gdbarch->num_regs = -1;
   gdbarch->sp_regnum = -1;
   gdbarch->fp_regnum = -1;
@@ -365,6 +368,9 @@ verify_gdbarch (struct gdbarch *gdbarch)
   if (gdbarch->bfd_arch_info == NULL)
     internal_error ("verify_gdbarch: bfd_arch_info unset");
   /* Check those that need to be defined for the given multi-arch level. */
+  if ((GDB_MULTI_ARCH >= 1)
+      && (0))
+    internal_error ("gdbarch: verify_gdbarch: bfd_vma_bit invalid");
   if ((GDB_MULTI_ARCH >= 1)
       && (gdbarch->ptr_bit == 0))
     internal_error ("gdbarch: verify_gdbarch: ptr_bit invalid");
@@ -611,6 +617,9 @@ gdbarch_dump (void)
   fprintf_unfiltered (gdb_stdlog,
                       "gdbarch_update: TARGET_BYTE_ORDER = %ld\n",
                       (long) TARGET_BYTE_ORDER);
+  fprintf_unfiltered (gdb_stdlog,
+                      "gdbarch_update: TARGET_BFD_VMA_BIT = %ld\n",
+                      (long) TARGET_BFD_VMA_BIT);
   fprintf_unfiltered (gdb_stdlog,
                       "gdbarch_update: TARGET_PTR_BIT = %ld\n",
                       (long) TARGET_PTR_BIT);
@@ -939,6 +948,24 @@ gdbarch_byte_order (struct gdbarch *gdbarch)
   return gdbarch->byte_order;
 }
 
+int
+gdbarch_bfd_vma_bit (struct gdbarch *gdbarch)
+{
+  if (0)
+    internal_error ("gdbarch: gdbarch_bfd_vma_bit invalid");
+  if (gdbarch_debug >= 2)
+    /* FIXME: gdb_std??? */
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_vma_bit called\n");
+  return gdbarch->bfd_vma_bit;
+}
+
+void
+set_gdbarch_bfd_vma_bit (struct gdbarch *gdbarch,
+                         int bfd_vma_bit)
+{
+  gdbarch->bfd_vma_bit = bfd_vma_bit;
+}
+
 int
 gdbarch_ptr_bit (struct gdbarch *gdbarch)
 {
index 34075c6146f775351f07a33420ab04b411d22425..a1f7c764671e08c2ff5b05f82635cb134eabe8d0 100644 (file)
@@ -99,6 +99,14 @@ extern int gdbarch_byte_order (struct gdbarch *gdbarch);
 
 /* The following are initialized by the target dependant code. */
 
+extern int gdbarch_bfd_vma_bit (struct gdbarch *gdbarch);
+extern void set_gdbarch_bfd_vma_bit (struct gdbarch *gdbarch, int bfd_vma_bit);
+#if GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > 1) || !defined (TARGET_BFD_VMA_BIT)
+#define TARGET_BFD_VMA_BIT (gdbarch_bfd_vma_bit (current_gdbarch))
+#endif
+#endif
+
 extern int gdbarch_ptr_bit (struct gdbarch *gdbarch);
 extern void set_gdbarch_ptr_bit (struct gdbarch *gdbarch, int ptr_bit);
 #if GDB_MULTI_ARCH
index 92f3170902049afa03bf6bebdd4ccb2e1f061bbf..539f99a5477e940fce62dbbdfce1762da71059a9 100755 (executable)
@@ -19,7 +19,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-read="class level macro returntype function formal actual attrib default init init_p fmt print print_p description"
+read="class level macro returntype function formal actual attrib default init invalid_p fmt print print_p description"
 
 # dump out/verify the doco
 for field in ${read}
@@ -27,6 +27,7 @@ do
   case ${field} in
 
     class ) : ;;
+
       # # -> line disable
       # f -> function
       #   hiding a function
@@ -39,7 +40,7 @@ do
 
       # See GDB_MULTI_ARCH description.  Having GDB_MULTI_ARCH >=
       # LEVEL is a predicate on checking that a given method is
-      # initialized (using INIT_P).
+      # initialized (using INVALID_P).
 
     macro ) : ;;
 
@@ -76,20 +77,21 @@ do
     default ) : ;;
 
       # To help with the GDB startup a default static gdbarch object
-      # is created.  DEFAULT is the value to insert into that
-      # array. It defaults to ZERO.
+      # is created.  DEFAULT is the value to insert into the static
+      # gdbarch object. If empty ZERO is used.
 
     init ) : ;;
 
-      # Any initial value to assign to the member after it is been
-      # MALLOCed.  Defaults to zero.  
+      # Any initial value to assign to a new gdbarch object after it
+      # as been malloc()ed.  Zero is used by default.
 
-    init_p ) : ;;
+    invalid_p ) : ;;
 
-      # A predicate equation that tests to see if the code creating
-      # the new architecture has correctly updated this
-      # MEMBER. Default is to check that the value is no longer equal
-      # to INIT.
+      # A predicate equation that validates MEMBER. Non-zero is returned
+      # if the code creating the new architecture failed to initialize
+      # the MEMBER or initialized the member to something invalid.
+      # By default, a check that the value is no longer equal to INIT
+      # is performed.  The equation ``0'' disables the invalid_p check.
 
     fmt ) : ;;
 
@@ -129,6 +131,7 @@ i:2:TARGET_ARCHITECTURE:const struct bfd_arch_info *:bfd_arch_info::::&bfd_defau
 #
 i:2:TARGET_BYTE_ORDER:int:byte_order::::BIG_ENDIAN
 #
+v:1:TARGET_BFD_VMA_BIT:int:bfd_vma_bit::::8 * sizeof (void*):TARGET_ARCHITECTURE->bits_per_address:0
 v:1:TARGET_PTR_BIT:int:ptr_bit::::8 * sizeof (void*):0
 #v:1:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):0
 v:1:TARGET_SHORT_BIT:int:short_bit::::8 * sizeof (short):0
@@ -242,7 +245,7 @@ ${class} ${macro}(${actual})
     level=${level}
     default=${default}
     init=${init}
-    init_p=${init_p}
+    invalid_p=${invalid_p}
     fmt=${fmt}
     print=${print}
     print_p=${print_p}
@@ -968,10 +971,10 @@ function_list | while eval read $read
 do
   case "${class}" in
     "f" | "v" )
-       if [ "${init_p}" ]
+       if [ "${invalid_p}" ]
        then
          echo "  if ((GDB_MULTI_ARCH >= ${level})"
-         echo "      && (${init_p}))"
+         echo "      && (${invalid_p}))"
          echo "    internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
        elif [ "${init}" ]
        then
@@ -1084,9 +1087,9 @@ do
        echo "${returntype}"
        echo "gdbarch_${function} (struct gdbarch *gdbarch)"
        echo "{"
-       if [ "${init_p}" ]
+       if [ "${invalid_p}" ]
        then
-         echo "  if (${init_p})"
+         echo "  if (${invalid_p})"
          echo "    internal_error (\"gdbarch: gdbarch_${function} invalid\");"
        elif [ "${init}" ]
        then
index 6a2fb1dfee41bef80a29df9000e232ca6451bbd9..20166722d3f3d4b8de0524f7c9c9b5f29f60fa25 100644 (file)
@@ -70,6 +70,9 @@ struct type *builtin_type_v4si;
 struct type *builtin_type_v8qi;
 struct type *builtin_type_v4hi;
 struct type *builtin_type_v2si;
+struct type *builtin_type_ptr;
+struct type *builtin_type_CORE_ADDR;
+struct type *builtin_type_bfd_vma;
 
 int opaque_type_resolution = 1;
 
@@ -2980,6 +2983,23 @@ build_gdbtypes ()
     = init_simd_type ("__builtin_v4hi", builtin_type_int16, "f", 4);
   builtin_type_v2si
     = init_simd_type ("__builtin_v2si", builtin_type_int32, "f", 2);
+
+  /* Pointer/Address types. */
+  /* NOTE: At present there is no way of differentiating between at
+     target address and the target C language pointer type type even
+     though the two can be different (cf d10v) */
+  builtin_type_ptr =
+    init_type (TYPE_CODE_INT, TARGET_PTR_BIT / 8,
+              TYPE_FLAG_UNSIGNED,
+              "__ptr", (struct objfile *) NULL);
+  builtin_type_CORE_ADDR =
+    init_type (TYPE_CODE_INT, TARGET_PTR_BIT / 8,
+              TYPE_FLAG_UNSIGNED,
+              "__CORE_ADDR", (struct objfile *) NULL);
+  builtin_type_bfd_vma =
+    init_type (TYPE_CODE_INT, TARGET_BFD_VMA_BIT / 8,
+              TYPE_FLAG_UNSIGNED,
+              "__bfd_vma", (struct objfile *) NULL);
 }
 
 
@@ -3023,5 +3043,8 @@ _initialize_gdbtypes ()
   register_gdbarch_swap (&builtin_type_v8qi, sizeof (struct type *), NULL);
   register_gdbarch_swap (&builtin_type_v4hi, sizeof (struct type *), NULL);
   register_gdbarch_swap (&builtin_type_v2si, sizeof (struct type *), NULL);
+  REGISTER_GDBARCH_SWAP (builtin_type_ptr);
+  REGISTER_GDBARCH_SWAP (builtin_type_CORE_ADDR);
+  REGISTER_GDBARCH_SWAP (builtin_type_bfd_vma);
   register_gdbarch_swap (NULL, 0, build_gdbtypes);
 }
index 923b0b1086abc9d39d8670c724d3f23eb48d95cb..49ace6a5bb7de3c7fe1013cd570ab4f14c4a3447 100644 (file)
@@ -846,7 +846,18 @@ extern struct type *builtin_type_double_complex;
 extern struct type *builtin_type_string;
 extern struct type *builtin_type_bool;
 
-/* Explicit sizes - see <intypes.h> for naming schema */
+/* Address/pointer types: */
+/* (C) Language pointer type. Some target platforms use an implicitly
+   {sign,zero} -extended 32 bit C language pointer on a 64 bit ISA. */
+extern struct type *builtin_type_ptr;
+/* The target CPU's address type.  This is the ISA address size. */
+extern struct type *builtin_type_CORE_ADDR;
+/* The symbol table address type.  Some object file formats have a 32
+   bit address type even though the TARGET has a 64 bit pointer type
+   (cf MIPS). */
+extern struct type *builtin_type_bfd_vma;
+
+/* Explicit sizes - see C9X <intypes.h> for naming scheme */
 extern struct type *builtin_type_int8;
 extern struct type *builtin_type_uint8;
 extern struct type *builtin_type_int16;
index a21eaa17f99850ab8f0dcac96e219f52d2b58971..8984b0c68296bd0a879a6d5f6453e4cd44dd4c7a 100644 (file)
 #include "inferior.h"
 #include "target.h"
 #include "gdb_string.h"
-#ifdef HAVE_WAIT_H
-#include <wait.h>
-#else
 #ifdef HAVE_SYS_WAIT_H
 #include <sys/wait.h>
 #endif
-#endif
+#include "wait.h" /* NOTE: This is ../include/wait.h */
 #include "command.h"
 
 #ifdef USG
index 7e37228a0b5146a7281885538b6e3020b4b35085..591f819d83f90af8e0bded9d1ad42aee8322f9db 100644 (file)
@@ -1755,6 +1755,17 @@ handle_inferior_event (struct execution_control_state *ecs)
       case TARGET_WAITKIND_STOPPED:
        stop_signal = ecs->ws.value.sig;
        break;
+
+       /* We had an event in the inferior, but we are not interested
+          in handling it at this level. The lower layers have already
+          done what needs to be done, if anything. This case can
+          occur only when the target is async or extended-async. One
+          of the circumstamces for this to happen is when the
+          inferior produces output for the console. The inferior has
+          not stopped, and we are ignoring the event. */
+      case TARGET_WAITKIND_IGNORE:
+       ecs->wait_some_more = 1;
+       return;
       }
 
     /* We may want to consider not doing a resume here in order to give
index 1aeb2372fcd068dc8c82fc9c55d0198985d7fa3b..be248ea990d3b8b59dffc7ec524aa47a366a5a00 100644 (file)
@@ -288,6 +288,10 @@ set_type_command (ignore, from_tty)
          did it in set_type_range. */
       return;
     }
+  else
+    {
+      warning ("Unrecognized type check setting: \"%s\"", type);
+    }
   set_type_str ();
   show_type_command ((char *) NULL, from_tty);
 }
@@ -334,6 +338,10 @@ set_range_command (ignore, from_tty)
          did it in set_type_range. */
       return;
     }
+  else
+    {
+      warning ("Unrecognized range check setting: \"%s\"", range);
+    }
   set_range_str ();
   show_range_command ((char *) 0, from_tty);
 }
@@ -398,7 +406,7 @@ set_lang_str ()
 static void
 set_type_str ()
 {
-  char *tmp, *prefix = "";
+  char *tmp = NULL, *prefix = "";
 
   free (type);
   if (type_mode == type_mode_auto)
@@ -427,7 +435,6 @@ set_range_str ()
 {
   char *tmp, *pref = "";
 
-  free (range);
   if (range_mode == range_mode_auto)
     pref = "auto; currently ";
 
@@ -446,6 +453,7 @@ set_range_str ()
       error ("Unrecognized range check setting.");
     }
 
+  free (range);
   range = concat (pref, tmp, NULL);
 }
 
@@ -539,6 +547,24 @@ local_hex_format_custom (pre)
   return form;
 }
 
+/* Converts a number to hexadecimal (without leading "0x") and stores it in a
+   static string.  Returns a pointer to this string. */
+
+char *
+longest_raw_hex_string (num)
+     LONGEST num;
+{
+  static char res_longest_raw_hex_string[50];
+  long long ll = num;          /* MERGEBUG ?? see below */
+  res_longest_raw_hex_string[0] = 0;
+  /* MERGEBUG ?? As a quick fix I am replacing this with sprintf 
+     strcat_address_numeric (num, 0, res_longest_raw_hex_string, 50); 
+   */
+
+  sprintf (res_longest_raw_hex_string, "%llx", ll);
+  return res_longest_raw_hex_string;
+}
+
 /* Converts a number to hexadecimal and stores it in a static
    string.  Returns a pointer to this string. */
 char *
@@ -551,6 +577,15 @@ local_hex_string (num)
   return res;
 }
 
+/* Converts a LONGEST number to hexadecimal and stores it in a static
+   string.  Returns a pointer to this string. */
+char *
+longest_local_hex_string (num)
+     LONGEST num;
+{
+  return longest_local_hex_string_custom (num, "l");
+}
+
 /* Converts a number to custom hexadecimal and stores it in a static
    string.  Returns a pointer to this string. */
 char *
@@ -564,6 +599,107 @@ local_hex_string_custom (num, pre)
   return res;
 }
 
+/* Converts a LONGEST number to custom hexadecimal and stores it in a static
+   string.  Returns a pointer to this string. Note that the width parameter
+   should end with "l", e.g. "08l" as with calls to local_hex_string_custom */
+
+char *
+longest_local_hex_string_custom (num, width)
+     LONGEST num;
+     char *width;
+{
+#define RESULT_BUF_LEN 50
+  static char res2[RESULT_BUF_LEN];
+  char format[RESULT_BUF_LEN];
+#if !defined (PRINTF_HAS_LONG_LONG)
+  int field_width;
+  int num_len;
+  int num_pad_chars;
+  char *pad_char;              /* string with one character */
+  int pad_on_left;
+  char *parse_ptr;
+  char temp_nbr_buf[RESULT_BUF_LEN];
+#endif
+
+#ifndef CC_HAS_LONG_LONG
+  /* If there is no long long, then LONGEST should be just long and we
+     can use local_hex_string_custom 
+   */
+  return local_hex_string_custom ((unsigned long) num, width);
+#endif
+
+#if defined (PRINTF_HAS_LONG_LONG)
+  /* Just use printf.  */
+  strcpy (format, local_hex_format_prefix ()); /* 0x */
+  strcat (format, "%");
+  strcat (format, width);      /* e.g. "08l" */
+  strcat (format, "l");                /* need "ll" for long long */
+  strcat (format, local_hex_format_specifier ());      /* "x" */
+  strcat (format, local_hex_format_suffix ()); /* "" */
+  sprintf (res2, format, num);
+  return res2;
+#else /* !defined (PRINTF_HAS_LONG_LONG) */
+  /* Use strcat_address_numeric to print the number into a string, then
+     build the result string from local_hex_format_prefix, padding and 
+     the hex representation as indicated by "width".  */
+
+  temp_nbr_buf[0] = 0;
+  /* With use_local == 0, we don't get the leading "0x" prefix. */
+  /* MERGEBUG ?? As a quick fix I am replacing this call to
+     strcat_address_numeric with sprintf
+     strcat_address_numeric(num, 0, temp_nbr_buf, RESULT_BUF_LEN);
+   */
+
+  {
+    long long ll = num;
+    sprintf (temp_nbr_buf, "%llx", ll);
+  }
+  /* parse width */
+  parse_ptr = width;
+  pad_on_left = 1;
+  pad_char = " ";
+  if (*parse_ptr == '-')
+    {
+      parse_ptr++;
+      pad_on_left = 0;
+    }
+  if (*parse_ptr == '0')
+    {
+      parse_ptr++;
+      if (pad_on_left)
+       pad_char = "0";         /* If padding is on the right, it is blank */
+    }
+  field_width = atoi (parse_ptr);
+  num_len = strlen (temp_nbr_buf);
+  num_pad_chars = field_width - strlen (temp_nbr_buf); /* possibly negative */
+
+  if (strlen (local_hex_format_prefix ()) + num_len + num_pad_chars
+      < RESULT_BUF_LEN)                /* paranoia */
+    internal_error ("longest_local_hex_string_custom: insufficient space to store result");
+
+  strcpy (res2, local_hex_format_prefix ());
+  if (pad_on_left)
+    {
+      while (num_pad_chars > 0)
+       {
+         strcat (res2, pad_char);
+         num_pad_chars--;
+       }
+    }
+  strcat (res2, temp_nbr_buf);
+  if (!pad_on_left)
+    {
+      while (num_pad_chars > 0)
+       {
+         strcat (res2, pad_char);
+         num_pad_chars--;
+       }
+    }
+  return res2;
+#endif
+
+}                              /* longest_local_hex_string_custom */
+
 /* Returns the appropriate printf format for octal
    numbers. */
 char *
index 9484e0be9de2b74831e8722d6fb767a1aebb25b2..b730d9b26eac1dd1ac7c70ad5fd2bd9167436e6c 100644 (file)
@@ -360,16 +360,28 @@ extern char *
 extern char *
   local_hex_format_custom PARAMS ((char *));   /* language.c */
 
+/* Return a string that contains the hex digits of the number.  No preceeding
+   "0x" */
+
+extern char *
+  longest_raw_hex_string PARAMS ((LONGEST));
+
 /* Return a string that contains a number formatted in one of the local
    (language-specific) formats.  Result is static and is overwritten by
-   the next call.  Takes printf options like "08" or "l".  */
+   the next call.  Takes printf options like "08l" or "l".  */
 
 extern char *
   local_hex_string PARAMS ((unsigned long));   /* language.c */
 
+extern char *
+  longest_local_hex_string PARAMS ((LONGEST)); /* language.c */
+
 extern char *
   local_hex_string_custom PARAMS ((unsigned long, char *));    /* language.c */
 
+extern char *
+  longest_local_hex_string_custom PARAMS ((LONGEST, char *));  /* language.c */
+
 /* Type predicates */
 
 extern int
index 507e5bc62fd2373a83bf9c7f330a420cc799e3f4..94d1fe005b0b69b7bd702e2dcbc73b4d8f9d4ec7 100644 (file)
@@ -1050,6 +1050,10 @@ yylex ()
        case LOC_LABEL:
        case LOC_UNRESOLVED:
          error("internal:  Unforseen case in m2lex()");
+
+       default:
+         error ("unhandled token in m2lex()");
+         break;
        }
     }
     else
index 42485c0e6d35b6ebbad5c7a897b7069dfd2c5eee..1eb36aef0c00127d4844eb3086ffc257dde54320 100644 (file)
@@ -249,6 +249,7 @@ captured_main (void *data)
       {"version", no_argument, &print_version, 1},
       {"x", required_argument, 0, 'x'},
       {"directory", required_argument, 0, 'd'},
+      {"d", required_argument, 0, 'd'},
       {"cd", required_argument, 0, 11},
       {"tty", required_argument, 0, 't'},
       {"baud", required_argument, 0, 'b'},
@@ -693,7 +694,6 @@ captured_main (void *data)
 int
 main (int argc, char **argv)
 {
-  int top_level_val;
   struct captured_main_args args;
   args.argc = argc;
   args.argv = argv;
index 97076b40dff10fae95369c177f6855e80c6c5c98..13193dfb5d23e796230e5db602a1813a9819b5ff 100644 (file)
@@ -3825,7 +3825,7 @@ mips_gdbarch_init (info, arches)
   set_gdbarch_push_arguments (gdbarch, mips_push_arguments);
   set_gdbarch_register_convertible (gdbarch, generic_register_convertible_not);
 
-  set_gdbarch_frame_chain_valid (gdbarch, default_frame_chain_valid);
+  set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
   set_gdbarch_get_saved_register (gdbarch, default_get_saved_register);
 
   if (gdbarch_debug)
index d66ec500cbd63248692bfa5b5afb3e0cac6562cc..402c95c5124a11901e925040e4ba360ac3b2fe2f 100644 (file)
@@ -2886,7 +2886,10 @@ Packet Dropped");
          goto got_status;
        case 'O':               /* Console output */
          remote_console_output (buf + 1);
-         continue;
+         /* Return immediately to the event loop. The event loop will
+             still be waiting on the inferior afterwards. */
+          status->kind = TARGET_WAITKIND_IGNORE;
+          goto got_status;
        case '\0':
          if (last_sent_signal != TARGET_SIGNAL_0)
            {
index 73b073918989145806563ac71f0f24c574c77f9a..4115eeeafd2f11db18575bc0b30c5f924809fa44 100644 (file)
@@ -104,7 +104,18 @@ enum target_waitkind
     /* Nothing happened, but we stopped anyway.  This perhaps should be handled
        within target_wait, but I'm not sure target_wait should be resuming the
        inferior.  */
-    TARGET_WAITKIND_SPURIOUS
+    TARGET_WAITKIND_SPURIOUS,
+
+    /* This is used for target async and extended-async
+       only. Remote_async_wait() returns this when there is an event
+       on the inferior, but the rest of the world is not interested in
+       it. The inferior has not stopped, but has just sent some output
+       to the console, for instance. In this case, we want to go back
+       to the event loop and wait there for another event from the
+       inferior, rather than being stuck in the remote_async_wait()
+       function. This way the event loop is responsive to other events,
+       like for instance the user typing. */
+    TARGET_WAITKIND_IGNORE
   };
 
 /* The numbering of these signals is chosen to match traditional unix
index 30308c89e20d0fec40a7d021464a26ee5cd3b166..47d33a2f3b16e8cfd5bab95e7f7f2b5debdade15 100644 (file)
@@ -1,3 +1,22 @@
+1999-12-13n Fernando Nasser  <fnasser@totem.to.cygnus.com>
+
+       * gdb.base/watchpoint.exp: Add missing "(timeout)" to test message.
+
+1999-12-13n Fernando Nasser  <fnasser@totem.to.cygnus.com>
+
+       * gdb.base/break.exp: Add missing anchor to reg exp on "finish from
+       outermost frame disallowed".
+
+1999-12-09  Fernando Nasser  <fnasser@totem.to.cygnus.com>
+
+       * gdb.base/setvar.exp: New tests for setting the value of a struct
+       with a constant list.
+
+1999-12-08  Fernando Nasser  <fnasser@totem.to.cygnus.com>
+
+       * gdb.base/setvar.exp: Remove pair os tests that expected gdb to
+       require the user to type a cast before setting the value of a struct.
+
 1999-12-06  Jim Blandy  <jimb@cygnus.com>
 
        * gdb.base/default.exp: Expect the new 'info float' command on
index a3d54eda657bae8d69f417e1d9dfdf823c887ae9..a076b5352033ffc638d5998e4bd35185a3e66adb 100644 (file)
@@ -619,7 +619,7 @@ send_gdb "finish\n"
 gdb_expect {
   -re "\"finish\" not meaningful in the outermost frame.\r\n$gdb_prompt $"\
           {pass "finish from outermost frame disallowed"}
-  -re "Run till exit from.*" {
+  -re "Run till exit from.*\r\n$gdb_prompt $" {
      pass "finish from outermost frame disallowed"
   }
   -re "$gdb_prompt $"\
index 2c9b4162cb1ab1253e1427b55199b16eb3a6fec0..f321c9f51e2a1d811a7937ac5b4fcc467a4fb6a9 100644 (file)
@@ -385,29 +385,33 @@ gdb_test "print v_struct1" \
 v_long_member = 3,.*v_float_member = 4,.*v_double_member = 5.*\}" \
   "set print structure #1"
 
-# This should be an error.  GCC extensions for structure constants require
-# the type of the structure to be specified, as in
+# Some believe that the following  should be an error.  GCC extensions for
+# structure constants require the type of the structure to be specified, as in
 # v_struct1 = (struct t_struct) {32, 33, 34, 35, 36, 37}
-# GDB should do the same if it wants to provide this feature.
-# However, for HP's aCC this is OK, so we skip the tests for aCC
-if {! $hp_aCC_compiler} {
-if [target_info exists gdb,cannot_call_functions] {
-    setup_xfail "*-*-*" 2416
-    fail "set variable v_struct1 = {32, 33, 34, 35, 36, 37}"
-    continue
-}
+# The argument is that GDB should do the same if it wants to provide this
+# feature, i.e., require the cast.
+# We decided that we don't want the debugger to be as picky as a
+# compiler and make us type complex casts.
+
 # We need to up this because this can be really slow on some boards.
 # (malloc() is called as part of the test).
 set timeout 60;
-gdb_test "set variable v_struct1 = {32, 33, 34, 35, 36, 37}" "Invalid.*"
 
-# And after the error the structure should be unchanged.
-gdb_test "print v_struct1" \
+# Change the values
+test_set "set variable v_struct1 = {32, 33, 34, 35, 36, 37}" \
+  "print v_struct1" \
+  ".*.\[0-9\]* = \{.*v_char_member = 32 \' \',.*v_short_member = 33,\
+.*v_int_member = 34,.*\
+v_long_member = 35,.*v_float_member = 36,.*v_double_member = 37.*\}" \
+  "set print structure #2"
+
+# Change them back
+test_set "set variable v_struct1 = {'h', 1, 2, 3, 4.0, 5.0}" \
+  "print v_struct1" \
   ".*.\[0-9\]* = \{.*v_char_member = 104 \'h\',.*v_short_member = 1,\
 .*v_int_member = 2,.*\
 v_long_member = 3,.*v_float_member = 4,.*v_double_member = 5.*\}" \
-  "set print structure #2"
-}
+  "set print structure #3"
 
 # Test printing of enumeration bitfields.
 # GNU C supports them, some other compilers don't.
index 6be4e34b3676aff19689bbd674208bbbac001ba7..39c388e287e5fb1ffbfb8a3a9a72668f74331446 100644 (file)
@@ -420,7 +420,7 @@ proc test_stepping {} {
            -re ".*$gdb_prompt $" {
                fail "finish from marker1"
            }
-           default { fail "finish from marker1" ; return }
+           default { fail "finish from marker1 (timeout)" ; return }
        }
 
        gdb_test "next" "for \\(count = 0.*" "next to `for' in watchpoint.exp"
@@ -448,7 +448,7 @@ proc test_stepping {} {
            -re ".*$gdb_prompt $" {
                fail "until out of loop"
            }
-           default { fail "until out of loop" ; return }
+           default { fail "until out of loop (timeout)" ; return }
        }
 
        gdb_test "step" "ival2 = count.*" "step to ival2 assignment"
index 95c07db303c1086993a2226eb35bcff75d20b767..198a5542705d937aa85ab4f43dca9ed107f67911 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -45,6 +45,7 @@
 
 #include <sys/types.h>
 
+#include <setjmp.h>
 
 #include "event-top.h"
 #include "gdb_string.h"
@@ -464,10 +465,22 @@ NORETURN void (*error_hook)
 PARAMS ((void)) ATTR_NORETURN;
 \f
 
+/* Generally one should use catch_errors rather than manipulating these
+   directly.  The exception is main().  */
+#if defined(HAVE_SIGSETJMP)
+#define SIGJMP_BUF             sigjmp_buf
+#define SIGSETJMP(buf)         sigsetjmp(buf, 1)
+#define SIGLONGJMP(buf,val)    siglongjmp(buf,val)
+#else
+#define SIGJMP_BUF             jmp_buf
+#define SIGSETJMP(buf)         setjmp(buf)
+#define SIGLONGJMP(buf,val)    longjmp(buf,val)
+#endif
+
 /* Where to go for return_to_top_level (RETURN_ERROR).  */
-     SIGJMP_BUF error_return;
+static SIGJMP_BUF error_return;
 /* Where to go for return_to_top_level (RETURN_QUIT).  */
-     SIGJMP_BUF quit_return;
+static SIGJMP_BUF quit_return;
 
 /* Return for reason REASON.  This generally gets back to the command
    loop, but can be caught via catch_errors.  */
@@ -485,7 +498,7 @@ return_to_top_level (reason)
 
   disable_current_display ();
   do_cleanups (ALL_CLEANUPS);
-  if (event_loop_p && target_can_async_p ())
+  if (event_loop_p && target_can_async_p () && !target_executing)
     do_exec_cleanups (ALL_CLEANUPS);
   if (event_loop_p && sync_execution)
     do_exec_error_cleanups (ALL_CLEANUPS);
index 9f6398f7fcaef8bb91f1c69722aa6e7a03224caa..36bf52b509a0363d835fe7167d4939faeee7842e 100644 (file)
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -19,8 +19,6 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include <setjmp.h>
-
 /* From top.c.  */
 extern char *line;
 extern int linesize;
@@ -30,21 +28,6 @@ extern int inhibit_gdbinit;
 extern int epoch_interface;
 extern char gdbinit[];
 
-/* Generally one should use catch_errors rather than manipulating these
-   directly.  The exception is main().  */
-#if defined(HAVE_SIGSETJMP)
-#define SIGJMP_BUF             sigjmp_buf
-#define SIGSETJMP(buf)         sigsetjmp(buf, 1)
-#define SIGLONGJMP(buf,val)    siglongjmp(buf,val)
-#else
-#define SIGJMP_BUF             jmp_buf
-#define SIGSETJMP(buf)         setjmp(buf)
-#define SIGLONGJMP(buf,val)    longjmp(buf,val)
-#endif
-
-extern SIGJMP_BUF error_return;
-extern SIGJMP_BUF quit_return;
-
 extern void print_gdb_version PARAMS ((GDB_FILE *));
 
 extern void source_command PARAMS ((char *, int));
index 2c82e193ff9df73b22a25ab82394dcf9bfc2f9b7..245f1d07f8f5c1fe7953708bbf6fb6b5f24ddca6 100644 (file)
@@ -499,7 +499,7 @@ tracepoints_info (tpnum_exp, from_tty)
        printf_filtered ("%s ",
                         local_hex_string_custom ((unsigned long) t->address,
                                                  "08l"));
-      printf_filtered ("%-5d %-5d ", t->pass_count, t->step_count);
+      printf_filtered ("%-5d %-5ld ", t->pass_count, t->step_count);
 
       if (t->source_file)
        {
@@ -1773,7 +1773,7 @@ trace_start_command (args, from_tty)
        char tmp[40];
 
        sprintf_vma (tmp, t->address);
-       sprintf (buf, "QTDP:%x:%s:%c:%x:%x", t->number, tmp, /* address */
+       sprintf (buf, "QTDP:%x:%s:%c:%lx:%x", t->number, tmp, /* address */
                 t->enabled == enabled ? 'E' : 'D',
                 t->step_count, t->pass_count);
 
index 170071624cc657c2f648f6292203a945a06efce9..97c3ca7736ca75cbc49675394d70eb31f711baba 100644 (file)
@@ -28,6 +28,7 @@
 #include "language.h"
 #include "demangle.h"
 #include "gdb_string.h"
+#include <math.h>
 
 /* Define whether or not the C operator '/' truncates towards zero for
    differently signed operands (truncation direction is undefined in C). */
@@ -573,7 +574,7 @@ value_ptr
 value_concat (arg1, arg2)
      value_ptr arg1, arg2;
 {
-  register value_ptr inval1, inval2, outval;
+  register value_ptr inval1, inval2, outval = NULL;
   int inval1len, inval2len;
   int count, idx;
   char *ptr;
@@ -738,7 +739,7 @@ value_binop (arg1, arg2, op)
       /* FIXME-if-picky-about-floating-accuracy: Should be doing this
          in target format.  real.c in GCC probably has the necessary
          code.  */
-      DOUBLEST v1, v2, v;
+      DOUBLEST v1, v2, v = 0;
       v1 = value_as_double (arg1);
       v2 = value_as_double (arg2);
       switch (op)
@@ -759,6 +760,12 @@ value_binop (arg1, arg2, op)
          v = v1 / v2;
          break;
 
+        case BINOP_EXP:
+          v = pow (v1, v2);
+          if (errno)
+            error ("Cannot perform exponentiation: %s", strerror (errno));
+          break;
+
        default:
          error ("Integer-only operation on floating point number.");
        }
@@ -779,7 +786,7 @@ value_binop (arg1, arg2, op)
           &&
           TYPE_CODE (type2) == TYPE_CODE_BOOL)
     {
-      LONGEST v1, v2, v;
+      LONGEST v1, v2, v = 0;
       v1 = value_as_long (arg1);
       v2 = value_as_long (arg2);
 
@@ -795,6 +802,14 @@ value_binop (arg1, arg2, op)
 
        case BINOP_BITWISE_XOR:
          v = v1 ^ v2;
+          break;
+              
+        case BINOP_EQUAL:
+          v = v1 == v2;
+          break;
+          
+        case BINOP_NOTEQUAL:
+          v = v1 != v2;
          break;
 
        default:
@@ -855,7 +870,7 @@ value_binop (arg1, arg2, op)
 
       if (unsigned_operation)
        {
-         ULONGEST v1, v2, v;
+         ULONGEST v1, v2, v = 0;
          v1 = (ULONGEST) value_as_long (arg1);
          v2 = (ULONGEST) value_as_long (arg2);
 
@@ -884,6 +899,12 @@ value_binop (arg1, arg2, op)
              v = v1 / v2;
              break;
 
+            case BINOP_EXP:
+              v = pow (v1, v2);
+              if (errno)
+                error ("Cannot perform exponentiation: %s", strerror (errno));
+              break;
+
            case BINOP_REM:
              v = v1 % v2;
              break;
@@ -949,6 +970,10 @@ value_binop (arg1, arg2, op)
              v = v1 == v2;
              break;
 
+            case BINOP_NOTEQUAL:
+              v = v1 != v2;
+              break;
+
            case BINOP_LESS:
              v = v1 < v2;
              break;
@@ -976,7 +1001,7 @@ value_binop (arg1, arg2, op)
        }
       else
        {
-         LONGEST v1, v2, v;
+         LONGEST v1, v2, v = 0;
          v1 = value_as_long (arg1);
          v2 = value_as_long (arg2);
 
@@ -996,6 +1021,12 @@ value_binop (arg1, arg2, op)
 
            case BINOP_DIV:
              v = v1 / v2;
+              break;
+
+            case BINOP_EXP:
+              v = pow (v1, v2);
+              if (errno)
+                error ("Cannot perform exponentiation: %s", strerror (errno));
              break;
 
            case BINOP_REM:
@@ -1125,6 +1156,37 @@ value_logical_not (arg1)
   return len < 0;
 }
 
+/* Perform a comparison on two string values (whose content are not
+   necessarily null terminated) based on their length */
+
+static int
+value_strcmp (arg1, arg2)
+     register value_ptr arg1, arg2;
+{
+  int len1 = TYPE_LENGTH (VALUE_TYPE (arg1));
+  int len2 = TYPE_LENGTH (VALUE_TYPE (arg2));
+  char *s1 = VALUE_CONTENTS (arg1);
+  char *s2 = VALUE_CONTENTS (arg2);
+  int i, len = len1 < len2 ? len1 : len2;
+
+  for (i = 0; i < len; i++)
+    {
+      if (s1[i] < s2[i])
+        return -1;
+      else if (s1[i] > s2[i])
+        return 1;
+      else
+        continue;
+    }
+
+  if (len1 < len2)
+    return -1;
+  else if (len1 > len2)
+    return 1;
+  else
+    return 0;
+}
+
 /* Simulate the C operator == by returning a 1
    iff ARG1 and ARG2 have equal contents.  */
 
@@ -1175,6 +1237,10 @@ value_equal (arg1, arg2)
        }
       return len < 0;
     }
+  else if (code1 == TYPE_CODE_STRING && code2 == TYPE_CODE_STRING)
+    {
+      return value_strcmp (arg1, arg2) == 0;
+    }
   else
     {
       error ("Invalid type combination in equality test.");
@@ -1217,7 +1283,8 @@ value_less (arg1, arg2)
     return value_as_pointer (arg1) < (CORE_ADDR) value_as_long (arg2);
   else if (code2 == TYPE_CODE_PTR && (code1 == TYPE_CODE_INT || code1 == TYPE_CODE_BOOL))
     return (CORE_ADDR) value_as_long (arg1) < value_as_pointer (arg2);
-
+  else if (code1 == TYPE_CODE_STRING && code2 == TYPE_CODE_STRING)
+    return value_strcmp (arg1, arg2) < 0;
   else
     {
       error ("Invalid type combination in ordering comparison.");
index 6b7290ea3d1830dfabe1f392e5057065a93d2c9f..01ef1be00e1e60651e2c54888aeb3025318cc090 100644 (file)
@@ -1,5 +1,10 @@
+Wed Dec  8 21:47:13 1999  Andrew Cagney  <cagney@b1.cygnus.com>
+
+       * sim-arange.c: Include <string.h>
+
 1999-12-07  Dave Brolley  <brolley@cygnus.com>
 
+       * sim-options.c (print_help): '=' required before optional argument.
        * cgen-par.h (CGEN_FN_MEM_QI_WRITE): New enumerator.
        (CGEN_FN_MEM_HI_WRITE): New enumerator.
        (CGEN_FN_MEM_SI_WRITE): New enumerator.
index d9955e687e52e5a04439b81a58c2a2488eb0be75..fc08113a468adef96cb4e0904c32d444d3d2e405 100644 (file)
@@ -29,6 +29,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <stdlib.h>
 #endif
 
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
 #define DEFINE_INLINE_P (! defined (SIM_ARANGE_C_INCLUDED))
 #define DEFINE_NON_INLINE_P defined (SIM_ARANGE_C_INCLUDED)
 
index 8d0f92375601a6c886be5de367ba6097b5dee931..077019ce87f98474ff7285fbde56f5091de8de5e 100644 (file)
@@ -709,7 +709,7 @@ print_help (SIM_DESC sd, sim_cpu *cpu, const struct option_list *ol, int is_comm
                  {
                    if (o->opt.has_arg == optional_argument)
                      {
-                       sim_io_printf (sd, " [%s]", o->arg);
+                       sim_io_printf (sd, "[=%s]", o->arg);
                        len += 2 + strlen (o->arg) + 1;
                      }
                    else