1992-08-05 17:49:48 +00:00
|
|
|
|
/* Remote debugging interface for AMD 29k interfaced via UDI, for GDB.
|
* tm-hppa.h: New file, architectural definition of HP PA.
* tm-hppabsd.h, tm-hppahpux.h: Shrink to deltas from tm-hppa.h.
* am29k-pinsn.c, am29k-tdep.c, copying.awk, copying.c,
hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, remote-udi.c,
ser-go32.c, xcoffsolib.c: Remove <stdio.h> which is already in
"defs.h".
* hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, xcoffsolib.c,
xcoffsolib.h, xm-go32.h, xm-hppabsd.h, xm-hppahpux.h: Copyrights.
1992-06-25 11:15:47 +00:00
|
|
|
|
Copyright 1990, 1992 Free Software Foundation, Inc.
|
|
|
|
|
Written by Daniel Mann. Contributed by AMD.
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
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
|
* tm-hppa.h: New file, architectural definition of HP PA.
* tm-hppabsd.h, tm-hppahpux.h: Shrink to deltas from tm-hppa.h.
* am29k-pinsn.c, am29k-tdep.c, copying.awk, copying.c,
hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, remote-udi.c,
ser-go32.c, xcoffsolib.c: Remove <stdio.h> which is already in
"defs.h".
* hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, xcoffsolib.c,
xcoffsolib.h, xm-go32.h, xm-hppabsd.h, xm-hppahpux.h: Copyrights.
1992-06-25 11:15:47 +00:00
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
(at your option) any later version.
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
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
|
* tm-hppa.h: New file, architectural definition of HP PA.
* tm-hppabsd.h, tm-hppahpux.h: Shrink to deltas from tm-hppa.h.
* am29k-pinsn.c, am29k-tdep.c, copying.awk, copying.c,
hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, remote-udi.c,
ser-go32.c, xcoffsolib.c: Remove <stdio.h> which is already in
"defs.h".
* hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, xcoffsolib.c,
xcoffsolib.h, xm-go32.h, xm-hppabsd.h, xm-hppahpux.h: Copyrights.
1992-06-25 11:15:47 +00:00
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-08-05 17:49:48 +00:00
|
|
|
|
/* This is like remote.c but uses the Universal Debug Interface (UDI) to
|
|
|
|
|
talk to the target hardware (or simulator). UDI is a TCP/IP based
|
|
|
|
|
protocol; for hardware that doesn't run TCP, an interface adapter
|
|
|
|
|
daemon talks UDI on one side, and talks to the hardware (typically
|
|
|
|
|
over a serial port) on the other side.
|
|
|
|
|
|
|
|
|
|
- Originally written by Daniel Mann at AMD for MiniMON and gdb 3.91.6.
|
* tm-hppa.h: New file, architectural definition of HP PA.
* tm-hppabsd.h, tm-hppahpux.h: Shrink to deltas from tm-hppa.h.
* am29k-pinsn.c, am29k-tdep.c, copying.awk, copying.c,
hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, remote-udi.c,
ser-go32.c, xcoffsolib.c: Remove <stdio.h> which is already in
"defs.h".
* hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, xcoffsolib.c,
xcoffsolib.h, xm-go32.h, xm-hppabsd.h, xm-hppahpux.h: Copyrights.
1992-06-25 11:15:47 +00:00
|
|
|
|
- David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
|
|
|
|
|
file to gdb 3.95. I was unable to get this working on sun3os4
|
1993-07-28 02:43:27 +00:00
|
|
|
|
with termio, only with sgtty.
|
1992-08-05 17:49:48 +00:00
|
|
|
|
- Daniel Mann at AMD took the 3.95 adaptions above and replaced
|
* tm-hppa.h: New file, architectural definition of HP PA.
* tm-hppabsd.h, tm-hppahpux.h: Shrink to deltas from tm-hppa.h.
* am29k-pinsn.c, am29k-tdep.c, copying.awk, copying.c,
hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, remote-udi.c,
ser-go32.c, xcoffsolib.c: Remove <stdio.h> which is already in
"defs.h".
* hppa-coredep.c, hppa-pinsn.c, hppabsd-core.c, hppabsd-tdep.c,
hppabsd-xdep.c, hppahpux-tdep.c, hppahpux-xdep.c, xcoffsolib.c,
xcoffsolib.h, xm-go32.h, xm-hppabsd.h, xm-hppahpux.h: Copyrights.
1992-06-25 11:15:47 +00:00
|
|
|
|
MiniMON interface with UDI-p interface. */
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#include "defs.h"
|
|
|
|
|
#include "inferior.h"
|
|
|
|
|
#include "wait.h"
|
|
|
|
|
#include "value.h"
|
|
|
|
|
#include <ctype.h>
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <signal.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include "terminal.h"
|
|
|
|
|
#include "target.h"
|
1992-05-08 15:49:48 +00:00
|
|
|
|
#include "29k-share/udi/udiproc.h"
|
1992-10-05 23:19:59 +00:00
|
|
|
|
#include "gdbcmd.h"
|
1992-11-12 01:15:06 +00:00
|
|
|
|
#include "bfd.h"
|
1993-08-09 21:36:49 +00:00
|
|
|
|
#include "gdbcore.h" /* For download function */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
/* access the register store directly, without going through
|
Split non-target-dependent code out of target_attach routines.
* target.h: Comments on target_attach args and results.
* infcmd.c (attach_command): Check for existing execution, call
target_attach, set up terminal status and wait_for_inferior, wait
for the attach status, and do normal_stop.
* inftarg.c (child_attach): Remove target independent stuff.
* remote-adapt.c (adapt_attach): Ditto.
* remote-mm.c (mm_attach): Ditto.
* remote-udi.c (udi_attach): Ditto.
* remote-vx.c (vx_attach): Ditto.
Cleanup.
* remote-hms.c (hms_attach): Remove completely, it was useless.
* remote-mm.c, remote-hms.c, remote-udi.c, remote-adapt.c: Remove
commented-out start_remote calls.
* remote-hms.c, remote-adapt.c, remote-mm.c, remote-udi.c: Remove
DENTER and DEXIT macros and their calls. Use a real debugger --
like gdb -- to see what functions are being called when.
1992-09-26 05:20:24 +00:00
|
|
|
|
the normal handler functions. This avoids an extra data copy. */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
extern int stop_soon_quietly; /* for wait_for_inferior */
|
|
|
|
|
extern struct value *call_function_by_hand();
|
1993-08-02 06:25:36 +00:00
|
|
|
|
static void udi_resume PARAMS ((int pid, int step, int sig));
|
1992-11-12 01:15:06 +00:00
|
|
|
|
static void udi_fetch_registers PARAMS ((int regno));
|
|
|
|
|
static void udi_load PARAMS ((char *args, int from_tty));
|
|
|
|
|
static void fetch_register PARAMS ((int regno));
|
|
|
|
|
static void udi_store_registers PARAMS ((int regno));
|
|
|
|
|
static int store_register PARAMS ((int regno));
|
|
|
|
|
static int regnum_to_srnum PARAMS ((int regno));
|
|
|
|
|
static void udi_close PARAMS ((int quitting));
|
|
|
|
|
static CPUSpace udi_memory_space PARAMS ((CORE_ADDR addr));
|
|
|
|
|
static int udi_write_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
|
|
|
|
|
int len));
|
|
|
|
|
static int udi_read_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
|
|
|
|
|
int len));
|
|
|
|
|
static void download PARAMS ((char *load_arg_string, int from_tty));
|
1992-04-24 05:48:30 +00:00
|
|
|
|
char CoffFileName[100] = "";
|
1993-09-16 23:45:46 +00:00
|
|
|
|
|
1993-02-10 04:09:05 +00:00
|
|
|
|
#define FREEZE_MODE (read_register(CPS_REGNUM) & 0x400)
|
1993-09-16 23:45:46 +00:00
|
|
|
|
#define USE_SHADOW_PC ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
static int timeout = 5;
|
|
|
|
|
extern struct target_ops udi_ops; /* Forward declaration */
|
|
|
|
|
|
|
|
|
|
/* Special register enumeration.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/******************************************************************* UDI DATA*/
|
|
|
|
|
#define MAXDATA 2*1024 /* max UDI[read/write] byte size */
|
|
|
|
|
/* Descriptor for I/O to remote machine. Initialize it to -1 so that
|
|
|
|
|
udi_open knows that we don't have a file open when the program
|
|
|
|
|
starts. */
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
UDISessionId udi_session_id = -1;
|
|
|
|
|
|
|
|
|
|
CPUOffset IMemStart = 0;
|
|
|
|
|
CPUSizeT IMemSize = 0;
|
|
|
|
|
CPUOffset DMemStart = 0;
|
|
|
|
|
CPUSizeT DMemSize = 0;
|
|
|
|
|
CPUOffset RMemStart = 0;
|
|
|
|
|
CPUSizeT RMemSize = 0;
|
|
|
|
|
UDIUInt32 CPUPRL;
|
|
|
|
|
UDIUInt32 CoProcPRL;
|
|
|
|
|
|
|
|
|
|
UDIMemoryRange address_ranges[2]; /* Text and data */
|
|
|
|
|
UDIResource entry = {0, 0}; /* Entry point */
|
|
|
|
|
CPUSizeT stack_sizes[2]; /* Regular and memory stacks */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
#define SBUF_MAX 1024 /* maximum size of string handling buffer */
|
|
|
|
|
char sbuf[SBUF_MAX];
|
|
|
|
|
|
|
|
|
|
typedef struct bkpt_entry_str
|
|
|
|
|
{
|
|
|
|
|
UDIResource Addr;
|
|
|
|
|
UDIUInt32 PassCount;
|
|
|
|
|
UDIBreakType Type;
|
|
|
|
|
unsigned int BreakId;
|
|
|
|
|
} bkpt_entry_t;
|
1992-04-24 21:39:01 +00:00
|
|
|
|
#define BKPT_TABLE_SIZE 40
|
|
|
|
|
static bkpt_entry_t bkpt_table[BKPT_TABLE_SIZE];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
extern char dfe_errmsg[]; /* error string */
|
|
|
|
|
|
|
|
|
|
/* malloc'd name of the program on the remote system. */
|
|
|
|
|
static char *prog_name = NULL;
|
|
|
|
|
|
|
|
|
|
/* Number of SIGTRAPs we need to simulate. That is, the next
|
|
|
|
|
NEED_ARTIFICIAL_TRAP calls to udi_wait should just return
|
|
|
|
|
SIGTRAP without actually waiting for anything. */
|
|
|
|
|
|
|
|
|
|
/* This is called not only when we first attach, but also when the
|
|
|
|
|
user types "run" after having attached. */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
static void
|
|
|
|
|
udi_create_inferior (execfile, args, env)
|
|
|
|
|
char *execfile;
|
|
|
|
|
char *args;
|
|
|
|
|
char **env;
|
|
|
|
|
{
|
1992-11-12 01:15:06 +00:00
|
|
|
|
char *args1;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
if (execfile)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
{
|
|
|
|
|
if (prog_name != NULL)
|
|
|
|
|
free (prog_name);
|
|
|
|
|
prog_name = savestring (execfile, strlen (execfile));
|
|
|
|
|
}
|
|
|
|
|
else if (entry.Offset)
|
|
|
|
|
execfile = "";
|
|
|
|
|
else
|
|
|
|
|
error ("No image loaded into target.");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (udi_session_id < 0)
|
|
|
|
|
{
|
|
|
|
|
printf("UDI connection not open yet.\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
inferior_pid = 40000;
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (!entry.Offset)
|
|
|
|
|
download(execfile, 0);
|
|
|
|
|
|
|
|
|
|
args1 = alloca (strlen(execfile) + strlen(args) + 2);
|
|
|
|
|
|
|
|
|
|
strcpy (args1, execfile);
|
|
|
|
|
strcat (args1, " ");
|
|
|
|
|
strcat (args1, args);
|
|
|
|
|
|
|
|
|
|
UDIInitializeProcess (address_ranges, /* ProcessMemory[] */
|
|
|
|
|
(UDIInt)2, /* NumberOfRanges */
|
|
|
|
|
entry, /* EntryPoint */
|
|
|
|
|
stack_sizes, /* *StackSizes */
|
|
|
|
|
(UDIInt)2, /* NumberOfStacks */
|
|
|
|
|
args1); /* ArgString */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
init_wait_for_inferior ();
|
|
|
|
|
clear_proceed_status ();
|
|
|
|
|
proceed(-1,-1,0);
|
|
|
|
|
}
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
static void
|
|
|
|
|
udi_mourn()
|
|
|
|
|
{
|
1993-09-27 15:30:29 +00:00
|
|
|
|
#if 0
|
|
|
|
|
/* Requiring "target udi" each time you run is a major pain. I suspect
|
|
|
|
|
this was just blindy copied from remote.c, in which "target" and
|
|
|
|
|
"run" are combined. Having a udi target without an inferior seems
|
|
|
|
|
to work between "target udi" and "run", so why not now? */
|
|
|
|
|
pop_target (); /* Pop back to no-child state */
|
|
|
|
|
#endif
|
|
|
|
|
generic_mourn_inferior ();
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************** UDI_OPEN
|
|
|
|
|
** Open a connection to remote TIP.
|
|
|
|
|
NAME is the socket domain used for communication with the TIP,
|
|
|
|
|
then a space and the socket name or TIP-host name.
|
1992-11-12 01:15:06 +00:00
|
|
|
|
'<udi_udi_config_id>' for example.
|
1992-04-24 05:48:30 +00:00
|
|
|
|
*/
|
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
/* XXX - need cleanups for udiconnect for various failures!!! */
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
static char *udi_config_id;
|
|
|
|
|
static void
|
|
|
|
|
udi_open (name, from_tty)
|
|
|
|
|
char *name;
|
|
|
|
|
int from_tty;
|
|
|
|
|
{
|
1992-11-12 01:15:06 +00:00
|
|
|
|
unsigned int prl;
|
|
|
|
|
char *p;
|
|
|
|
|
int cnt;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
UDIMemoryRange KnownMemory[10];
|
1992-11-12 01:15:06 +00:00
|
|
|
|
UDIUInt32 ChipVersions[10];
|
|
|
|
|
UDIInt NumberOfRanges = 10;
|
|
|
|
|
UDIInt NumberOfChips = 10;
|
|
|
|
|
UDIPId PId;
|
|
|
|
|
UDIUInt32 TIPId, TargetId, DFEId, DFE, TIP, DFEIPCId, TIPIPCId;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
target_preopen(from_tty);
|
|
|
|
|
|
1992-11-18 22:51:58 +00:00
|
|
|
|
entry.Offset = 0;
|
|
|
|
|
|
|
|
|
|
for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
|
|
|
|
|
bkpt_table[cnt].Type = 0;
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (udi_config_id)
|
|
|
|
|
free (udi_config_id);
|
|
|
|
|
|
|
|
|
|
if (!name)
|
|
|
|
|
error("Usage: target udi config_id, where config_id appears in udi_soc file");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
udi_config_id = strdup (strtok (name, " \t"));
|
|
|
|
|
|
|
|
|
|
if (UDIConnect (udi_config_id, &udi_session_id))
|
1992-05-07 17:47:36 +00:00
|
|
|
|
error("UDIConnect() failed: %s\n", dfe_errmsg);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
push_target (&udi_ops);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
** Initialize target configuration structure (global)
|
|
|
|
|
*/
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (UDIGetTargetConfig (KnownMemory, &NumberOfRanges,
|
|
|
|
|
ChipVersions, &NumberOfChips))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error ("UDIGetTargetConfig() failed");
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (NumberOfChips > 2)
|
|
|
|
|
fprintf(stderr,"Target has more than one processor\n");
|
|
|
|
|
for (cnt=0; cnt < NumberOfRanges; cnt++)
|
|
|
|
|
{
|
|
|
|
|
switch(KnownMemory[cnt].Space)
|
1992-04-24 05:48:30 +00:00
|
|
|
|
{
|
1992-11-12 01:15:06 +00:00
|
|
|
|
default:
|
|
|
|
|
fprintf(stderr, "UDIGetTargetConfig() unknown memory space\n");
|
|
|
|
|
break;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
case UDI29KCP_S:
|
1992-11-12 01:15:06 +00:00
|
|
|
|
break;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
case UDI29KIROMSpace:
|
1992-11-12 01:15:06 +00:00
|
|
|
|
RMemStart = KnownMemory[cnt].Offset;
|
|
|
|
|
RMemSize = KnownMemory[cnt].Size;
|
|
|
|
|
break;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
case UDI29KIRAMSpace:
|
1992-11-12 01:15:06 +00:00
|
|
|
|
IMemStart = KnownMemory[cnt].Offset;
|
|
|
|
|
IMemSize = KnownMemory[cnt].Size;
|
|
|
|
|
break;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
case UDI29KDRAMSpace:
|
1992-11-12 01:15:06 +00:00
|
|
|
|
DMemStart = KnownMemory[cnt].Offset;
|
|
|
|
|
DMemSize = KnownMemory[cnt].Size;
|
|
|
|
|
break;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
1992-11-12 01:15:06 +00:00
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1993-09-16 23:45:46 +00:00
|
|
|
|
a29k_get_processor_type ();
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (UDICreateProcess (&PId))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
fprintf(stderr, "UDICreateProcess() failed\n");
|
|
|
|
|
|
|
|
|
|
/* Print out some stuff, letting the user now what's going on */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (UDICapabilities (&TIPId, &TargetId, DFEId, DFE, &TIP, &DFEIPCId,
|
|
|
|
|
&TIPIPCId, sbuf))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error ("UDICapabilities() failed");
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (from_tty)
|
|
|
|
|
{
|
1993-09-16 23:45:46 +00:00
|
|
|
|
printf_filtered ("Connected via UDI socket,\n\
|
1992-04-24 05:48:30 +00:00
|
|
|
|
DFE-IPC version %x.%x.%x TIP-IPC version %x.%x.%x TIP version %x.%x.%x\n %s\n",
|
1992-11-12 01:15:06 +00:00
|
|
|
|
(DFEIPCId>>8)&0xf, (DFEIPCId>>4)&0xf, DFEIPCId&0xf,
|
|
|
|
|
(TIPIPCId>>8)&0xf, (TIPIPCId>>4)&0xf, TIPIPCId&0xf,
|
|
|
|
|
(TargetId>>8)&0xf, (TargetId>>4)&0xf, TargetId&0xf,
|
|
|
|
|
sbuf);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************* UDI_CLOSE
|
|
|
|
|
Close the open connection to the TIP process.
|
|
|
|
|
Use this when you want to detach and do something else
|
|
|
|
|
with your gdb. */
|
|
|
|
|
static void
|
|
|
|
|
udi_close (quitting) /*FIXME: how is quitting used */
|
|
|
|
|
int quitting;
|
|
|
|
|
{
|
|
|
|
|
if (udi_session_id < 0)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
return;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
/* We should never get here if there isn't something valid in
|
1992-11-12 01:15:06 +00:00
|
|
|
|
udi_session_id. */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (UDIDisconnect (udi_session_id, UDITerminateSession))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error ("UDIDisconnect() failed in udi_close");
|
|
|
|
|
|
|
|
|
|
/* Do not try to close udi_session_id again, later in the program. */
|
|
|
|
|
udi_session_id = -1;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
inferior_pid = 0;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
printf_filtered (" Ending remote debugging\n");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**************************************************************** UDI_ATACH */
|
|
|
|
|
/* Attach to a program that is already loaded and running
|
|
|
|
|
* Upon exiting the process's execution is stopped.
|
|
|
|
|
*/
|
|
|
|
|
static void
|
|
|
|
|
udi_attach (args, from_tty)
|
|
|
|
|
char *args;
|
|
|
|
|
int from_tty;
|
|
|
|
|
{
|
|
|
|
|
UDIResource From;
|
|
|
|
|
UDIInt32 PC_adds;
|
|
|
|
|
UDICount Count = 1;
|
|
|
|
|
UDISizeT Size = 4;
|
|
|
|
|
UDICount CountDone;
|
|
|
|
|
UDIBool HostEndian = 0;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
UDIError err;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
if (udi_session_id < 0)
|
1992-09-19 11:55:20 +00:00
|
|
|
|
error ("UDI connection not opened yet, use the 'target udi' command.\n");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
if (from_tty)
|
|
|
|
|
printf ("Attaching to remote program %s...\n", prog_name);
|
|
|
|
|
|
|
|
|
|
UDIStop();
|
1993-04-25 04:49:34 +00:00
|
|
|
|
From.Space = UDI29KSpecialRegs;
|
|
|
|
|
From.Offset = 11;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, &PC_adds, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error ("UDIRead failed in udi_attach");
|
|
|
|
|
printf ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds);
|
|
|
|
|
}
|
|
|
|
|
/************************************************************* UDI_DETACH */
|
|
|
|
|
/* Terminate the open connection to the TIP process.
|
|
|
|
|
Use this when you want to detach and do something else
|
|
|
|
|
with your gdb. Leave remote process running (with no breakpoints set). */
|
|
|
|
|
static void
|
|
|
|
|
udi_detach (args,from_tty)
|
|
|
|
|
char *args;
|
|
|
|
|
int from_tty;
|
|
|
|
|
{
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
remove_breakpoints(); /* Just in case there were any left in */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
|
|
|
|
if (UDIDisconnect (udi_session_id, UDIContinueSession))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error ("UDIDisconnect() failed in udi_detach");
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
pop_target(); /* calls udi_close to do the real work */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
if (from_tty)
|
|
|
|
|
printf ("Ending remote debugging\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************** UDI_RESUME
|
|
|
|
|
** Tell the remote machine to resume. */
|
|
|
|
|
|
|
|
|
|
static void
|
1993-08-02 06:25:36 +00:00
|
|
|
|
udi_resume (pid, step, sig)
|
|
|
|
|
int pid, step, sig;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
{
|
1992-10-05 23:19:59 +00:00
|
|
|
|
UDIError tip_error;
|
|
|
|
|
UDIUInt32 Steps = 1;
|
|
|
|
|
UDIStepType StepType = UDIStepNatural;
|
|
|
|
|
UDIRange Range;
|
Split non-target-dependent code out of target_attach routines.
* target.h: Comments on target_attach args and results.
* infcmd.c (attach_command): Check for existing execution, call
target_attach, set up terminal status and wait_for_inferior, wait
for the attach status, and do normal_stop.
* inftarg.c (child_attach): Remove target independent stuff.
* remote-adapt.c (adapt_attach): Ditto.
* remote-mm.c (mm_attach): Ditto.
* remote-udi.c (udi_attach): Ditto.
* remote-vx.c (vx_attach): Ditto.
Cleanup.
* remote-hms.c (hms_attach): Remove completely, it was useless.
* remote-mm.c, remote-hms.c, remote-udi.c, remote-adapt.c: Remove
commented-out start_remote calls.
* remote-hms.c, remote-adapt.c, remote-mm.c, remote-udi.c: Remove
DENTER and DEXIT macros and their calls. Use a real debugger --
like gdb -- to see what functions are being called when.
1992-09-26 05:20:24 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
if (step) /* step 1 instruction */
|
1992-10-05 23:19:59 +00:00
|
|
|
|
{
|
|
|
|
|
tip_error = UDIStep (Steps, StepType, Range);
|
|
|
|
|
if (!tip_error)
|
|
|
|
|
return;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-10-05 23:19:59 +00:00
|
|
|
|
fprintf (stderr, "UDIStep() error = %d\n", tip_error);
|
|
|
|
|
error ("failed in udi_resume");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (UDIExecute())
|
|
|
|
|
error ("UDIExecute() failed in udi_resume");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************** UDI_WAIT
|
|
|
|
|
** Wait until the remote machine stops, then return,
|
|
|
|
|
storing status in STATUS just as `wait' would. */
|
|
|
|
|
|
|
|
|
|
static int
|
1993-10-16 06:42:02 +00:00
|
|
|
|
udi_wait (pid, status)
|
|
|
|
|
int pid;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
WAITTYPE *status;
|
|
|
|
|
{
|
|
|
|
|
UDIInt32 MaxTime;
|
|
|
|
|
UDIPId PId;
|
|
|
|
|
UDIInt32 StopReason;
|
|
|
|
|
UDISizeT CountDone;
|
|
|
|
|
int old_timeout = timeout;
|
|
|
|
|
int old_immediate_quit = immediate_quit;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
WSETEXIT ((*status), 0);
|
|
|
|
|
|
|
|
|
|
/* wait for message to arrive. It should be:
|
|
|
|
|
If the target stops executing, udi_wait() should return.
|
|
|
|
|
*/
|
|
|
|
|
timeout = 0; /* Wait indefinetly for a message */
|
|
|
|
|
immediate_quit = 1; /* Helps ability to QUIT */
|
1992-10-05 23:19:59 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
while(1)
|
|
|
|
|
{
|
1992-10-05 23:19:59 +00:00
|
|
|
|
i = 0;
|
|
|
|
|
MaxTime = UDIWaitForever;
|
|
|
|
|
UDIWait(MaxTime, &PId, &StopReason);
|
|
|
|
|
QUIT; /* Let user quit if they want */
|
|
|
|
|
|
|
|
|
|
switch (StopReason & UDIGrossState)
|
|
|
|
|
{
|
|
|
|
|
case UDIStdoutReady:
|
|
|
|
|
if (UDIGetStdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone))
|
1993-09-02 04:39:59 +00:00
|
|
|
|
/* This is said to happen if the program tries to output
|
|
|
|
|
a whole bunch of output (more than SBUF_MAX, I would
|
|
|
|
|
guess). It doesn't seem to happen with the simulator. */
|
|
|
|
|
warning ("UDIGetStdout() failed in udi_wait");
|
1992-10-05 23:19:59 +00:00
|
|
|
|
fwrite (sbuf, 1, CountDone, stdout);
|
|
|
|
|
fflush(stdout);
|
|
|
|
|
continue;
|
|
|
|
|
case UDIStderrReady:
|
|
|
|
|
UDIGetStderr (sbuf, (UDISizeT)SBUF_MAX, &CountDone);
|
|
|
|
|
fwrite (sbuf, 1, CountDone, stderr);
|
|
|
|
|
fflush(stderr);
|
|
|
|
|
continue;
|
1993-09-09 17:58:46 +00:00
|
|
|
|
|
1992-10-05 23:19:59 +00:00
|
|
|
|
case UDIStdinNeeded:
|
1993-09-09 17:58:46 +00:00
|
|
|
|
{
|
|
|
|
|
int ch;
|
|
|
|
|
i = 0;
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
ch = getchar ();
|
|
|
|
|
if (ch == EOF)
|
|
|
|
|
break;
|
|
|
|
|
sbuf[i++] = ch;
|
|
|
|
|
} while (i < SBUF_MAX && ch != '\n');
|
|
|
|
|
UDIPutStdin (sbuf, (UDISizeT)i, &CountDone);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
1992-12-01 02:51:28 +00:00
|
|
|
|
case UDIRunning:
|
|
|
|
|
/* In spite of the fact that we told UDIWait to wait forever, it will
|
|
|
|
|
return spuriously sometimes. */
|
1992-10-05 23:19:59 +00:00
|
|
|
|
case UDIStdinModeX:
|
|
|
|
|
continue;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
1992-10-05 23:19:59 +00:00
|
|
|
|
|
|
|
|
|
switch (StopReason & UDIGrossState)
|
|
|
|
|
{
|
|
|
|
|
case UDITrapped:
|
|
|
|
|
printf("Am290*0 received vector number %d\n", StopReason >> 24);
|
|
|
|
|
|
|
|
|
|
switch (StopReason >> 8)
|
|
|
|
|
{
|
|
|
|
|
case 0: /* Illegal opcode */
|
|
|
|
|
printf(" (break point)\n");
|
|
|
|
|
WSETSTOP ((*status), SIGTRAP);
|
|
|
|
|
break;
|
|
|
|
|
case 1: /* Unaligned Access */
|
|
|
|
|
WSETSTOP ((*status), SIGBUS);
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
case 4:
|
|
|
|
|
WSETSTOP ((*status), SIGFPE);
|
|
|
|
|
break;
|
|
|
|
|
case 5: /* Protection Violation */
|
|
|
|
|
WSETSTOP ((*status), SIGILL);
|
|
|
|
|
break;
|
|
|
|
|
case 6:
|
|
|
|
|
case 7:
|
|
|
|
|
case 8: /* User Instruction Mapping Miss */
|
|
|
|
|
case 9: /* User Data Mapping Miss */
|
|
|
|
|
case 10: /* Supervisor Instruction Mapping Miss */
|
|
|
|
|
case 11: /* Supervisor Data Mapping Miss */
|
|
|
|
|
WSETSTOP ((*status), SIGSEGV);
|
|
|
|
|
break;
|
|
|
|
|
case 12:
|
|
|
|
|
case 13:
|
|
|
|
|
WSETSTOP ((*status), SIGILL);
|
|
|
|
|
break;
|
|
|
|
|
case 14: /* Timer */
|
|
|
|
|
WSETSTOP ((*status), SIGALRM);
|
|
|
|
|
break;
|
|
|
|
|
case 15: /* Trace */
|
|
|
|
|
WSETSTOP ((*status), SIGTRAP);
|
|
|
|
|
break;
|
|
|
|
|
case 16: /* INTR0 */
|
|
|
|
|
case 17: /* INTR1 */
|
|
|
|
|
case 18: /* INTR2 */
|
|
|
|
|
case 19: /* INTR3/Internal */
|
|
|
|
|
case 20: /* TRAP0 */
|
|
|
|
|
case 21: /* TRAP1 */
|
|
|
|
|
WSETSTOP ((*status), SIGINT);
|
|
|
|
|
break;
|
|
|
|
|
case 22: /* Floating-Point Exception */
|
|
|
|
|
WSETSTOP ((*status), SIGILL);
|
|
|
|
|
break;
|
|
|
|
|
case 77: /* assert 77 */
|
|
|
|
|
WSETSTOP ((*status), SIGTRAP);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
WSETEXIT ((*status), 0);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case UDINotExecuting:
|
1992-04-24 05:48:30 +00:00
|
|
|
|
WSETSTOP ((*status), SIGTERM);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
break;
|
|
|
|
|
case UDIStopped:
|
1992-04-24 05:48:30 +00:00
|
|
|
|
WSETSTOP ((*status), SIGTSTP);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
break;
|
|
|
|
|
case UDIWarned:
|
1993-05-01 00:06:46 +00:00
|
|
|
|
WSETSTOP ((*status), SIGURG);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
break;
|
|
|
|
|
case UDIStepped:
|
|
|
|
|
case UDIBreak:
|
1992-04-24 05:48:30 +00:00
|
|
|
|
WSETSTOP ((*status), SIGTRAP);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
break;
|
|
|
|
|
case UDIWaiting:
|
1992-04-24 05:48:30 +00:00
|
|
|
|
WSETSTOP ((*status), SIGSTOP);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
break;
|
|
|
|
|
case UDIHalted:
|
1992-04-24 05:48:30 +00:00
|
|
|
|
WSETSTOP ((*status), SIGKILL);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
break;
|
|
|
|
|
case UDIExited:
|
|
|
|
|
default:
|
|
|
|
|
WSETEXIT ((*status), 0);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
timeout = old_timeout; /* Restore original timeout value */
|
|
|
|
|
immediate_quit = old_immediate_quit;
|
1993-09-14 16:19:30 +00:00
|
|
|
|
return inferior_pid;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
1993-10-21 10:10:21 +00:00
|
|
|
|
#if 0
|
|
|
|
|
/* Handy for debugging */
|
|
|
|
|
udi_pc()
|
|
|
|
|
{
|
|
|
|
|
UDIResource From;
|
|
|
|
|
UDIUInt32 *To;
|
|
|
|
|
UDICount Count;
|
|
|
|
|
UDISizeT Size = 4;
|
|
|
|
|
UDICount CountDone;
|
|
|
|
|
UDIBool HostEndian = 0;
|
|
|
|
|
UDIError err;
|
|
|
|
|
int pc[2];
|
1993-10-25 22:24:02 +00:00
|
|
|
|
unsigned long myregs[256];
|
|
|
|
|
int i;
|
1993-10-21 10:10:21 +00:00
|
|
|
|
|
|
|
|
|
From.Space = UDI29KPC;
|
|
|
|
|
From.Offset = 0;
|
|
|
|
|
To = (UDIUInt32 *)pc;
|
|
|
|
|
Count = 2;
|
|
|
|
|
|
|
|
|
|
err = UDIRead(From, To, Count, Size, &CountDone, HostEndian);
|
|
|
|
|
|
|
|
|
|
printf ("err = %d, CountDone = %d, pc[0] = 0x%x, pc[1] = 0x%x\n",
|
|
|
|
|
err, CountDone, pc[0], pc[1]);
|
|
|
|
|
|
|
|
|
|
udi_fetch_registers(-1);
|
|
|
|
|
|
|
|
|
|
printf("other pc1 = 0x%x, pc0 = 0x%x\n", *(int *)®isters[4 * PC_REGNUM],
|
|
|
|
|
*(int *)®isters[4 * NPC_REGNUM]);
|
|
|
|
|
|
1993-10-25 22:24:02 +00:00
|
|
|
|
/* Now, read all the registers globally */
|
|
|
|
|
|
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
|
|
|
|
From.Offset = 0;
|
|
|
|
|
err = UDIRead(From, myregs, 256, 4, &CountDone, HostEndian);
|
|
|
|
|
|
|
|
|
|
printf ("err = %d, CountDone = %d\n", err, CountDone);
|
|
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 256; i += 2)
|
|
|
|
|
printf("%d:\t%#10x\t%11d\t%#10x\t%11d\n", i, myregs[i], myregs[i],
|
|
|
|
|
myregs[i+1], myregs[i+1]);
|
|
|
|
|
printf("\n");
|
|
|
|
|
|
1993-10-21 10:10:21 +00:00
|
|
|
|
return pc[0];
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
/********************************************************** UDI_FETCH_REGISTERS
|
|
|
|
|
* Read a remote register 'regno'.
|
|
|
|
|
* If regno==-1 then read all the registers.
|
|
|
|
|
*/
|
|
|
|
|
static void
|
|
|
|
|
udi_fetch_registers (regno)
|
|
|
|
|
int regno;
|
|
|
|
|
{
|
|
|
|
|
UDIResource From;
|
|
|
|
|
UDIUInt32 *To;
|
|
|
|
|
UDICount Count;
|
|
|
|
|
UDISizeT Size = 4;
|
|
|
|
|
UDICount CountDone;
|
|
|
|
|
UDIBool HostEndian = 0;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
UDIError err;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
if (regno >= 0) {
|
1992-05-07 17:47:36 +00:00
|
|
|
|
fetch_register(regno);
|
|
|
|
|
return;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Gr1/rsp */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
|
|
|
|
From.Offset = 1;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
To = (UDIUInt32 *)®isters[4 * GR1_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
Count = 1;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
register_valid[GR1_REGNUM] = 1;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
#if defined(GR64_REGNUM) /* Read gr64-127 */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
/* Global Registers gr64-gr95 */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
|
|
|
|
From.Offset = 64;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
To = (UDIUInt32 *)®isters[4 * GR64_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
Count = 32;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
for (i = GR64_REGNUM; i < GR64_REGNUM + 32; i++)
|
|
|
|
|
register_valid[i] = 1;
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#endif /* GR64_REGNUM */
|
|
|
|
|
|
|
|
|
|
/* Global Registers gr96-gr127 */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
From.Offset = 96;
|
|
|
|
|
To = (UDIUInt32 *)®isters[4 * GR96_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
Count = 32;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
for (i = GR96_REGNUM; i < GR96_REGNUM + 32; i++)
|
|
|
|
|
register_valid[i] = 1;
|
|
|
|
|
|
|
|
|
|
/* Local Registers */
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From.Space = UDI29KLocalRegs;
|
|
|
|
|
From.Offset = 0;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
To = (UDIUInt32 *)®isters[4 * LR0_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
Count = 128;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
for (i = LR0_REGNUM; i < LR0_REGNUM + 128; i++)
|
|
|
|
|
register_valid[i] = 1;
|
|
|
|
|
|
|
|
|
|
/* Protected Special Registers */
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From.Space = UDI29KSpecialRegs;
|
|
|
|
|
From.Offset = 0;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
To = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
Count = 15;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
for (i = SR_REGNUM(0); i < SR_REGNUM(0) + 15; i++)
|
|
|
|
|
register_valid[i] = 1;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
if (USE_SHADOW_PC) { /* Let regno_to_srnum() handle the register number */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
fetch_register(NPC_REGNUM);
|
|
|
|
|
fetch_register(PC_REGNUM);
|
|
|
|
|
fetch_register(PC2_REGNUM);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
/* Unprotected Special Registers sr128-sr135 */
|
|
|
|
|
|
|
|
|
|
From.Space = UDI29KSpecialRegs;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From.Offset = 128;
|
1992-05-07 17:47:36 +00:00
|
|
|
|
To = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)];
|
|
|
|
|
Count = 135-128 + 1;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
for (i = SR_REGNUM(128); i < SR_REGNUM(128) + 135-128+1; i++)
|
|
|
|
|
register_valid[i] = 1;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
1993-10-21 00:49:42 +00:00
|
|
|
|
if (remote_debug)
|
1992-10-05 23:19:59 +00:00
|
|
|
|
{
|
|
|
|
|
printf("Fetching all registers\n");
|
|
|
|
|
printf("Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
|
|
|
|
|
read_register(NPC_REGNUM), read_register(PC_REGNUM),
|
|
|
|
|
read_register(PC2_REGNUM));
|
|
|
|
|
}
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
/* There doesn't seem to be any way to get these. */
|
|
|
|
|
{
|
|
|
|
|
int val = -1;
|
|
|
|
|
supply_register (FPE_REGNUM, (char *) &val);
|
1992-05-07 17:47:36 +00:00
|
|
|
|
supply_register (INTE_REGNUM, (char *) &val);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
supply_register (FPS_REGNUM, (char *) &val);
|
|
|
|
|
supply_register (EXO_REGNUM, (char *) &val);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************* UDI_STORE_REGISTERS
|
|
|
|
|
** Store register regno into the target.
|
|
|
|
|
* If regno==-1 then store all the registers.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
udi_store_registers (regno)
|
|
|
|
|
int regno;
|
|
|
|
|
{
|
|
|
|
|
UDIUInt32 *From;
|
|
|
|
|
UDIResource To;
|
|
|
|
|
UDICount Count;
|
|
|
|
|
UDISizeT Size = 4;
|
|
|
|
|
UDICount CountDone;
|
|
|
|
|
UDIBool HostEndian = 0;
|
|
|
|
|
|
|
|
|
|
if (regno >= 0)
|
|
|
|
|
{
|
|
|
|
|
store_register(regno);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
1993-10-21 00:49:42 +00:00
|
|
|
|
if (remote_debug)
|
1992-10-05 23:19:59 +00:00
|
|
|
|
{
|
|
|
|
|
printf("Storing all registers\n");
|
|
|
|
|
printf("PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", read_register(NPC_REGNUM),
|
|
|
|
|
read_register(PC_REGNUM), read_register(PC2_REGNUM));
|
|
|
|
|
}
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
/* Gr1/rsp */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * GR1_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KGlobalRegs;
|
|
|
|
|
To.Offset = 1;
|
|
|
|
|
Count = 1;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
|
|
|
|
#if defined(GR64_REGNUM)
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
/* Global registers gr64-gr95 */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * GR64_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KGlobalRegs;
|
|
|
|
|
To.Offset = 64;
|
|
|
|
|
Count = 32;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#endif /* GR64_REGNUM */
|
|
|
|
|
|
|
|
|
|
/* Global registers gr96-gr127 */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * GR96_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KGlobalRegs;
|
|
|
|
|
To.Offset = 96;
|
|
|
|
|
Count = 32;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
|
|
|
|
/* Local Registers */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * LR0_REGNUM];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KLocalRegs;
|
|
|
|
|
To.Offset = 0;
|
|
|
|
|
Count = 128;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Protected Special Registers */ /* VAB through TMR */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * SR_REGNUM(0)];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KSpecialRegs;
|
|
|
|
|
To.Offset = 0;
|
|
|
|
|
Count = 10;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
1992-05-07 17:47:36 +00:00
|
|
|
|
/* PC0, PC1, PC2 possibly as shadow registers */
|
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * SR_REGNUM(10)];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KSpecialRegs;
|
|
|
|
|
Count = 3;
|
|
|
|
|
if (USE_SHADOW_PC)
|
|
|
|
|
To.Offset = 20; /* SPC0 */
|
|
|
|
|
else
|
|
|
|
|
To.Offset = 10; /* PC0 */
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
1993-10-21 10:10:21 +00:00
|
|
|
|
/* PC1 via UDI29KPC */
|
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * PC_REGNUM];
|
|
|
|
|
To.Space = UDI29KPC;
|
|
|
|
|
To.Offset = 0; /* PC1 */
|
|
|
|
|
Count = 1;
|
|
|
|
|
if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error ("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
/* LRU and MMU */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * SR_REGNUM(13)];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KSpecialRegs;
|
|
|
|
|
To.Offset = 13;
|
|
|
|
|
Count = 2;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
|
|
|
|
/* Unprotected Special Registers */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
|
|
|
|
From = (UDIUInt32 *)®isters[4 * SR_REGNUM(128)];
|
1992-04-24 05:48:30 +00:00
|
|
|
|
To.Space = UDI29KSpecialRegs;
|
|
|
|
|
To.Offset = 128;
|
|
|
|
|
Count = 135-128 +1;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
error("UDIWrite() failed in udi_store_regisetrs");
|
|
|
|
|
|
|
|
|
|
registers_changed ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/****************************************************** UDI_PREPARE_TO_STORE */
|
|
|
|
|
/* Get ready to modify the registers array. On machines which store
|
|
|
|
|
individual registers, this doesn't need to do anything. On machines
|
|
|
|
|
which store all the registers in one fell swoop, this makes sure
|
|
|
|
|
that registers contains all the registers from the program being
|
|
|
|
|
debugged. */
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
udi_prepare_to_store ()
|
|
|
|
|
{
|
|
|
|
|
/* Do nothing, since we can store individual regs */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/********************************************************** TRANSLATE_ADDR */
|
|
|
|
|
static CORE_ADDR
|
|
|
|
|
translate_addr(addr)
|
|
|
|
|
CORE_ADDR addr;
|
|
|
|
|
{
|
|
|
|
|
#if defined(ULTRA3) && defined(KERNEL_DEBUGGING)
|
|
|
|
|
/* Check for a virtual address in the kernel */
|
|
|
|
|
/* Assume physical address of ublock is in paddr_u register */
|
|
|
|
|
/* FIXME: doesn't work for user virtual addresses */
|
|
|
|
|
if (addr >= UVADDR) {
|
|
|
|
|
/* PADDR_U register holds the physical address of the ublock */
|
|
|
|
|
CORE_ADDR i = (CORE_ADDR)read_register(PADDR_U_REGNUM);
|
|
|
|
|
return(i + addr - (CORE_ADDR)UVADDR);
|
|
|
|
|
} else {
|
|
|
|
|
return(addr);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
return(addr);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
/************************************************* UDI_XFER_INFERIOR_MEMORY */
|
|
|
|
|
/* FIXME! Merge these two. */
|
|
|
|
|
static int
|
|
|
|
|
udi_xfer_inferior_memory (memaddr, myaddr, len, write)
|
|
|
|
|
CORE_ADDR memaddr;
|
|
|
|
|
char *myaddr;
|
|
|
|
|
int len;
|
|
|
|
|
int write;
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
memaddr = translate_addr(memaddr);
|
|
|
|
|
|
|
|
|
|
if (write)
|
|
|
|
|
return udi_write_inferior_memory (memaddr, myaddr, len);
|
|
|
|
|
else
|
|
|
|
|
return udi_read_inferior_memory (memaddr, myaddr, len);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/********************************************************** UDI_FILES_INFO */
|
|
|
|
|
static void
|
|
|
|
|
udi_files_info ()
|
|
|
|
|
{
|
|
|
|
|
printf ("\tAttached to UDI socket to %s and running program %s.\n",
|
|
|
|
|
udi_config_id, prog_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**************************************************** UDI_INSERT_BREAKPOINT */
|
|
|
|
|
static int
|
|
|
|
|
udi_insert_breakpoint (addr, contents_cache)
|
|
|
|
|
CORE_ADDR addr;
|
|
|
|
|
char *contents_cache;
|
|
|
|
|
{
|
1992-04-24 21:39:01 +00:00
|
|
|
|
int cnt;
|
|
|
|
|
UDIError err;
|
|
|
|
|
|
|
|
|
|
for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
|
|
|
|
|
if (bkpt_table[cnt].Type == 0) /* Find first free slot */
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if(cnt >= BKPT_TABLE_SIZE)
|
|
|
|
|
error("Too many breakpoints set");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
bkpt_table[cnt].Addr.Offset = addr;
|
|
|
|
|
bkpt_table[cnt].Addr.Space = UDI29KIRAMSpace;
|
|
|
|
|
bkpt_table[cnt].PassCount = 1;
|
|
|
|
|
bkpt_table[cnt].Type = UDIBreakFlagExecute;
|
|
|
|
|
|
1992-04-24 21:39:01 +00:00
|
|
|
|
err = UDISetBreakpoint(bkpt_table[cnt].Addr,
|
|
|
|
|
bkpt_table[cnt].PassCount,
|
|
|
|
|
bkpt_table[cnt].Type,
|
|
|
|
|
&bkpt_table[cnt].BreakId);
|
|
|
|
|
|
|
|
|
|
if (err == 0) return 0; /* Success */
|
|
|
|
|
|
|
|
|
|
bkpt_table[cnt].Type = 0;
|
|
|
|
|
error("UDISetBreakpoint returned error code %d\n", err);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**************************************************** UDI_REMOVE_BREAKPOINT */
|
|
|
|
|
static int
|
|
|
|
|
udi_remove_breakpoint (addr, contents_cache)
|
|
|
|
|
CORE_ADDR addr;
|
|
|
|
|
char *contents_cache;
|
|
|
|
|
{
|
1992-04-24 21:39:01 +00:00
|
|
|
|
int cnt;
|
|
|
|
|
UDIError err;
|
|
|
|
|
|
|
|
|
|
for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
|
|
|
|
|
if (bkpt_table[cnt].Addr.Offset == addr) /* Find matching breakpoint */
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if(cnt >= BKPT_TABLE_SIZE)
|
|
|
|
|
error("Can't find breakpoint in table");
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
bkpt_table[cnt].Type = 0;
|
|
|
|
|
|
1992-04-24 21:39:01 +00:00
|
|
|
|
err = UDIClearBreakpoint(bkpt_table[cnt].BreakId);
|
|
|
|
|
if (err == 0) return 0; /* Success */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-04-24 21:39:01 +00:00
|
|
|
|
error("UDIClearBreakpoint returned error code %d\n", err);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
udi_kill(arg,from_tty)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
char *arg;
|
|
|
|
|
int from_tty;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
{
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
#if 0
|
|
|
|
|
/*
|
|
|
|
|
UDIStop does not really work as advertised. It causes the TIP to close it's
|
|
|
|
|
connection, which usually results in GDB dying with a SIGPIPE. For now, we
|
|
|
|
|
just invoke udi_close, which seems to get things right.
|
|
|
|
|
*/
|
|
|
|
|
UDIStop();
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
udi_session_id = -1;
|
|
|
|
|
inferior_pid = 0;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
if (from_tty)
|
|
|
|
|
printf("Target has been stopped.");
|
|
|
|
|
#else
|
|
|
|
|
udi_close(0);
|
|
|
|
|
#endif
|
|
|
|
|
pop_target();
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
/*
|
1992-11-12 01:15:06 +00:00
|
|
|
|
Load a program into the target. Args are: `program {options}'. The options
|
|
|
|
|
are used to control loading of the program, and are NOT passed onto the
|
|
|
|
|
loaded code as arguments. (You need to use the `run' command to do that.)
|
|
|
|
|
|
|
|
|
|
The options are:
|
|
|
|
|
-ms %d Set mem stack size to %d
|
|
|
|
|
-rs %d Set regular stack size to %d
|
|
|
|
|
-i send init info (default)
|
|
|
|
|
-noi don't send init info
|
|
|
|
|
-[tT] Load Text section
|
|
|
|
|
-[dD] Load Data section
|
|
|
|
|
-[bB] Load BSS section
|
|
|
|
|
-[lL] Load Lit section
|
|
|
|
|
*/
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
static void
|
1992-11-12 01:15:06 +00:00
|
|
|
|
download(load_arg_string, from_tty)
|
|
|
|
|
char *load_arg_string;
|
|
|
|
|
int from_tty;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
{
|
1992-11-12 01:15:06 +00:00
|
|
|
|
#define DEFAULT_MEM_STACK_SIZE 0x6000
|
|
|
|
|
#define DEFAULT_REG_STACK_SIZE 0x2000
|
|
|
|
|
|
|
|
|
|
char *token;
|
|
|
|
|
char *filename;
|
|
|
|
|
asection *section;
|
|
|
|
|
bfd *pbfd;
|
|
|
|
|
UDIError err;
|
|
|
|
|
int load_text = 1, load_data = 1, load_bss = 1, load_lit = 1;
|
|
|
|
|
|
|
|
|
|
address_ranges[0].Space = UDI29KIRAMSpace;
|
|
|
|
|
address_ranges[0].Offset = 0xffffffff;
|
|
|
|
|
address_ranges[0].Size = 0;
|
|
|
|
|
|
|
|
|
|
address_ranges[1].Space = UDI29KDRAMSpace;
|
|
|
|
|
address_ranges[1].Offset = 0xffffffff;
|
|
|
|
|
address_ranges[1].Size = 0;
|
|
|
|
|
|
|
|
|
|
stack_sizes[0] = DEFAULT_REG_STACK_SIZE;
|
|
|
|
|
stack_sizes[1] = DEFAULT_MEM_STACK_SIZE;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
dont_repeat ();
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
filename = strtok(load_arg_string, " \t");
|
|
|
|
|
if (!filename)
|
|
|
|
|
error ("Must specify at least a file name with the load command");
|
|
|
|
|
|
|
|
|
|
filename = tilde_expand (filename);
|
|
|
|
|
make_cleanup (free, filename);
|
|
|
|
|
|
|
|
|
|
while (token = strtok (NULL, " \t"))
|
|
|
|
|
{
|
|
|
|
|
if (token[0] == '-')
|
|
|
|
|
{
|
|
|
|
|
token++;
|
|
|
|
|
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|
|
|
|
if (STREQ (token, "ms"))
|
1992-11-12 01:15:06 +00:00
|
|
|
|
stack_sizes[1] = atol (strtok (NULL, " \t"));
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|
|
|
|
else if (STREQ (token, "rs"))
|
1992-11-12 01:15:06 +00:00
|
|
|
|
stack_sizes[0] = atol (strtok (NULL, " \t"));
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
load_text = load_data = load_bss = load_lit = 0;
|
|
|
|
|
|
|
|
|
|
while (*token)
|
|
|
|
|
{
|
|
|
|
|
switch (*token++)
|
|
|
|
|
{
|
|
|
|
|
case 't':
|
|
|
|
|
case 'T':
|
|
|
|
|
load_text = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 'd':
|
|
|
|
|
case 'D':
|
|
|
|
|
load_data = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 'b':
|
|
|
|
|
case 'B':
|
|
|
|
|
load_bss = 1;
|
|
|
|
|
break;
|
|
|
|
|
case 'l':
|
|
|
|
|
case 'L':
|
|
|
|
|
load_lit = 1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
error ("Unknown UDI load option -%s", token-1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
1993-08-09 16:53:32 +00:00
|
|
|
|
pbfd = bfd_openr (filename, gnutarget);
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
|
|
|
|
if (!pbfd)
|
|
|
|
|
perror_with_name (filename);
|
|
|
|
|
|
|
|
|
|
make_cleanup (bfd_close, pbfd);
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
QUIT;
|
|
|
|
|
immediate_quit++;
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
|
|
|
|
if (!bfd_check_format (pbfd, bfd_object))
|
|
|
|
|
error ("It doesn't seem to be an object file");
|
|
|
|
|
|
|
|
|
|
for (section = pbfd->sections; section; section = section->next)
|
|
|
|
|
{
|
|
|
|
|
if (bfd_get_section_flags (pbfd, section) & SEC_ALLOC)
|
|
|
|
|
{
|
|
|
|
|
UDIResource To;
|
|
|
|
|
UDICount Count;
|
|
|
|
|
unsigned long section_size, section_end;
|
|
|
|
|
const char *section_name;
|
|
|
|
|
|
|
|
|
|
section_name = bfd_get_section_name (pbfd, section);
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|
|
|
|
if (STREQ (section_name, ".text") && !load_text)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
continue;
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|
|
|
|
else if (STREQ (section_name, ".data") && !load_data)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
continue;
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|
|
|
|
else if (STREQ (section_name, ".bss") && !load_bss)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
continue;
|
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype.
* dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ
and STREQN defined in defs.h.
* dwarfread.c (set_cu_language): For completely unknown languages,
try to deduce the language from the filename. Retain behavior
that for known languages we don't know how to handle, we use
language_unknown.
* dwarfread.c (enum_type, symthesize_typedef): Initialize language
and demangled name fields in symbol.
* dwarfread.c, mipsread.c, partial-stab.h: For all usages of
ADD_PSYMBOL_TO_LIST, add language and objfile parameters.
* dwarfread.c (new_symbol): Attempt to demangle C++ symbol names
and cache the results in SYMBOL_DEMANGLED_NAME for the symbol.
* elfread.c (STREQ): Remove macro, use STREQ defined in defs.h.
Replace usages throughout.
* elfread.c (demangle.h): Include.
* elfread.c (record_minimal_symbol): Remove prototype and function.
* gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES,
B_CLRALL): Moved from symtab.h to gdbtypes.h.
* infcmd.c (jump_command): Remove code to demangle name and add
it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME.
* minsyms.c (demangle.h): Include.
* minsyms.c (lookup_minimal_symbol): Indent comment to match code.
* minsyms.c (install_minimal_symbols): Attempt to demangle symbol
names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME.
* mipsread.c (psymtab_language): Add static variable.
* stabsread.c (demangle.h): Include.
* stabsread.c (define_symbol): Attempt to demangle C++ symbol
names and cache them in the SYMBOL_DEMANGLED_NAME field.
* stack.c (return_command): Remove explicit demangling of name
and use of cleanups. Just use SYMBOL_DEMANGLED_NAME.
* symfile.c (demangle.h): Include.
* symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix
to match macros in symfile.h and allow them to be compiled
if INLINE_ADD_PSYMBOL is not true.
* symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set.
* symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters.
Add code to demangle and cache C++ symbol names. Use macro form
if INLINE_ADD_PSYMBOL is true, otherwise use C function form.
* symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list):
Remove, also defined in symfile.c, which we already fixed.
* symtab.c (expensive_mangler): Remove prototype and function.
* symtab.c (find_methods): Remove physnames parameter and fix
prototype to match.
* symtab.c (completion_list_add_symbol): Name changed to
completion_list_add_name.
* symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both
the normal symbol name and the cached C++ demangled name.
* symtab.c (lookup_demangled_partial_symbol,
lookup_demangled_block_symbol): Remove prototypes and functions.
* symtab.c (lookup_symbol): Remove use of expensive_mangler,
use lookup_block_symbol instead of lookup_demangled_block_symbol.
Remove code to try demangling names and matching them.
* symtab.c (lookup_partial_symbol, lookup_block_symbol):
Fix to try matching the cached demangled name if no match is
found using the regular symbol name.
* symtab.c (find_methods): Remove unused physnames array.
* symtab.c (name_match, NAME_MATCH): Remove function and macro,
replaced with SYMBOL_MATCHES_REGEXP from symtab.h.
* symtab.c (completion_list_add_symbol): Rewrite to use cached
C++ demangled symbol names.
* symtab.h: Much reformatting of structures and such to add
whitespace to make them more readable, and make them more
consistent with other gdb structure definitions.
* symtab.h (general_symbol_info): New struct containing fields
common to all symbols.
* symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME,
SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME,
SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros.
* symtab. (struct minimal_symbol, struct partial_symbol, struct
symbol): Use general_symbol_info struct.
* utils.c (demangle_and_match): Remove, no longer used.
* valops.c (demangle.h): Include.
* xcoffexec.c (eq): Remove macro, replace usages with STREQ.
* blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c,
infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c,
symmisc.c, symtab.c, valops.c: Replace references to minimal
symbol fields with appropriate macros.
* breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c,
coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c,
demangle.c, elfread.c, energize.c, environ.c, exec.c,
gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c,
main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c,
remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c,
sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c,
symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h,
tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp
and strncmp usages with STREQ, STREQN, or STRCMP as appropriate.
* breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c,
mipsread.c, printcmd.c, source.c, stabsread.c, stack.c,
symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME
references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as
appropriate.
* buildsym.c (start_subfile, patch_subfile_names): Default the
source language to what can be deduced from the filename.
* buildsym.c (end_symtab): Update the source language in the
allocated symtab to match what we have been using.
* buildsym.h (struct subfile): Add a language field.
* c-typeprint.c (c_print_type): Remove code to do explicit
demangling.
* dbxread.c (psymtab_language): Add static variable.
* dbxread.c (start_psymtab): Initialize psymtab_language using
deduce_language_from_filename.
1992-12-23 06:34:57 +00:00
|
|
|
|
else if (STREQ (section_name, ".lit") && !load_lit)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
To.Offset = bfd_get_section_vma (pbfd, section);
|
|
|
|
|
section_size = bfd_section_size (pbfd, section);
|
|
|
|
|
section_end = To.Offset + section_size;
|
|
|
|
|
|
1993-09-24 01:51:28 +00:00
|
|
|
|
if (section_size == 0)
|
|
|
|
|
/* This is needed at least in the BSS case, where the code
|
|
|
|
|
below starts writing before it even checks the size. */
|
|
|
|
|
continue;
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
printf("[Loading section %s at %x (%d bytes)]\n",
|
|
|
|
|
section_name,
|
|
|
|
|
To.Offset,
|
|
|
|
|
section_size);
|
|
|
|
|
|
|
|
|
|
if (bfd_get_section_flags (pbfd, section) & SEC_CODE)
|
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KIRAMSpace;
|
|
|
|
|
|
|
|
|
|
address_ranges[0].Offset = min (address_ranges[0].Offset,
|
|
|
|
|
To.Offset);
|
|
|
|
|
address_ranges[0].Size = max (address_ranges[0].Size,
|
|
|
|
|
section_end
|
|
|
|
|
- address_ranges[0].Offset);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KDRAMSpace;
|
|
|
|
|
|
|
|
|
|
address_ranges[1].Offset = min (address_ranges[1].Offset,
|
|
|
|
|
To.Offset);
|
|
|
|
|
address_ranges[1].Size = max (address_ranges[1].Size,
|
|
|
|
|
section_end
|
|
|
|
|
- address_ranges[1].Offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bfd_get_section_flags (pbfd, section) & SEC_LOAD) /* Text, data or lit */
|
|
|
|
|
{
|
|
|
|
|
file_ptr fptr;
|
|
|
|
|
|
|
|
|
|
fptr = 0;
|
|
|
|
|
|
|
|
|
|
while (section_size > 0)
|
|
|
|
|
{
|
|
|
|
|
char buffer[1024];
|
|
|
|
|
|
|
|
|
|
Count = min (section_size, 1024);
|
|
|
|
|
|
|
|
|
|
bfd_get_section_contents (pbfd, section, buffer, fptr,
|
|
|
|
|
Count);
|
|
|
|
|
|
|
|
|
|
err = UDIWrite ((UDIHostMemPtr)buffer, /* From */
|
|
|
|
|
To, /* To */
|
|
|
|
|
Count, /* Count */
|
|
|
|
|
(UDISizeT)1, /* Size */
|
|
|
|
|
&Count, /* CountDone */
|
|
|
|
|
(UDIBool)0); /* HostEndian */
|
|
|
|
|
if (err)
|
|
|
|
|
error ("UDIWrite failed, error = %d", err);
|
|
|
|
|
|
|
|
|
|
To.Offset += Count;
|
|
|
|
|
fptr += Count;
|
|
|
|
|
section_size -= Count;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else /* BSS */
|
|
|
|
|
{
|
|
|
|
|
UDIResource From;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
unsigned long zero = 0;
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
|
|
|
|
/* Write a zero byte at the vma */
|
1993-09-24 01:51:28 +00:00
|
|
|
|
/* FIXME: Broken for sections of 1-3 bytes (we test for
|
|
|
|
|
zero above). */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
err = UDIWrite ((UDIHostMemPtr)&zero, /* From */
|
|
|
|
|
To, /* To */
|
|
|
|
|
(UDICount)1, /* Count */
|
1992-11-18 22:51:58 +00:00
|
|
|
|
(UDISizeT)4, /* Size */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
&Count, /* CountDone */
|
|
|
|
|
(UDIBool)0); /* HostEndian */
|
|
|
|
|
if (err)
|
|
|
|
|
error ("UDIWrite failed, error = %d", err);
|
|
|
|
|
|
|
|
|
|
From = To;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
To.Offset+=4;
|
1992-11-12 01:15:06 +00:00
|
|
|
|
|
|
|
|
|
/* Now, duplicate it for the length of the BSS */
|
|
|
|
|
err = UDICopy (From, /* From */
|
|
|
|
|
To, /* To */
|
1992-11-18 22:51:58 +00:00
|
|
|
|
(UDICount)(section_size/4 - 1), /* Count */
|
|
|
|
|
(UDISizeT)4, /* Size */
|
1992-11-12 01:15:06 +00:00
|
|
|
|
&Count, /* CountDone */
|
|
|
|
|
(UDIBool)1); /* Direction */
|
|
|
|
|
if (err)
|
1992-11-18 22:51:58 +00:00
|
|
|
|
{
|
|
|
|
|
char message[100];
|
|
|
|
|
int xerr;
|
|
|
|
|
|
|
|
|
|
xerr = UDIGetErrorMsg(err, 100, message, &Count);
|
|
|
|
|
if (!xerr)
|
|
|
|
|
fprintf (stderr, "Error is %s\n", message);
|
|
|
|
|
else
|
|
|
|
|
fprintf (stderr, "xerr is %d\n", xerr);
|
|
|
|
|
error ("UDICopy failed, error = %d", err);
|
|
|
|
|
}
|
1992-11-12 01:15:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
entry.Space = UDI29KIRAMSpace;
|
|
|
|
|
entry.Offset = bfd_get_start_address (pbfd);
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
immediate_quit--;
|
1992-11-12 01:15:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* User interface to download an image into the remote target. See download()
|
|
|
|
|
* for details on args.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
udi_load(args, from_tty)
|
|
|
|
|
char *args;
|
|
|
|
|
int from_tty;
|
|
|
|
|
{
|
|
|
|
|
download (args, from_tty);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
symbol_file_add (strtok (args, " \t"), from_tty, 0, 0, 0, 0);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*************************************************** UDI_WRITE_INFERIOR_MEMORY
|
|
|
|
|
** Copy LEN bytes of data from debugger memory at MYADDR
|
|
|
|
|
to inferior's memory at MEMADDR. Returns number of bytes written. */
|
|
|
|
|
static int
|
|
|
|
|
udi_write_inferior_memory (memaddr, myaddr, len)
|
|
|
|
|
CORE_ADDR memaddr;
|
|
|
|
|
char *myaddr;
|
|
|
|
|
int len;
|
|
|
|
|
{
|
|
|
|
|
int nwritten = 0;
|
|
|
|
|
UDIUInt32 *From;
|
|
|
|
|
UDIResource To;
|
|
|
|
|
UDICount Count;
|
|
|
|
|
UDISizeT Size = 1;
|
|
|
|
|
UDICount CountDone = 0;
|
|
|
|
|
UDIBool HostEndian = 0;
|
|
|
|
|
|
1992-11-12 01:15:06 +00:00
|
|
|
|
To.Space = udi_memory_space(memaddr);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
From = (UDIUInt32*)myaddr;
|
|
|
|
|
|
|
|
|
|
while (nwritten < len)
|
|
|
|
|
{ Count = len - nwritten;
|
|
|
|
|
if (Count > MAXDATA) Count = MAXDATA;
|
|
|
|
|
To.Offset = memaddr + nwritten;
|
|
|
|
|
if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
{ error("UDIWrite() failed in udi_write_inferrior_memory");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ nwritten += CountDone;
|
|
|
|
|
From += CountDone;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return(nwritten);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**************************************************** UDI_READ_INFERIOR_MEMORY
|
|
|
|
|
** Read LEN bytes from inferior memory at MEMADDR. Put the result
|
|
|
|
|
at debugger address MYADDR. Returns number of bytes read. */
|
|
|
|
|
static int
|
|
|
|
|
udi_read_inferior_memory(memaddr, myaddr, len)
|
|
|
|
|
CORE_ADDR memaddr;
|
|
|
|
|
char *myaddr;
|
|
|
|
|
int len;
|
|
|
|
|
{
|
|
|
|
|
int nread = 0;
|
|
|
|
|
UDIResource From;
|
|
|
|
|
UDIUInt32 *To;
|
|
|
|
|
UDICount Count;
|
|
|
|
|
UDISizeT Size = 1;
|
|
|
|
|
UDICount CountDone = 0;
|
|
|
|
|
UDIBool HostEndian = 0;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
UDIError err;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
|
|
|
|
From.Space = udi_memory_space(memaddr);
|
|
|
|
|
To = (UDIUInt32*)myaddr;
|
|
|
|
|
|
|
|
|
|
while (nread < len)
|
|
|
|
|
{ Count = len - nread;
|
|
|
|
|
if (Count > MAXDATA) Count = MAXDATA;
|
|
|
|
|
From.Offset = memaddr + nread;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if(err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
|
|
|
|
|
{ error("UDIRead() failed in udi_read_inferrior_memory");
|
1992-04-24 05:48:30 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{ nread += CountDone;
|
|
|
|
|
To += CountDone;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return(nread);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/********************************************************************* WARNING
|
|
|
|
|
*/
|
|
|
|
|
udi_warning(num)
|
|
|
|
|
int num;
|
|
|
|
|
{
|
|
|
|
|
error ("ERROR while loading program into remote TIP: $d\n", num);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* Fetch a single register indicatated by 'regno'.
|
|
|
|
|
* Returns 0/-1 on success/failure.
|
|
|
|
|
*/
|
1992-10-05 23:19:59 +00:00
|
|
|
|
static void
|
1992-04-24 05:48:30 +00:00
|
|
|
|
fetch_register (regno)
|
|
|
|
|
int regno;
|
|
|
|
|
{
|
|
|
|
|
UDIResource From;
|
|
|
|
|
UDIUInt32 To;
|
|
|
|
|
UDICount Count = 1;
|
|
|
|
|
UDISizeT Size = 4;
|
|
|
|
|
UDICount CountDone;
|
|
|
|
|
UDIBool HostEndian = 0;
|
1992-11-18 22:51:58 +00:00
|
|
|
|
UDIError err;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
if (regno == GR1_REGNUM)
|
1992-05-07 17:47:36 +00:00
|
|
|
|
{
|
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
|
|
|
|
From.Offset = 1;
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
|
1992-05-07 17:47:36 +00:00
|
|
|
|
{
|
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
|
|
|
|
From.Offset = (regno - GR96_REGNUM) + 96;;
|
|
|
|
|
}
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#if defined(GR64_REGNUM)
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 )
|
1992-05-07 17:47:36 +00:00
|
|
|
|
{
|
|
|
|
|
From.Space = UDI29KGlobalRegs;
|
|
|
|
|
From.Offset = (regno - GR64_REGNUM) + 64;
|
|
|
|
|
}
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#endif /* GR64_REGNUM */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
|
1992-05-07 17:47:36 +00:00
|
|
|
|
{
|
|
|
|
|
From.Space = UDI29KLocalRegs;
|
|
|
|
|
From.Offset = (regno - LR0_REGNUM);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM)
|
1992-05-07 17:47:36 +00:00
|
|
|
|
{
|
|
|
|
|
int val = -1;
|
|
|
|
|
supply_register(160 + (regno - FPE_REGNUM),(char *) &val);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
return; /* Pretend Success */
|
1992-05-07 17:47:36 +00:00
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else
|
1992-05-07 17:47:36 +00:00
|
|
|
|
{
|
|
|
|
|
From.Space = UDI29KSpecialRegs;
|
|
|
|
|
From.Offset = regnum_to_srnum(regno);
|
|
|
|
|
}
|
|
|
|
|
|
1992-11-18 22:51:58 +00:00
|
|
|
|
if (err = UDIRead(From, &To, Count, Size, &CountDone, HostEndian))
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIRead() failed in udi_fetch_registers");
|
1992-05-07 17:47:36 +00:00
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
supply_register(regno, (char *) &To);
|
1992-10-05 23:19:59 +00:00
|
|
|
|
|
1993-10-21 00:49:42 +00:00
|
|
|
|
if (remote_debug)
|
1992-10-05 23:19:59 +00:00
|
|
|
|
printf("Fetching register %s = 0x%x\n", reg_names[regno], To);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
/* Store a single register indicated by 'regno'.
|
|
|
|
|
* Returns 0/-1 on success/failure.
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
store_register (regno)
|
|
|
|
|
int regno;
|
|
|
|
|
{
|
|
|
|
|
int result;
|
|
|
|
|
UDIUInt32 From;
|
|
|
|
|
UDIResource To;
|
|
|
|
|
UDICount Count = 1;
|
|
|
|
|
UDISizeT Size = 4;
|
|
|
|
|
UDICount CountDone;
|
|
|
|
|
UDIBool HostEndian = 0;
|
|
|
|
|
|
|
|
|
|
From = read_register (regno); /* get data value */
|
|
|
|
|
|
1993-10-21 00:49:42 +00:00
|
|
|
|
if (remote_debug)
|
1992-10-05 23:19:59 +00:00
|
|
|
|
printf("Storing register %s = 0x%x\n", reg_names[regno], From);
|
|
|
|
|
|
1992-04-24 05:48:30 +00:00
|
|
|
|
if (regno == GR1_REGNUM)
|
1993-10-21 10:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KGlobalRegs;
|
|
|
|
|
To.Offset = 1;
|
|
|
|
|
result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
|
|
|
|
|
/* Setting GR1 changes the numbers of all the locals, so invalidate the
|
|
|
|
|
* register cache. Do this *after* calling read_register, because we want
|
|
|
|
|
* read_register to return the value that write_register has just stuffed
|
|
|
|
|
* into the registers array, not the value of the register fetched from
|
|
|
|
|
* the inferior.
|
|
|
|
|
*/
|
|
|
|
|
registers_changed ();
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#if defined(GR64_REGNUM)
|
|
|
|
|
else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 )
|
1993-10-21 10:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KGlobalRegs;
|
|
|
|
|
To.Offset = (regno - GR64_REGNUM) + 64;
|
|
|
|
|
result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
#endif /* GR64_REGNUM */
|
|
|
|
|
else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
|
1993-10-21 10:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KGlobalRegs;
|
|
|
|
|
To.Offset = (regno - GR96_REGNUM) + 96;
|
|
|
|
|
result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
|
1993-10-21 10:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KLocalRegs;
|
|
|
|
|
To.Offset = (regno - LR0_REGNUM);
|
|
|
|
|
result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
|
|
|
|
|
}
|
|
|
|
|
else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
|
1992-04-24 05:48:30 +00:00
|
|
|
|
return 0; /* Pretend Success */
|
1993-10-21 10:10:21 +00:00
|
|
|
|
else if (regno == PC_REGNUM)
|
|
|
|
|
{
|
|
|
|
|
/* PC1 via UDI29KPC */
|
|
|
|
|
|
|
|
|
|
To.Space = UDI29KPC;
|
|
|
|
|
To.Offset = 0; /* PC1 */
|
|
|
|
|
result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
|
1993-10-25 22:24:02 +00:00
|
|
|
|
|
|
|
|
|
/* Writing to this loc actually changes the values of pc0 & pc1 */
|
|
|
|
|
|
|
|
|
|
register_valid[PC_REGNUM] = 0; /* pc1 */
|
|
|
|
|
register_valid[NPC_REGNUM] = 0; /* pc0 */
|
1993-10-21 10:10:21 +00:00
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
else /* An unprotected or protected special register */
|
1993-10-21 10:10:21 +00:00
|
|
|
|
{
|
|
|
|
|
To.Space = UDI29KSpecialRegs;
|
|
|
|
|
To.Offset = regnum_to_srnum(regno);
|
|
|
|
|
result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
|
|
|
|
|
}
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1993-10-21 10:10:21 +00:00
|
|
|
|
if (result != 0)
|
1992-04-24 05:48:30 +00:00
|
|
|
|
error("UDIWrite() failed in store_registers");
|
1993-10-21 10:10:21 +00:00
|
|
|
|
|
|
|
|
|
return 0;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
}
|
|
|
|
|
/********************************************************** REGNUM_TO_SRNUM */
|
|
|
|
|
/*
|
|
|
|
|
* Convert a gdb special register number to a 29000 special register number.
|
|
|
|
|
*/
|
|
|
|
|
static int
|
|
|
|
|
regnum_to_srnum(regno)
|
|
|
|
|
int regno;
|
|
|
|
|
{
|
|
|
|
|
switch(regno) {
|
|
|
|
|
case VAB_REGNUM: return(0);
|
|
|
|
|
case OPS_REGNUM: return(1);
|
|
|
|
|
case CPS_REGNUM: return(2);
|
|
|
|
|
case CFG_REGNUM: return(3);
|
|
|
|
|
case CHA_REGNUM: return(4);
|
|
|
|
|
case CHD_REGNUM: return(5);
|
|
|
|
|
case CHC_REGNUM: return(6);
|
|
|
|
|
case RBP_REGNUM: return(7);
|
|
|
|
|
case TMC_REGNUM: return(8);
|
|
|
|
|
case TMR_REGNUM: return(9);
|
|
|
|
|
case NPC_REGNUM: return(USE_SHADOW_PC ? (20) : (10));
|
|
|
|
|
case PC_REGNUM: return(USE_SHADOW_PC ? (21) : (11));
|
|
|
|
|
case PC2_REGNUM: return(USE_SHADOW_PC ? (22) : (12));
|
|
|
|
|
case MMU_REGNUM: return(13);
|
|
|
|
|
case LRU_REGNUM: return(14);
|
|
|
|
|
case IPC_REGNUM: return(128);
|
|
|
|
|
case IPA_REGNUM: return(129);
|
|
|
|
|
case IPB_REGNUM: return(130);
|
|
|
|
|
case Q_REGNUM: return(131);
|
|
|
|
|
case ALU_REGNUM: return(132);
|
|
|
|
|
case BP_REGNUM: return(133);
|
|
|
|
|
case FC_REGNUM: return(134);
|
|
|
|
|
case CR_REGNUM: return(135);
|
|
|
|
|
case FPE_REGNUM: return(160);
|
1992-05-07 17:47:36 +00:00
|
|
|
|
case INTE_REGNUM: return(161);
|
1992-04-24 05:48:30 +00:00
|
|
|
|
case FPS_REGNUM: return(162);
|
|
|
|
|
case EXO_REGNUM:return(164);
|
|
|
|
|
default:
|
|
|
|
|
return(255); /* Failure ? */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/****************************************************************************/
|
|
|
|
|
/*
|
|
|
|
|
* Determine the Target memory space qualifier based on the addr.
|
|
|
|
|
* FIXME: Can't distinguis I_ROM/D_ROM.
|
|
|
|
|
* FIXME: Doesn't know anything about I_CACHE/D_CACHE.
|
|
|
|
|
*/
|
|
|
|
|
static CPUSpace
|
|
|
|
|
udi_memory_space(addr)
|
1992-11-12 01:15:06 +00:00
|
|
|
|
CORE_ADDR addr;
|
1992-04-24 05:48:30 +00:00
|
|
|
|
{
|
|
|
|
|
UDIUInt32 tstart = IMemStart;
|
|
|
|
|
UDIUInt32 tend = tstart + IMemSize;
|
|
|
|
|
UDIUInt32 dstart = DMemStart;
|
|
|
|
|
UDIUInt32 dend = tstart + DMemSize;
|
|
|
|
|
UDIUInt32 rstart = RMemStart;
|
|
|
|
|
UDIUInt32 rend = tstart + RMemSize;
|
|
|
|
|
|
|
|
|
|
if (((UDIUInt32)addr >= tstart) && ((UDIUInt32)addr < tend)) {
|
|
|
|
|
return UDI29KIRAMSpace;
|
|
|
|
|
} else if (((UDIUInt32)addr >= dstart) && ((UDIUInt32)addr < dend)) {
|
|
|
|
|
return UDI29KDRAMSpace;
|
|
|
|
|
} else if (((UDIUInt32)addr >= rstart) && ((UDIUInt32)addr < rend)) {
|
|
|
|
|
/* FIXME: how do we determine between D_ROM and I_ROM */
|
|
|
|
|
return UDI29KIROMSpace;
|
|
|
|
|
} else /* FIXME: what do me do now? */
|
|
|
|
|
return UDI29KDRAMSpace; /* Hmmm! */
|
|
|
|
|
}
|
|
|
|
|
/*********************************************************************** STUBS
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void convert16() {;}
|
|
|
|
|
void convert32() {;}
|
|
|
|
|
FILE* EchoFile = 0; /* used for debugging */
|
|
|
|
|
int QuietMode = 0; /* used for debugging */
|
1993-08-09 21:12:01 +00:00
|
|
|
|
|
1993-10-25 22:24:02 +00:00
|
|
|
|
#ifdef NO_HIF_SUPPORT
|
|
|
|
|
service_HIF(msg)
|
|
|
|
|
union msg_t *msg;
|
|
|
|
|
{
|
|
|
|
|
return(0); /* Emulate a failure */
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
1993-08-09 21:12:01 +00:00
|
|
|
|
/* Target_ops vector. Not static because there does not seem to be
|
|
|
|
|
any portable way to do a forward declaration of a static variable.
|
|
|
|
|
The RS/6000 doesn't like "extern" followed by "static"; SunOS
|
|
|
|
|
/bin/cc doesn't like "static" twice. */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
|
1993-08-09 21:12:01 +00:00
|
|
|
|
struct target_ops udi_ops = {
|
1992-10-05 23:19:59 +00:00
|
|
|
|
"udi",
|
|
|
|
|
"Remote UDI connected TIP",
|
1993-06-25 19:11:22 +00:00
|
|
|
|
"Remote debug an AMD 29k using UDI socket connection to TIP process.\n\
|
|
|
|
|
Arguments are\n\
|
|
|
|
|
`configuration-id AF_INET hostname port-number'\n\
|
|
|
|
|
To connect via the network, where hostname and port-number specify the\n\
|
|
|
|
|
host and port where you can connect via UDI.\n\
|
|
|
|
|
configuration-id is unused.\n\
|
|
|
|
|
\n\
|
|
|
|
|
`configuration-id AF_UNIX socket-name tip-program'\n\
|
1993-06-29 16:02:41 +00:00
|
|
|
|
To connect using a local connection to the \"tip.exe\" program which is\n\
|
1993-06-25 19:11:22 +00:00
|
|
|
|
supplied by AMD. If socket-name specifies an AF_UNIX socket then the\n\
|
|
|
|
|
tip program must already be started; connect to it using that socket.\n\
|
|
|
|
|
If not, start up tip-program, which should be the name of the tip\n\
|
|
|
|
|
program. If appropriate, the PATH environment variable is searched.\n\
|
|
|
|
|
configuration-id is unused.\n\
|
|
|
|
|
\n\
|
|
|
|
|
`configuration-id'\n\
|
|
|
|
|
Look up the configuration in ./udi_soc or /etc/udi_soc, which\n\
|
|
|
|
|
are files containing lines in the above formats. configuration-id is\n\
|
|
|
|
|
used to pick which line of the file to use.",
|
1992-10-05 23:19:59 +00:00
|
|
|
|
udi_open,
|
|
|
|
|
udi_close,
|
|
|
|
|
udi_attach,
|
|
|
|
|
udi_detach,
|
|
|
|
|
udi_resume,
|
|
|
|
|
udi_wait,
|
|
|
|
|
udi_fetch_registers,
|
|
|
|
|
udi_store_registers,
|
1992-09-18 09:56:28 +00:00
|
|
|
|
udi_prepare_to_store,
|
1992-04-24 05:48:30 +00:00
|
|
|
|
udi_xfer_inferior_memory,
|
|
|
|
|
udi_files_info,
|
1992-10-05 23:19:59 +00:00
|
|
|
|
udi_insert_breakpoint,
|
|
|
|
|
udi_remove_breakpoint,
|
|
|
|
|
0, /* termial_init */
|
|
|
|
|
0, /* terminal_inferior */
|
|
|
|
|
0, /* terminal_ours_for_output */
|
|
|
|
|
0, /* terminal_ours */
|
|
|
|
|
0, /* terminal_info */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
udi_kill, /* FIXME, kill */
|
|
|
|
|
udi_load,
|
|
|
|
|
0, /* lookup_symbol */
|
1992-10-05 23:19:59 +00:00
|
|
|
|
udi_create_inferior,
|
|
|
|
|
udi_mourn, /* mourn_inferior FIXME */
|
1992-09-22 07:23:35 +00:00
|
|
|
|
0, /* can_run */
|
NOTICE_SIGNAL_HANDLING_CHANGE macro added to the target vector as
to_notice_signals.
* inferior.h (proc_signal_handling_change): prototype removed.
* infrun.c (NOTICE_SIGNAL_HANDLING_CHANGE): default removed.
(handle_command): now calls target_notice_signals.
* procfs.c (proc_signal_handling_change): renamed to
procfs_notice_signals. Now static. Add prototype. All callers
changed.
* target.h (struct target_ops): new field, to_notice_signals.
(target_notice_signals): new macro to cover new field.
* target.c (cleanup_target): default to_notice_signals to ignore.
* corelow.c (core_ops),
exec.c (exec_ops),
inftarg.c (child_ops),
procfs.c (procfs_ops),
remote-adapt.c (adapt-ops),
remote-eb.c (eb_ops),
remote-es1800.c (es1800_ops, es1800_child_ops),
remote-hms.c (hms_ops),
remote-mm.c (mm_ops),
remote-nindy.c (nindy_ops),
remote-st2000.c (st2000_ops),
remote-udi.c (udi_ops),
remote-vx.c (vx_ops, vx_run_ops),
remote.c (remote_ops),
target.c (dummy_target),
xcoffexec.c (exec_ops): added static initializer for
to_notice_signals.
* xm-irix4.h, xm-sysv4.h (NOTICE_SIGNAL_HANDLING_CHANGE): removed.
1992-10-06 22:54:57 +00:00
|
|
|
|
0, /* notice_signals */
|
1992-10-05 23:19:59 +00:00
|
|
|
|
process_stratum,
|
|
|
|
|
0, /* next */
|
|
|
|
|
1, /* has_all_memory */
|
|
|
|
|
1, /* has_memory */
|
|
|
|
|
1, /* has_stack */
|
|
|
|
|
1, /* has_registers */
|
|
|
|
|
1, /* has_execution */
|
|
|
|
|
0, /* sections */
|
|
|
|
|
0, /* sections_end */
|
1992-04-24 05:48:30 +00:00
|
|
|
|
OPS_MAGIC, /* Always the last thing */
|
|
|
|
|
};
|
|
|
|
|
|
* Makefile.in (init.c): Generate using the source, not munch. This
cleans up all kinds of hassles (which nm to use in munch, etc). The
new formatting conventions (mostly already followed) are that
the name of the _initialize_* routines must start in column zero,
and must not be inside #if.
* munch: Removed.
* Makefile.in: Remove references to munch.
* serial.c, remote.c, infptrace.c, maint.c, convex-tdep.c,
alpha-tdep.c, hp300ux-nat.c, hppab-nat.c, osfsolib.c, remote-es.c,
procfs.c, remote-udi.c, ser-go32.c, ultra3-xdep.c, sh-tdep.c,
i960-tdep.c, hppa-tdep.c, h8500-tdep.c, dpx2-nat.c, delta68-nat.c,
z8k-tdep.c: Make sure the above conventions are followed. Make
sure they are all declared as returning void. Clean up
miscellaneous comments and such.
1993-10-22 05:55:58 +00:00
|
|
|
|
void
|
|
|
|
|
_initialize_remote_udi ()
|
1992-04-24 05:48:30 +00:00
|
|
|
|
{
|
|
|
|
|
add_target (&udi_ops);
|
|
|
|
|
}
|