* target.h: Add to_doc and target_preopen.
authorJim Kingdon <jkingdon@engr.sgi.com>
Fri, 19 Apr 1991 01:36:57 +0000 (01:36 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Fri, 19 Apr 1991 01:36:57 +0000 (01:36 +0000)
target.c: Add target_preopen and target_command.
Remove target_info.
(add_target): Call add_cmd and mess with targetlist->doc.
core.c, exec.c, remote-eb.c, remote-nindy.c, remote-vx.c,
remote-vx.68.c, inftarg.c, remote.c: Add doc field to target struct.
Call target_preopen from open routine.

gdb/core.c
gdb/exec.c
gdb/remote-eb.c
gdb/remote-nindy.c
gdb/remote.c
gdb/target.c

index 119f7162f2f45edeabe06f978a59bdd893ff9d77..4f3c61797db08007c22e861cb9f8dbef78c804ca 100644 (file)
@@ -81,6 +81,7 @@ core_open (filename, from_tty)
   bfd *temp_bfd;
   int ontop;
 
+  target_preopen (from_tty);
   if (!filename)
     {
       error (core_bfd? 
@@ -421,6 +422,7 @@ get_core_registers (regno)
 \f
 struct target_ops core_ops = {
        "core", "Local core dump file",
+       "Use a core file as a target.  Specify the filename of the core file.",
        core_open, core_close,
        child_attach, core_detach, 0, 0, /* resume, wait */
        get_core_registers, 
index ca02ae80623426693640819b429c4140bb4d5df4..0861c11703ade3d20992e56e78fc5a598e7f0091 100644 (file)
@@ -73,6 +73,7 @@ exec_file_command (filename, from_tty)
      char *filename;
      int from_tty;
 {
+  target_preopen (from_tty);
 
   /* Remove any previous exec file.  */
   unpush_target (&exec_ops);
@@ -312,8 +313,49 @@ exec_files_info ()
        bfd_section_name (exec_bfd, p->sec_ptr));
 }
 
+static void
+set_section_command (args, from_tty)
+     char *args;
+     int from_tty;
+{
+  struct section_table *p;
+  char *secname;
+  unsigned seclen;
+  unsigned long secaddr;
+  char secprint[100];
+  long offset;
+
+  if (args == 0)
+    error ("Must specify section name and its virtual address");
+
+  /* Parse out section name */
+  for (secname = args; !isspace(*args); args++) ;
+  seclen = args - secname;
+
+  /* Parse out new virtual address */
+  secaddr = parse_and_eval_address (args);
+
+  for (p = exec_sections; p < exec_sections_end; p++) {
+    if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
+       && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
+      offset = secaddr - p->addr;
+      p->addr += offset;
+      p->endaddr += offset;
+      exec_files_info();
+      return;
+    }
+  } 
+  if (seclen >= sizeof (secprint))
+    seclen = sizeof (secprint) - 1;
+  strncpy (secprint, secname, seclen);
+  secprint[seclen] = '\0';
+  error ("Section %s not found", secprint);
+}
+
 struct target_ops exec_ops = {
        "exec", "Local exec file",
+       "Use an executable file as a target.\n\
+Specify the filename of the executable file.",
        exec_file_command, exec_close, /* open, close */
        child_attach, 0, 0, 0, /* attach, detach, resume, wait, */
        0, 0, /* fetch_registers, store_registers, */
@@ -349,5 +391,12 @@ If FILE cannot be found as specified, your execution directory path\n\
 is searched for a command of that name.\n\
 No arg means have no executable file.");
 
+  add_com ("section", class_files, set_section_command,
+   "Change the base address of section SECTION of the exec file to ADDR.\n\
+This can be used if the exec file does not contain section addresses,\n\
+(such as in the a.out format), or when the addresses specified in the\n\
+file itself are wrong.  Each section must be changed separately.  The\n\
+``info files'' command lists all the sections and their addresses.");
+
   add_target (&exec_ops);
 }
index a14090580ce83f36bdada7768034b3bc2bc089c8..9f8cc5eaea2648dbef7e8c400e5ba72addc1e9a9 100644 (file)
@@ -312,6 +312,8 @@ eb_open (name, from_tty)
 
   char *p;
 
+  target_preopen (from_tty);
+  
   /* Find the first whitespace character, it separates dev_name from
      prog_name.  */
   if (name == 0)
@@ -907,6 +909,11 @@ eb_read_inferior_memory(memaddr, myaddr, len)
 
 struct target_ops eb_ops = {
        "amd-eb", "Remote serial AMD EBMON target",
+       "Use a remote computer running EBMON connected by a serial line.\n\
+Arguments are the name of the device for the serial line,\n\
+the speed to connect at in bits per second, and the filename of the\n\
+executable as it exists on the remote computer.  For example,\n\
+        target amd-eb /dev/ttya 9600 demo",
        eb_open, eb_close, 
        0, eb_detach, eb_resume, eb_wait,
        eb_fetch_register, eb_store_register,
index af19fd484f9a0769b807f4d172a1860b0293e7c7..08cc9de1f2dbe9e4a669c29979a80bf1479d4bcb 100644 (file)
@@ -220,6 +220,8 @@ nindy_open (name, from_tty)
   if (!name)
     error_no_arg ("serial port device name");
 
+  target_preopen (from_tty);
+  
   nindy_close (0);
 
        have_regs = regs_changed = 0;
@@ -932,6 +934,11 @@ nindy_before_main_loop ()
 
 struct target_ops nindy_ops = {
        "nindy", "Remote serial target in i960 NINDY-specific protocol",
+       "Use a remote i960 system running NINDY connected by a serial line.\n\
+Specify the name of the device the serial line is connected to.\n\
+The speed (baud rate), whether to use the old NINDY protocol,\n\
+and whether to send a break on startup, are controlled by options\n\
+specified when you started GDB.",
        nindy_open, nindy_close,
        0, nindy_detach, nindy_resume, nindy_wait,
        nindy_fetch_registers, nindy_store_registers,
index 9ff56502b8f683c27b572f5470f694f7b6f90959..3e0acd32348af9efb3ca7d9eba81b5ae85c9d5d7 100644 (file)
@@ -162,6 +162,8 @@ remote_open (name, from_tty)
 "To open a remote debug connection, you need to specify what serial\n\
 device is attached to the remote system (e.g. /dev/ttya).");
 
+  target_preopen (from_tty);
+
   remote_close (0);
 
 #if 0
@@ -805,6 +807,8 @@ dcache_init ()
 
 struct target_ops remote_ops = {
        "remote", "Remote serial target in gdb-specific protocol",
+       "Use a remote computer via a serial line, using a gdb-specific protocol.\n\
+Specify the serial device it is connected to (e.g. /dev/ttya).",
        remote_open, remote_close,
        0, remote_detach, remote_resume, remote_wait,  /* attach */
        remote_fetch_registers, remote_store_registers,
index 61182932eaca7df465d860130aa67f6374ab3c08..53e9de1acd2df961fb9a3402125dcd60f6f427be 100644 (file)
@@ -47,7 +47,7 @@ unsigned target_struct_allocsize;
 /* The initial current target, so that there is always a semi-valid
    current target.  */
 
-struct target_ops dummy_target = {"None", "None",
+struct target_ops dummy_target = {"None", "None", "",
     0, 0, 0, 0,                /* open, close, attach, detach */
     0, 0,              /* resume, wait */
     0, 0, 0, 0, 0,     /* registers */
@@ -72,6 +72,23 @@ struct target_ops *current_target;
 
 struct target_ops **current_target_stack;
 
+/* Command list for target.  */
+
+static struct cmd_list_element *targetlist = NULL;
+
+/* Docstring for target (as in "help target").  */
+
+static char *target_doc = NULL;
+
+/* The user just typed 'target' without the name of a target.  */
+
+static void
+target_command (arg, from_tty)
+     char *arg;
+     int from_tty;
+{
+  fputs_filtered ("Argument required (target name).", stdout);
+}
 
 /* Add a possible target architecture to the list.  */
 
@@ -100,6 +117,16 @@ add_target (t)
     }
   target_structs[target_struct_size++] = t;
   cleanup_target (t);
+
+  if (targetlist == NULL)
+    add_prefix_cmd ("target", class_run, target_command,
+                   "Connect to a target machine or process.\n\
+The first argument is the type or protocol of the target machine.\n\
+Remaining arguments are interpreted by the target protocol.  For more\n\
+information on the arguments for a particular protocol, type\n\
+`help target ' followed by the protocol name.",
+                   &targetlist, "target ", 0, &cmdlist);
+  add_cmd (t->to_shortname, no_class, t->to_open, t->to_doc, &targetlist);
 }
 
 /* Stub functions */
@@ -363,20 +390,6 @@ pop_target ()
     push_target (&dummy_target);
 }
 
-/* Print things about the whole set of targets and about the
-   current target stack.  */
-static void
-targets_info ()
-{
-  int i;
-
-  printf("Possible targets:\n\n");
-  for (i = 0; i < target_struct_size; i++)
-    printf ("%-15s %s\n",
-      target_structs[i]->to_shortname, 
-      target_structs[i]->to_longname);
-}
-
 /* Move memory to or from the targets.  Iterate until all of it has
    been moved, if necessary.  The top target gets priority; anything
    it doesn't want, is offered to the next one down, etc.  Note the
@@ -484,25 +497,15 @@ target_info (args, from_tty)
     }
 }
 
-/* The target command selects a target and calls its open routine.
-   The open routine takes the rest of the parameters from the command,
-   and (if successful) pushes a new target onto the stack.  */
+/* This is to be called by the open routine before it does
+   anything.  */
 
-static void
-target_command (args, from_tty)
-     char *args;
+void
+target_preopen (from_tty)
      int from_tty;
 {
-  int i, possible;
-  char *rest;
-  char *argend;
-
   dont_repeat();
 
-  if (!args)
-    error (
-     "Argument required (target name).  `info targets' lists possible targets");
-
   if (target_has_execution)
     {   
       if (query ("A program is being debugged already.  Kill it? "))
@@ -510,39 +513,6 @@ target_command (args, from_tty)
       else
         error ("Program not killed.");
     }
-        
-  /* Skip to first space, or end of args */
-  for (rest = args; *rest && !isspace(*rest); rest++) ;
-  argend = rest;
-  if (*rest == '\0')
-    rest = 0;          /* Only one word in args */
-  else
-    {
-      for (rest++; isspace (*rest); rest++) ;
-      if (*rest == '\0')       /* Only one word w/trailing blanks */
-       rest = 0;
-    }
-
-  /* Search target list for a match */
-
-  possible = -1;
-  for (i = 0; i < target_struct_size; i++)
-    {
-      if (!strncmp (args, target_structs[i]->to_shortname, argend - args)) {
-       /* If we have an exact match, it's time to quit.  */
-       if (target_structs[i]->to_shortname[args-argend] == '\0') {
-         possible = i;
-         break;
-       }
-       if (possible > 0)
-         error ("Ambiguous target.  `info targets' will list all targets");
-       possible = i;
-      }
-    }
-  if (possible < 0)
-    error ("No such target.  `info targets' will list all targets");
-
-  (*target_structs[possible]->to_open) (rest, from_tty);
 }
 
 static char targ_desc[] = 
@@ -556,20 +526,6 @@ _initialize_targets ()
   current_target = &dummy_target;
   cleanup_target (current_target);
 
-  add_info ("targets", targets_info,
-    "Names of all possible targets.\n\
-A target is typically a protocol for talking to debugging facilities;\n\
-for example, `child' for Unix child processes, or `vxworks' for a\n\
-TCP/IP link to a VxWorks system.");
-
   add_info ("target", target_info, targ_desc);
   add_info ("files", target_info, targ_desc);
-
-  add_com ("target", class_run, target_command,
-"Connect to a target machine or process.\n\
-The first argument is the type or protocol of the target machine.  Remaining\n\
-arguments are interpreted by the target protocol, but typically include\n\
-things like device names or host names to connect with, process numbers,\n\
-baud rates, etc.  You can list all possible targets with the `info targets'\n\
-command.");
 }