+1999-11-01 Michael Snyder <msnyder@cygnus.com>
+ Tom Tromey <tromey@cygnus.com>
+
+ * tracepoint.h (get_tracepoint_by_number): Updated declaration.
+ * tracepoint.c (get_tracepoint_by_number): Added `multi_p'
+ argument. Now uses get_number_or_range and get_number.
+ (trace_pass_command): Allow a tracepoint range.
+ * breakpoint.h (get_number, get_number_or_range): Declare.
+ * breakpoint.c (get_number_trailer): New function.
+ (get_number): Rewrote to use get_number_trailer.
+ (get_number_or_range): New function.
+ (condition_command): Check `get_number' return value.
+ (commands_command): Likewise.
+ (ignore_command): Likewise.
+ (map_breakpoint_numbers): Use get_number_or_range.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ * remote-rdi.c (_initialize_remote_rdi): Make log commands
+ subcommands of maintenance. Remove improper identation from
+ command documentation.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * rdi-share/etherdrv.c (fetch_ports): Print out additional TCP/IP
+ port information in ethernet driver if the DEBUG flag is set.
+ * rdi-share/hostchan.c (Adp_addToQueue): Changed #if statement in
+ hostchan.c to avoid compiler complaint when DEBUG macro was
+ undefined.
+ * rdi-share/unixcomm.c (Unix_ReadSerial): Print system error code
+ if read() system call fails.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ * rdi-share/bytesex.h: Deleted. Conflicts with a system header file
+ on some systems like Linux Red Hat 5.2.
+ * rdi-share/angel_bytesex.h: New file. Replaces the above.
+ * rdi-share/bytesex.c: Deleted. Name changed to match the header
+ mentioned above (this is the implementation file).
+ * rdi-share/angel_bytesex.c: New file. Replaces the above.
+ * rdi-share/Makefile.am: Reflect above changes.
+ * rdi-share/Makefile.in: Reflect above changes.
+
+1999-11-01 Jimmy Guo <guo@cup.hp.com>
+
+ * annotate.c (breakpoints_changed, annotate_ignore_count_change,
+ annotate_stopped): Provide annotation for breakpoint ignore_count
+ changes but only provide once at annotate_stopped time for
+ sucessive ignore_count triggered breakpoint changes, to make GUIs
+ happy yet lazy.
+ * annotate.h (annotate_ignore_count_change): Declare.
+ * breakpoint.c (bpstat_stop_status): Call
+ annotate_ignore_count_change when ignore_count changes.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * rdi-share/ardi.c (HandleStoppedMessage): Changed code that
+ handles the "stop" message so that unrecognized errors are
+ returned as "Error" rather than "NoError". The old code resulted
+ in some error conditions not being reported to the user.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * remote-rdi.c (arm_rdi_open): Added a call to Adp_CloseDevice()
+ before attempting to open a connection. This allows the user to
+ issue the "target rdi" command multiple times (in case the user
+ needs to change options or re-initialize the link).
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * rdi-share/endian.h: Deleted. Name clash with
+ /usr/include/endian.h. This was causing the wrong byte order to
+ be used by htons() in the RDI Ethernet driver.
+ * rdi-share/angel_endian.h: New file. Replaces the above.
+ * rdi-share/ardi.c: Replace include to reflect the above change.
+ * rdi-share/etherdrv.c: Ditto.
+ * rdi-share/hsys.c: Ditto.
+ * rdi-share/msgbuild.c: Ditto.
+ * rdi-share/params.c: Ditto.
+ * rdi-share/rx.c: Ditto.
+ * rdi-share/tx.c: Ditto.
+ * rdi-share/Makefile.am: Reflect above changes.
+ * rdi-share/Makefile.in: Reflect above changes.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * remote-rdi.c (_initialize_remote_rdi): Added command
+ rdilogenable. Allows the user to log ADP packets that are
+ exchanged between gdb and the target. Both the raw packets are
+ shown and some minimal decoding is attempted. Default state is
+ disabled.
+ (_initialize_remote_rdi): Added command rdilogfile. Allows the
+ user to specify the filename to which the ADP packet log is to be
+ written. Default state is "rdi.log".
+ (rdilogenable_command): New function. Related to rdilogenable.
+ (rdilogfile_command): New function. Related to rdilogfile.
+ * rdi-share/devsw.c (openLogFile, closeLogFile,
+ DevSW_SetLogEnable, DevSW_SetLogfile, dumpPacket): New
+ functions. Implement logging.
+ (DevSW_Read): Log if requested.
+ (DevSW_Write): Log if requested.
+ * rdi-share/devsw.h: Add prototypes for DevSW_SetLogfile and
+ DevSW_SetLogEnable.
+ * rdi-share/hostchan.c (Adp_SetLogEnable, Adp_SetLogfile): New
+ functions. Related to rdilogenable and rdilogfile.
+ * rdi-share/hostchan.h: Add prototypes for the above functions.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * remote-rdi.c (arm_rdi_open): Added code to split the arguments
+ to the 'target rdi' command at the first space. The first word is
+ passed to Adp_OpenDevice as the device name, the tail is passed as
+ the "arguments" parameter. This allows user specified baud rates
+ -- among other things that still need to be documented [e.g. (gdb)
+ target rdi /dev/ttyS1 19200]. NB: With very limited testing, the
+ ARM Embedded-ICE seems to run at 19.2K (though it is reported to
+ be unreliable above 9600), and the EPI Jeeni seems to run at
+ 38.4K.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * remote-rdi.c (_initialize_remote_rdi): Added the boolean
+ set/show variable rdiromatzero. Should be set to true if the
+ target has ROM at address 0. If true, then gdb will not tell the
+ target to trap fetches to interrupt vectors (which are located at
+ address 0). Using the Angel monitor, attempting to set
+ breakpoints in ROM is an error. Using JTAG debugging of the
+ ARM7TDMI, attempting to set more than two breakpoints in ROM is an
+ error. Default state is false (vectors will be trapped) -- used to
+ be hardwired false.
+
+1999-11-01 Fernando Nasser <fnasser@totem.to.cygnus.com>
+
+ From Grant Edwards <grante@visi.com>:
+ * remote-rdi.c (_initialize_remote_rdi): Added the boolean
+ set/show variable rdiheartbeat. This enables or disables ADP
+ link-check "heartbeat" packets sent by the host to the target.
+ Heartbeat packets can cause both the ARM Embedded-ICE and the EPI
+ Jeeni to malfunction: If a heartbeat packet is received by the
+ target while it is sending a packet, that packet will be aborted,
+ and the ADP protocol engine then gets very confused. Default state
+ is off -- used to hardwired on.
+
+1999-10-29 Kevin Buettner <kevinb@cygnus.com>
+
+ * i386-linux-nat.c (dummy_sse_values): Also define for systems
+ without PTRACE_GETXFPREGS.
+
+1999-10-29 Jim Blandy <jimb@zwingli.cygnus.com>
+
+ Hardware watchpoint fix from Eli Zaretskii <eliz@gnu.org>:
+
+ * breakpoint.c (insert_breakpoints): Fetch the value of the
+ expression we need to watch. If it's a lazy memory lvalue, then
+ we need to fetch it now, before we start the inferior again.
+ (insert_breakpoints, remove_breakpoint, bpstat_stop_status,
+ can_use_hardware_watchpoint): Only those values representing
+ memory we actually fetched need to be watched.
+
+1999-10-29 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
+
+ * breakpoint.h (bpstat_print): Return 'enum print_stop_action',
+ not 'int'.
+
+1999-10-29 Jim Blandy <jimb@zwingli.cygnus.com>
+
+ * acconfig.h: Fix entries for HAVE_STRUCT_SAVE_STATE_T,
+ HAVE_STRUCT_MEMBER_SS_WIDE, and HAVE_PTRACE_GETXFPREGS.
+ * config.h.in: Regenerated.
+
+1999-10-28 Jim Blandy <jimb@zwingli.cygnus.com>
+
+ Fixes for warnings from Andreas Jaeger <aj@suse.de>.
+ * linux-thread.c (linuxthreads_sig_restart,
+ linuxthreads_sig_cancel, linuxthreads_sig_debug): Add missing
+ initializers to avoid gcc warnings.
+ (resume_thread): Add braces as recommended by gcc -Wparentheses.
+ (stop_thread): Likewise.
+ (linuxthreads_wait): Likewise.
+ (linuxthreads_find_trap): Likewise.
+
+1999-10-28 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
+
+ * infcmd.c: Fix typo.
+
+1999-10-28 Jim Blandy <jimb@zenia.red-bean.com>
+
+ * gdbtypes.c (init_simd_type): The upper bound to
+ create_range_type is inclusive, not exclusive.
+
+ * configure.in: Check for PTRACE_GETXFPREGS, and #define
+ HAVE_PTRACE_GETXFPREGS if we have it.
+ * acconfig.h: Add entry for HAVE_PTRACE_GETXFPREGS.
+ * configure, config.in: Regenerated.
+ * config/i386/tm-linux.h (HAVE_SSE_REGS): #define, iff the
+ configure script #defined HAVE_PTRACE_GETXFPREGS.
+ (REGISTER_VIRTUAL_TYPE): Provide the proper types for the pointer
+ registers and the SSE registers.
+ * i386-linux-nat.c (GETREGS_SUPPLIES, GETFPREGS_SUPPLIES,
+ GETXFPREGS_SUPPLIES): New macros.
+ (have_ptrace_getxfpregs): New variable.
+ (FPREGSET_T_FPREG_ADDR): Renamed from FPREGSET_T_FPREG_OFFSET.
+ (supply_fpregset, convert_to_fpregset): Callers changed.
+ (supply_xfpregset, convert_to_xfpregset, fetch_xfpregs,
+ store_xfpregs, dummy_sse_values): New functions.
+ (fetch_inferior_registers, store_inferior_registers): Use the
+ *_SUPPLIES macros to decide how to fetch a given register. Use
+ {fetch,store}_xfpregs and dummy_sse_values to provide access to
+ the SSE registers, on systems where they are present.
+
+1999-10-28 Kevin Buettner <kevinb@cygnus.com>
+
+ * gdbserver/gdbreplay.c (config.h, errno.h): Include.
+ (perror_with_name): Don't declare sys_nerr, sys_errlist, or errno
+ when STDC_HEADERS is defined.
+ * gdbserver/utils.c (STDC_HEADERS): Likewise.
+
+ * gdbserver/low-hppabsd.c, gdbserver/low-linux.c,
+ gdbserver/low-lynx.c, gdbserver/low-sim.c, gdbserver/low-sparc.c,
+ gdbserver/low-sun3.c (my_registers): Declare.
+ (registers): Changed from array type to pointer type in order
+ to match declaration in inferior.h in main gdb sources.
+ * gdbserver/server.h (registers): Likewise.
+ * gdbserver/remote-utils.c (outreg): Removed declaration of
+ registers[].
+
+ * gdbserver/low-linux.c (fetch_register): Changed PTRACE_PEEKUSR to
+ PTRACE_PEEKUSER. [Note the missing 'E'.]
+ (store_inferior_registers): Likewise for PTRACE_POKEUSER.
+
+ * gdbserver/low-linux.c (sys/ptrace.h): Move include to
+ avoid conflict with #defines coming from <sys/user.h>.
+ (sys/reg.h): Only include when HAVE_SYS_REG_H is defined.
+ (PTRACE_XFER_TYPE): Provide a default type in case
+ the target doesn't define it.
+ (fetch_register, read_inferior_memory, write_inferior_memory):
+ Use PTRACE_XFER_TYPE instead of int for ptrace() transfers.
+ (I386_GNULINUX_TARGET): Use #ifdef with this symbol instead
+ of assuming it's an x86 target when it's not a m68k target.
+ (i386_register_raw_size, i386_register_byte): Define these arrays
+ to match other changes that've been occuring to the x86 target
+ in the main gdb sources.
+ (initialize_arch): New (static) function for doing target arch
+ specific initializations.
+
+ * gdbserver/server.h (MAXBUFBYTES, PBUFSIZ): New defines
+ [actually stolen from remote.c].
+ * gdbserver/remote-utils.c (putpkt): Use PBUFSIZ to make
+ sure that buffer is big enough.
+ * gdbserver/server.c (main): Ditto.
+
+ * gdbserver/remote-utils.c (outreg): Allow register numbers
+ bigger than 255.
+ (prepare_resume_reply): Provide alternate mechanism,
+ GDBSERVER_RESUME_REGS, for defining list of registers to send
+ to gdb.
+ * gdbserver/Makefile.in (INTERNAL_CFLAGS): Swapped order of
+ INCLUDE_CFLAGS and BFD_CFLAGS to ensure that gdb's config.h
+ gets found before bfd's config.h. Also added -DGDBSERVER
+ switch.
+ (INCLUDE_CFLAGS): Added -I.. .
+
+1999-10-27 Nick Clifton <nickc@cygnus.com>
+
+ * arm-tdep.c (THUMB_BE_BREAKPOINT): Change to 0xbebe.
+ (THUMB_LE_BREAKPOINT): Change to 0xbebe.
+
Mon Oct 25 18:22:06 1999 Andrew Cagney <cagney@b1.cygnus.com>
* remote.c: Document future of compare_sections_command.
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
-VERSION = 19991025
+VERSION = 19991101
DIST=gdb
LINT=/usr/5bin/lint
#undef WITH_SIM
/* Set to true if the save_state_t structure is present */
-#define HAVE_STRUCT_SAVE_STATE_T 0
+#undef HAVE_STRUCT_SAVE_STATE_T
/* Set to true if the save_state_t structure has the ss_wide member */
-#define HAVE_STRUCT_MEMBER_SS_WIDE 0
+#undef HAVE_STRUCT_MEMBER_SS_WIDE
+
+/* Define if <sys/ptrace.h> defines the PTRACE_GETXFPREGS request. */
+#undef HAVE_PTRACE_GETXFPREGS
void (*annotate_signal_hook) PARAMS ((void));
void (*annotate_exited_hook) PARAMS ((void));
+static int ignore_count_changed = 0;
+
static void
print_value_flags (t)
struct type *t;
{
target_terminal_ours ();
printf_unfiltered ("\n\032\032breakpoints-invalid\n");
+ if (ignore_count_changed)
+ ignore_count_changed = 0; /* Avoid multiple break annotations. */
}
}
+/* The GUI needs to be informed of ignore_count changes, but we don't
+ want to provide successive multiple breakpoints-invalid messages
+ that are all caused by the fact that the ignore count is changing
+ (which could keep the GUI very busy). One is enough, after the
+ target actually "stops". */
+
+void
+annotate_ignore_count_change (void)
+{
+ if (annotation_level > 1)
+ ignore_count_changed = 1;
+}
+
void
annotate_breakpoint (num)
int num;
if (annotation_level > 1)
printf_filtered ("\n\032\032stopped\n");
}
+ if (annotation_level > 1 && ignore_count_changed)
+ {
+ ignore_count_changed = 0;
+ breakpoints_changed ();
+ }
}
void
extern void breakpoints_changed PARAMS ((void));
+extern void annotate_ignore_count_change (void);
extern void annotate_breakpoint PARAMS ((int));
extern void annotate_catchpoint PARAMS ((int));
extern void annotate_watchpoint PARAMS ((int));
/* Sequence of bytes for breakpoint instruction. */
#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7} /* Recognized illegal opcodes */
#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
-#define THUMB_LE_BREAKPOINT {0xfe,0xdf}
-#define THUMB_BE_BREAKPOINT {0xdf,0xfe}
+#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
+#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
/* The following has been superseded by BREAKPOINT_FOR_PC, but
is defined merely to keep mem-break.c happy. */
condition_command PARAMS ((char *, int));
static int
-get_number PARAMS ((char **));
+get_number_trailer PARAMS ((char **, int));
void
set_breakpoint_count PARAMS ((int));
ALL_BREAKPOINTS_SAFE does so even if the statment deletes the current
breakpoint. */
-#define ALL_BREAKPOINTS(b) for (b = breakpoint_chain; b; b = b->next)
+#define ALL_BREAKPOINTS(B) for (B = breakpoint_chain; B; B = B->next)
-#define ALL_BREAKPOINTS_SAFE(b,tmp) \
- for (b = breakpoint_chain; \
- b? (tmp=b->next, 1): 0; \
- b = tmp)
+#define ALL_BREAKPOINTS_SAFE(B,TMP) \
+ for (B = breakpoint_chain; \
+ B ? (TMP=B->next, 1): 0; \
+ B = TMP)
/* True if SHIFT_INST_REGS defined, false otherwise. */
Currently the string can either be a number or "$" followed by the name
of a convenience variable. Making it an expression wouldn't work well
- for map_breakpoint_numbers (e.g. "4 + 5 + 6"). */
+ for map_breakpoint_numbers (e.g. "4 + 5 + 6").
+
+ TRAILER is a character which can be found after the number; most
+ commonly this is `-'. If you don't want a trailer, use \0. */
static int
-get_number (pp)
+get_number_trailer (pp, trailer)
char **pp;
+ int trailer;
{
- int retval;
+ int retval = 0; /* default */
char *p = *pp;
if (p == NULL)
strncpy (varname, start, p - start);
varname[p - start] = '\0';
val = value_of_internalvar (lookup_internalvar (varname));
- if (TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_INT)
- error (
- "Convenience variables used to specify breakpoints must have integer values."
- );
- retval = (int) value_as_long (val);
+ if (TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_INT)
+ retval = (int) value_as_long (val);
+ else
+ {
+ printf_filtered ("Convenience variable must have integer value.\n");
+ retval = 0;
+ }
}
else
{
++p;
if (p == *pp)
/* There is no number here. (e.g. "cond a == b"). */
- error_no_arg ("breakpoint number");
- retval = atoi (*pp);
+ {
+ /* Skip non-numeric token */
+ while (*p && !isspace((int) *p))
+ ++p;
+ /* Return zero, which caller must interpret as error. */
+ retval = 0;
+ }
+ else
+ retval = atoi (*pp);
+ }
+ if (!(isspace (*p) || *p == '\0' || *p == trailer))
+ {
+ /* Trailing junk: return 0 and let caller print error msg. */
+ while (!(isspace (*p) || *p == '\0' || *p == trailer))
+ ++p;
+ retval = 0;
}
- if (!(isspace (*p) || *p == '\0'))
- error ("breakpoint number expected");
while (isspace (*p))
p++;
*pp = p;
return retval;
}
+
+/* Like get_number_trailer, but don't allow a trailer. */
+int
+get_number (pp)
+ char **pp;
+{
+ return get_number_trailer (pp, '\0');
+}
+
+/* Parse a number or a range.
+ * A number will be of the form handled by get_number.
+ * A range will be of the form <number1> - <number2>, and
+ * will represent all the integers between number1 and number2,
+ * inclusive.
+ *
+ * While processing a range, this fuction is called iteratively;
+ * At each call it will return the next value in the range.
+ *
+ * At the beginning of parsing a range, the char pointer PP will
+ * be advanced past <number1> and left pointing at the '-' token.
+ * Subsequent calls will not advance the pointer until the range
+ * is completed. The call that completes the range will advance
+ * pointer PP past <number2>.
+ */
+
+int
+get_number_or_range (pp)
+ char **pp;
+{
+ static int last_retval, end_value;
+ static char *end_ptr;
+ static int in_range = 0;
+
+ if (**pp != '-')
+ {
+ /* Default case: pp is pointing either to a solo number,
+ or to the first number of a range. */
+ last_retval = get_number_trailer (pp, '-');
+ if (**pp == '-')
+ {
+ char **temp;
+
+ /* This is the start of a range (<number1> - <number2>).
+ Skip the '-', parse and remember the second number,
+ and also remember the end of the final token. */
+
+ temp = &end_ptr;
+ end_ptr = *pp + 1;
+ while (isspace ((int) *end_ptr))
+ end_ptr++; /* skip white space */
+ end_value = get_number (temp);
+ if (end_value < last_retval)
+ {
+ error ("inverted range");
+ }
+ else if (end_value == last_retval)
+ {
+ /* degenerate range (number1 == number2). Advance the
+ token pointer so that the range will be treated as a
+ single number. */
+ *pp = end_ptr;
+ }
+ else
+ in_range = 1;
+ }
+ }
+ else if (! in_range)
+ error ("negative value");
+ else
+ {
+ /* pp points to the '-' that betokens a range. All
+ number-parsing has already been done. Return the next
+ integer value (one greater than the saved previous value).
+ Do not advance the token pointer 'pp' until the end of range
+ is reached. */
+
+ if (++last_retval == end_value)
+ {
+ /* End of range reached; advance token pointer. */
+ *pp = end_ptr;
+ in_range = 0;
+ }
+ }
+ return last_retval;
+}
+
+
\f
/* condition N EXP -- set break condition of breakpoint N to EXP. */
p = arg;
bnum = get_number (&p);
+ if (bnum == 0)
+ error ("Bad breakpoint argument: '%s'", arg);
ALL_BREAKPOINTS (b)
if (b->number == bnum)
p = arg;
bnum = get_number (&p);
+ if (bnum == 0)
+ error ("bad breakpoint number: '%s'", arg);
+
if (p && *p)
error ("Unexpected extra arguments following breakpoint number.");
if (within_current_scope)
{
/* Evaluate the expression and cut the chain of values
- produced off from the value chain. */
+ produced off from the value chain.
+
+ Make sure the value returned isn't lazy; we use
+ laziness to determine what memory GDB actually needed
+ in order to compute the value of the expression. */
v = evaluate_expression (b->exp);
+ VALUE_CONTENTS(v);
value_release_to_mark (mark);
b->val_chain = v;
/* Look at each value on the value chain. */
for (; v; v = v->next)
{
- /* If it's a memory location, then we must watch it. */
- if (v->lval == lval_memory)
+ /* If it's a memory location, and GDB actually needed
+ its contents to evaluate the expression, then we
+ must watch it. */
+ if (VALUE_LVAL (v) == lval_memory
+ && ! VALUE_LAZY (v))
{
CORE_ADDR addr;
int len, type;
{
/* For each memory reference remove the watchpoint
at that address. */
- if (v->lval == lval_memory)
+ if (VALUE_LVAL (v) == lval_memory
+ && ! VALUE_LAZY (v))
{
CORE_ADDR addr;
int len, type;
continue;
for (v = b->val_chain; v; v = v->next)
{
- if (v->lval == lval_memory)
+ if (VALUE_LVAL (v) == lval_memory
+ && ! VALUE_LAZY (v))
{
CORE_ADDR vaddr;
else if (b->ignore_count > 0)
{
b->ignore_count--;
+ annotate_ignore_count_change ();
bs->stop = 0;
}
else
if (!can_use_hw_watchpoints)
return 0;
- /* Make sure all the intermediate values are in memory. Also make sure
- we found at least one memory expression. Guards against watch 0x12345,
- which is meaningless, but could cause errors if one tries to insert a
- hardware watchpoint for the constant expression. */
+ /* Make sure that the value of the expression depends only upon
+ memory contents, and values computed from them within GDB. If we
+ find any register references or function calls, we can't use a
+ hardware watchpoint.
+
+ The idea here is that evaluating an expression generates a series
+ of values, one holding the value of every subexpression. (The
+ expression a*b+c has five subexpressions: a, b, a*b, c, and
+ a*b+c.) GDB's values hold almost enough information to establish
+ the criteria given above --- they identify memory lvalues,
+ register lvalues, computed values, etcetera. So we can evaluate
+ the expression, and then scan the chain of values that leaves
+ behind to decide whether we can detect any possible change to the
+ expression's final value using only hardware watchpoints.
+
+ However, I don't think that the values returned by inferior
+ function calls are special in any way. So this function may not
+ notice that an expression involving an inferior function call
+ can't be watched with hardware watchpoints. FIXME. */
for (; v; v = v->next)
{
- if (v->lval == lval_memory)
+ if (VALUE_LVAL (v) == lval_memory)
{
- CORE_ADDR vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
- int len = TYPE_LENGTH (VALUE_TYPE (v));
-
- if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len))
- return 0;
+ if (VALUE_LAZY (v))
+ /* A lazy memory lvalue is one that GDB never needed to fetch;
+ we either just used its address (e.g., `a' in `a.b') or
+ we never needed it at all (e.g., `a' in `a,b'). */
+ ;
else
- found_memory_cnt++;
+ {
+ /* Ahh, memory we actually used! Check if we can cover
+ it with hardware watchpoints. */
+ CORE_ADDR vaddr = VALUE_ADDRESS (v) + VALUE_OFFSET (v);
+ int len = TYPE_LENGTH (VALUE_TYPE (v));
+
+ if (!TARGET_REGION_OK_FOR_HW_WATCHPOINT (vaddr, len))
+ return 0;
+ else
+ found_memory_cnt++;
+ }
}
else if (v->lval != not_lval && v->modifiable == 0)
return 0; /* ??? What does this represent? */
error_no_arg ("a breakpoint number");
num = get_number (&p);
-
+ if (num == 0)
+ error ("bad breakpoint number: '%s'", args);
if (*p == 0)
error ("Second argument (specified ignore-count) is missing.");
register char *p = args;
char *p1;
register int num;
- register struct breakpoint *b;
+ register struct breakpoint *b, *tmp;
if (p == 0)
error_no_arg ("one or more breakpoint numbers");
{
p1 = p;
- num = get_number (&p1);
-
- ALL_BREAKPOINTS (b)
- if (b->number == num)
+ num = get_number_or_range (&p1);
+ if (num == 0)
{
- struct breakpoint *related_breakpoint = b->related_breakpoint;
- function (b);
- if (related_breakpoint)
- function (related_breakpoint);
- goto win;
+ warning ("bad breakpoint number at or near '%s'", p);
+ }
+ else
+ {
+ ALL_BREAKPOINTS_SAFE (b, tmp)
+ if (b->number == num)
+ {
+ struct breakpoint *related_breakpoint = b->related_breakpoint;
+ function (b);
+ if (related_breakpoint)
+ function (related_breakpoint);
+ goto win;
+ }
+ printf_unfiltered ("No breakpoint number %d.\n", num);
+ win:
}
- printf_unfiltered ("No breakpoint number %d.\n", num);
- win:
p = p1;
}
}
int call_dummy;
};
+/* The possible return values for print_bpstat, print_it_normal,
+ print_it_done, print_it_noop. */
+enum print_stop_action
+ {
+ PRINT_UNKNOWN = -1,
+ PRINT_SRC_AND_LOC,
+ PRINT_SRC_ONLY,
+ PRINT_NOTHING
+ };
+
/* Tell what to do about this bpstat. */
struct bpstat_what bpstat_what PARAMS ((bpstat));
\f
/* Print a message indicating what happened. Returns nonzero to
say that only the source line should be printed after this (zero
return means print the frame as well as the source line). */
-extern int bpstat_print PARAMS ((bpstat));
+extern enum print_stop_action bpstat_print PARAMS ((bpstat));
/* Return the breakpoint number of the first breakpoint we are stopped
at. *BSP upon return is a bpstat which points to the remaining
ordinary_breakpoint_here,
permanent_breakpoint_here
};
-
-/* The possible return values for print_bpstat, print_it_normal,
- print_it_done, print_it_noop. */
-enum print_stop_action
- {
- PRINT_UNKNOWN = -1,
- PRINT_SRC_AND_LOC,
- PRINT_SRC_ONLY,
- PRINT_NOTHING
- };
\f
/* Prototypes for breakpoint-related functions. */
extern void clear_breakpoint_hit_counts PARAMS ((void));
+extern int get_number PARAMS ((char **));
+
+extern int get_number_or_range PARAMS ((char **));
+
/* The following are for displays, which aren't really breakpoints, but
here is as good a place as any for them. */
#undef WITH_SIM
/* Set to true if the save_state_t structure is present */
-#define HAVE_STRUCT_SAVE_STATE_T 0
+#undef HAVE_STRUCT_SAVE_STATE_T
/* Set to true if the save_state_t structure has the ss_wide member */
-#define HAVE_STRUCT_MEMBER_SS_WIDE 0
+#undef HAVE_STRUCT_MEMBER_SS_WIDE
+
+/* Define if <sys/ptrace.h> defines the PTRACE_GETXFPREGS request. */
+#undef HAVE_PTRACE_GETXFPREGS
/* Define if you have the __argz_count function. */
#undef HAVE___ARGZ_COUNT
#define I386_GNULINUX_TARGET
#define HAVE_I387_REGS
+#ifdef HAVE_PTRACE_GETXFPREGS
+#define HAVE_SSE_REGS
+#endif
#include "i386/tm-i386.h"
/* Return the GDB type object for the "standard" data type
of data in register N. */
#undef REGISTER_VIRTUAL_TYPE
-#define REGISTER_VIRTUAL_TYPE(N) \
- (IS_FP_REGNUM (N) ? builtin_type_long_double : builtin_type_int)
+#define REGISTER_VIRTUAL_TYPE(N) \
+ (((N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM) \
+ ? lookup_pointer_type (builtin_type_void) \
+ : IS_FP_REGNUM(N) ? builtin_type_long_double \
+ : IS_SSE_REGNUM(N) ? builtin_type_v4sf \
+ : builtin_type_int)
#endif
fi
+echo $ac_n "checking for PTRACE_GETXFPREGS""... $ac_c" 1>&6
+echo "configure:3696: checking for PTRACE_GETXFPREGS" >&5
+if eval "test \"`echo '$''{'gdb_cv_have_ptrace_getxfpregs'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3701 "configure"
+#include "confdefs.h"
+#include <sys/ptrace.h>
+int main() {
+PTRACE_GETXFPREGS;
+; return 0; }
+EOF
+if { (eval echo configure:3708: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ gdb_cv_have_ptrace_getxfpregs=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ gdb_cv_have_ptrace_getxfpregs=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gdb_cv_have_ptrace_getxfpregs" 1>&6
+if test $gdb_cv_have_ptrace_getxfpregs = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_PTRACE_GETXFPREGS 1
+EOF
+
+fi
+
echo $ac_n "checking for socketpair in -lsocket""... $ac_c" 1>&6
-echo "configure:3696: checking for socketpair in -lsocket" >&5
+echo "configure:3729: checking for socketpair in -lsocket" >&5
ac_lib_var=`echo socket'_'socketpair | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3704 "configure"
+#line 3737 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
socketpair()
; return 0; }
EOF
-if { (eval echo configure:3715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
for ac_func in socketpair
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3745: checking for $ac_func" >&5
+echo "configure:3778: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3750 "configure"
+#line 3783 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:3773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo $ac_n "checking whether malloc must be declared""... $ac_c" 1>&6
-echo "configure:3800: checking whether malloc must be declared" >&5
+echo "configure:3833: checking whether malloc must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_malloc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3805 "configure"
+#line 3838 "configure"
#include "confdefs.h"
#include <stdio.h>
char *(*pfn) = (char *(*)) malloc
; return 0; }
EOF
-if { (eval echo configure:3826: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3859: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_malloc=no
else
fi
echo $ac_n "checking whether realloc must be declared""... $ac_c" 1>&6
-echo "configure:3847: checking whether realloc must be declared" >&5
+echo "configure:3880: checking whether realloc must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_realloc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3852 "configure"
+#line 3885 "configure"
#include "confdefs.h"
#include <stdio.h>
char *(*pfn) = (char *(*)) realloc
; return 0; }
EOF
-if { (eval echo configure:3873: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3906: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_realloc=no
else
fi
echo $ac_n "checking whether free must be declared""... $ac_c" 1>&6
-echo "configure:3894: checking whether free must be declared" >&5
+echo "configure:3927: checking whether free must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_free'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3899 "configure"
+#line 3932 "configure"
#include "confdefs.h"
#include <stdio.h>
char *(*pfn) = (char *(*)) free
; return 0; }
EOF
-if { (eval echo configure:3920: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3953: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_free=no
else
fi
echo $ac_n "checking whether strerror must be declared""... $ac_c" 1>&6
-echo "configure:3941: checking whether strerror must be declared" >&5
+echo "configure:3974: checking whether strerror must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_strerror'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3946 "configure"
+#line 3979 "configure"
#include "confdefs.h"
#include <stdio.h>
char *(*pfn) = (char *(*)) strerror
; return 0; }
EOF
-if { (eval echo configure:3967: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4000: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_strerror=no
else
fi
echo $ac_n "checking whether strdup must be declared""... $ac_c" 1>&6
-echo "configure:3988: checking whether strdup must be declared" >&5
+echo "configure:4021: checking whether strdup must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_strdup'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3993 "configure"
+#line 4026 "configure"
#include "confdefs.h"
#include <stdio.h>
char *(*pfn) = (char *(*)) strdup
; return 0; }
EOF
-if { (eval echo configure:4014: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4047: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_strdup=no
else
fi
echo $ac_n "checking whether strstr must be declared""... $ac_c" 1>&6
-echo "configure:4035: checking whether strstr must be declared" >&5
+echo "configure:4068: checking whether strstr must be declared" >&5
if eval "test \"`echo '$''{'bfd_cv_decl_needed_strstr'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4040 "configure"
+#line 4073 "configure"
#include "confdefs.h"
#include <stdio.h>
char *(*pfn) = (char *(*)) strstr
; return 0; }
EOF
-if { (eval echo configure:4061: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4094: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_decl_needed_strstr=no
else
# could be expunged. --jsm 1999-03-22
echo $ac_n "checking for HPUX save_state structure""... $ac_c" 1>&6
-echo "configure:4088: checking for HPUX save_state structure" >&5
+echo "configure:4121: checking for HPUX save_state structure" >&5
cat > conftest.$ac_ext <<EOF
-#line 4090 "configure"
+#line 4123 "configure"
#include "confdefs.h"
#include <machine/save_state.h>
EOF
rm -f conftest*
cat > conftest.$ac_ext <<EOF
-#line 4105 "configure"
+#line 4138 "configure"
#include "confdefs.h"
#include <machine/save_state.h>
EOF
gdb_cv_hostos_is_solaris=yes ;;
esac
echo $ac_n "checking for directory proc entries""... $ac_c" 1>&6
-echo "configure:4157: checking for directory proc entries" >&5
+echo "configure:4190: checking for directory proc entries" >&5
# The [gdb_host != sun4sol2] hack is because Solaris does provide the
# multiple procfs files as of Solaris 2.6, but GDB can't use it right now.
if test "$ac_cv_header_sys_procfs_h" = yes -a \
if test "$ac_cv_header_sys_procfs_h" = yes; then
echo $ac_n "checking for pstatus_t in sys/procfs.h""... $ac_c" 1>&6
-echo "configure:4179: checking for pstatus_t in sys/procfs.h" >&5
+echo "configure:4212: checking for pstatus_t in sys/procfs.h" >&5
if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_pstatus_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4184 "configure"
+#line 4217 "configure"
#include "confdefs.h"
#include <sys/procfs.h>
int main() {
pstatus_t avar
; return 0; }
EOF
-if { (eval echo configure:4191: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4224: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_have_sys_procfs_type_pstatus_t=yes
else
echo "$ac_t""$bfd_cv_have_sys_procfs_type_pstatus_t" 1>&6
echo $ac_n "checking for prrun_t in sys/procfs.h""... $ac_c" 1>&6
-echo "configure:4213: checking for prrun_t in sys/procfs.h" >&5
+echo "configure:4246: checking for prrun_t in sys/procfs.h" >&5
if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_prrun_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4218 "configure"
+#line 4251 "configure"
#include "confdefs.h"
#include <sys/procfs.h>
int main() {
prrun_t avar
; return 0; }
EOF
-if { (eval echo configure:4225: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4258: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_have_sys_procfs_type_prrun_t=yes
else
echo "$ac_t""$bfd_cv_have_sys_procfs_type_prrun_t" 1>&6
echo $ac_n "checking for gregset_t in sys/procfs.h""... $ac_c" 1>&6
-echo "configure:4247: checking for gregset_t in sys/procfs.h" >&5
+echo "configure:4280: checking for gregset_t in sys/procfs.h" >&5
if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_gregset_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4252 "configure"
+#line 4285 "configure"
#include "confdefs.h"
#include <sys/procfs.h>
int main() {
gregset_t avar
; return 0; }
EOF
-if { (eval echo configure:4259: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4292: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_have_sys_procfs_type_gregset_t=yes
else
echo "$ac_t""$bfd_cv_have_sys_procfs_type_gregset_t" 1>&6
echo $ac_n "checking for fpregset_t in sys/procfs.h""... $ac_c" 1>&6
-echo "configure:4281: checking for fpregset_t in sys/procfs.h" >&5
+echo "configure:4314: checking for fpregset_t in sys/procfs.h" >&5
if eval "test \"`echo '$''{'bfd_cv_have_sys_procfs_type_fpregset_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4286 "configure"
+#line 4319 "configure"
#include "confdefs.h"
#include <sys/procfs.h>
int main() {
fpregset_t avar
; return 0; }
EOF
-if { (eval echo configure:4293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4326: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
bfd_cv_have_sys_procfs_type_fpregset_t=yes
else
echo $ac_n "checking for PIOCSET ioctl entry in sys/procfs.h""... $ac_c" 1>&6
-echo "configure:4317: checking for PIOCSET ioctl entry in sys/procfs.h" >&5
+echo "configure:4350: checking for PIOCSET ioctl entry in sys/procfs.h" >&5
if eval "test \"`echo '$''{'gdb_cv_have_procfs_piocset'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4322 "configure"
+#line 4355 "configure"
#include "confdefs.h"
#include <unistd.h>
#include <sys/types.h>
; return 0; }
EOF
-if { (eval echo configure:4335: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4368: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gdb_cv_have_procfs_piocset=yes
else
fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:4357: checking for main in -lm" >&5
+echo "configure:4390: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4365 "configure"
+#line 4398 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
-if { (eval echo configure:4372: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for wctype in -lc""... $ac_c" 1>&6
-echo "configure:4401: checking for wctype in -lc" >&5
+echo "configure:4434: checking for wctype in -lc" >&5
ac_lib_var=`echo c'_'wctype | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4409 "configure"
+#line 4442 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
wctype()
; return 0; }
EOF
-if { (eval echo configure:4420: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for wctype in -lw""... $ac_c" 1>&6
-echo "configure:4439: checking for wctype in -lw" >&5
+echo "configure:4472: checking for wctype in -lw" >&5
ac_lib_var=`echo w'_'wctype | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lw $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4447 "configure"
+#line 4480 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
wctype()
; return 0; }
EOF
-if { (eval echo configure:4458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for long long support in compiler""... $ac_c" 1>&6
-echo "configure:4490: checking for long long support in compiler" >&5
+echo "configure:4523: checking for long long support in compiler" >&5
if eval "test \"`echo '$''{'gdb_cv_c_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4495 "configure"
+#line 4528 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:4505: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4538: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gdb_cv_c_long_long=yes
else
echo $ac_n "checking for long long support in printf""... $ac_c" 1>&6
-echo "configure:4527: checking for long long support in printf" >&5
+echo "configure:4560: checking for long long support in printf" >&5
if eval "test \"`echo '$''{'gdb_cv_printf_has_long_long'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
gdb_cv_printf_has_long_long=no
else
cat > conftest.$ac_ext <<EOF
-#line 4535 "configure"
+#line 4568 "configure"
#include "confdefs.h"
int main () {
return (strcmp ("0x0123456789abcdef", buf));
}
EOF
-if { (eval echo configure:4549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
gdb_cv_printf_has_long_long=yes
else
echo $ac_n "checking for long double support in compiler""... $ac_c" 1>&6
-echo "configure:4573: checking for long double support in compiler" >&5
+echo "configure:4606: checking for long double support in compiler" >&5
if eval "test \"`echo '$''{'ac_cv_c_long_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4578 "configure"
+#line 4611 "configure"
#include "confdefs.h"
int main() {
long double foo;
; return 0; }
EOF
-if { (eval echo configure:4585: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4618: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_long_double=yes
else
echo $ac_n "checking for long double support in printf""... $ac_c" 1>&6
-echo "configure:4607: checking for long double support in printf" >&5
+echo "configure:4640: checking for long double support in printf" >&5
if eval "test \"`echo '$''{'gdb_cv_printf_has_long_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
gdb_cv_printf_has_long_double=no
else
cat > conftest.$ac_ext <<EOF
-#line 4615 "configure"
+#line 4648 "configure"
#include "confdefs.h"
int main () {
return (strncmp ("3.14159", buf, 7));
}
EOF
-if { (eval echo configure:4625: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4658: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
gdb_cv_printf_has_long_double=yes
else
echo $ac_n "checking for long double support in scanf""... $ac_c" 1>&6
-echo "configure:4649: checking for long double support in scanf" >&5
+echo "configure:4682: checking for long double support in scanf" >&5
if eval "test \"`echo '$''{'gdb_cv_scanf_has_long_double'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
gdb_cv_scanf_has_long_double=no
else
cat > conftest.$ac_ext <<EOF
-#line 4657 "configure"
+#line 4690 "configure"
#include "confdefs.h"
int main () {
return !(f > 3.14159 && f < 3.14160);
}
EOF
-if { (eval echo configure:4667: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
gdb_cv_scanf_has_long_double=yes
else
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4693: checking for $ac_hdr" >&5
+echo "configure:4726: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4698 "configure"
+#line 4731 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4703: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
for ac_func in getpagesize
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4732: checking for $ac_func" >&5
+echo "configure:4765: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 4737 "configure"
+#line 4770 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
; return 0; }
EOF
-if { (eval echo configure:4760: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
done
echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:4785: checking for working mmap" >&5
+echo "configure:4818: checking for working mmap" >&5
if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_func_mmap_fixed_mapped=no
else
cat > conftest.$ac_ext <<EOF
-#line 4793 "configure"
+#line 4826 "configure"
#include "confdefs.h"
/* Thanks to Mike Haertel and Jim Avera for this test.
}
EOF
-if { (eval echo configure:4933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_mmap_fixed_mapped=yes
else
case ${host_os} in
hpux*)
echo $ac_n "checking for HPUX/OSF thread support""... $ac_c" 1>&6
-echo "configure:4962: checking for HPUX/OSF thread support" >&5
+echo "configure:4995: checking for HPUX/OSF thread support" >&5
if test -f /usr/include/dce/cma_config.h ; then
if test "$GCC" = "yes" ; then
echo "$ac_t""yes" 1>&6
;;
solaris*)
echo $ac_n "checking for Solaris thread debugging library""... $ac_c" 1>&6
-echo "configure:4981: checking for Solaris thread debugging library" >&5
+echo "configure:5014: checking for Solaris thread debugging library" >&5
if test -f /usr/lib/libthread_db.so.1 ; then
echo "$ac_t""yes" 1>&6
cat >> confdefs.h <<\EOF
CONFIG_OBS="${CONFIG_OBS} sol-thread.o"
CONFIG_SRCS="${CONFIG_SRCS} sol-thread.c"
echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:4991: checking for dlopen in -ldl" >&5
+echo "configure:5024: checking for dlopen in -ldl" >&5
ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ldl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 4999 "configure"
+#line 5032 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
dlopen()
; return 0; }
EOF
-if { (eval echo configure:5010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# all symbols visible in the dynamic symbol table.
hold_ldflags=$LDFLAGS
echo $ac_n "checking for the ld -export-dynamic flag""... $ac_c" 1>&6
-echo "configure:5042: checking for the ld -export-dynamic flag" >&5
+echo "configure:5075: checking for the ld -export-dynamic flag" >&5
LDFLAGS="${LDFLAGS} -Wl,-export-dynamic"
cat > conftest.$ac_ext <<EOF
-#line 5045 "configure"
+#line 5078 "configure"
#include "confdefs.h"
int main() {
int i;
; return 0; }
EOF
-if { (eval echo configure:5052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5085: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
found=yes
else
# Sun randomly tweaked the prototypes in <proc_service.h>
# at one point.
echo $ac_n "checking if <proc_service.h> is old""... $ac_c" 1>&6
-echo "configure:5071: checking if <proc_service.h> is old" >&5
+echo "configure:5104: checking if <proc_service.h> is old" >&5
if eval "test \"`echo '$''{'gdb_cv_proc_service_is_old'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5077 "configure"
+#line 5110 "configure"
#include "confdefs.h"
#include <proc_service.h>
; return 0; }
EOF
-if { (eval echo configure:5088: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5121: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
gdb_cv_proc_service_is_old=no
else
# In the Cygwin environment, we need some additional flags.
echo $ac_n "checking for cygwin""... $ac_c" 1>&6
-echo "configure:5357: checking for cygwin" >&5
+echo "configure:5390: checking for cygwin" >&5
if eval "test \"`echo '$''{'gdb_cv_os_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 5362 "configure"
+#line 5395 "configure"
#include "confdefs.h"
#if defined (__CYGWIN__) || defined (__CYGWIN32__)
else
TERM_LIB=
echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
-echo "configure:5396: checking for tgetent in -lncurses" >&5
+echo "configure:5429: checking for tgetent in -lncurses" >&5
ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lncurses $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5404 "configure"
+#line 5437 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:5415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5448: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for tgetent in -lHcurses""... $ac_c" 1>&6
-echo "configure:5434: checking for tgetent in -lHcurses" >&5
+echo "configure:5467: checking for tgetent in -lHcurses" >&5
ac_lib_var=`echo Hcurses'_'tgetent | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lHcurses $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5442 "configure"
+#line 5475 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:5453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5486: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for tgetent in -ltermlib""... $ac_c" 1>&6
-echo "configure:5472: checking for tgetent in -ltermlib" >&5
+echo "configure:5505: checking for tgetent in -ltermlib" >&5
ac_lib_var=`echo termlib'_'tgetent | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ltermlib $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5480 "configure"
+#line 5513 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:5491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5524: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
-echo "configure:5510: checking for tgetent in -ltermcap" >&5
+echo "configure:5543: checking for tgetent in -ltermcap" >&5
ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-ltermcap $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5518 "configure"
+#line 5551 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:5529: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
-echo "configure:5548: checking for tgetent in -lcurses" >&5
+echo "configure:5581: checking for tgetent in -lcurses" >&5
ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lcurses $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5556 "configure"
+#line 5589 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:5567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for tgetent in -lterminfo""... $ac_c" 1>&6
-echo "configure:5586: checking for tgetent in -lterminfo" >&5
+echo "configure:5619: checking for tgetent in -lterminfo" >&5
ac_lib_var=`echo terminfo'_'tgetent | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lterminfo $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5594 "configure"
+#line 5627 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
tgetent()
; return 0; }
EOF
-if { (eval echo configure:5605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5638: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:6741: checking for X" >&5
+echo "configure:6774: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
-#line 6803 "configure"
+#line 6836 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6808: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6841: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6877 "configure"
+#line 6910 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
-if { (eval echo configure:6884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:7235: checking for Cygwin environment" >&5
+echo "configure:7268: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7240 "configure"
+#line 7273 "configure"
#include "confdefs.h"
int main() {
return __CYGWIN__;
; return 0; }
EOF
-if { (eval echo configure:7251: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7284: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cygwin=yes
else
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes
echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:7268: checking for mingw32 environment" >&5
+echo "configure:7301: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 7273 "configure"
+#line 7306 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
-if { (eval echo configure:7280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:7313: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_mingw32=yes
else
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:7299: checking for executable suffix" >&5
+echo "configure:7332: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
- if { (eval echo configure:7309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ if { (eval echo configure:7342: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
*.c | *.o | *.obj | *.ilk | *.pdb) ;;
AC_CHECK_FUNCS(setpgid sbrk sigaction isascii bzero bcopy btowc poll sigprocmask)
AC_FUNC_ALLOCA
+dnl See if ptrace.h provides the PTRACE_GETXFPREGS request.
+dnl PTRACE_GETXFPREGS is a Cygnus invention, since we wrote our own
+dnl Linux kernel patch for SSE support. That patch may or may not
+dnl actually make it into the official distribution. If you find that
+dnl years have gone by since this configure test was added, and Linux
+dnl isn't using PTRACE_GETXFPREGS, that means that our patch didn't
+dnl make it, and you can delete this code.
+AC_MSG_CHECKING(for PTRACE_GETXFPREGS)
+AC_CACHE_VAL(gdb_cv_have_ptrace_getxfpregs,
+[AC_TRY_COMPILE([#include <sys/ptrace.h>],
+ [PTRACE_GETXFPREGS;],
+ [gdb_cv_have_ptrace_getxfpregs=yes],
+ [gdb_cv_have_ptrace_getxfpregs=no])])
+AC_MSG_RESULT($gdb_cv_have_ptrace_getxfpregs)
+if test $gdb_cv_have_ptrace_getxfpregs = yes; then
+ AC_DEFINE(HAVE_PTRACE_GETXFPREGS)
+fi
+
AC_CHECK_LIB(socket, socketpair)
AC_CHECK_FUNCS(socketpair)
# All the includes used for CFLAGS and for lint.
# -I. for config files.
+# -I.. for gdb's config files (especially config.h)
# -I${srcdir} possibly for regex.h also.
# -I${srcdir}/config for more generic config files.
-INCLUDE_CFLAGS = -I. -I${srcdir} -I${srcdir}/.. -I${srcdir}/../config -I$(INCLUDE_DIR)
+INCLUDE_CFLAGS = -I. -I.. -I${srcdir} -I${srcdir}/.. -I${srcdir}/../config -I$(INCLUDE_DIR)
# M{H,T}_CFLAGS, if defined, has host- and target-dependent CFLAGS
# from the config/ directory.
CFLAGS = -g
# INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros.
INTERNAL_CFLAGS = ${CFLAGS} ${GLOBAL_CFLAGS} ${PROFILE_CFLAGS} \
- ${BFD_CFLAGS} ${INCLUDE_CFLAGS}
+ ${INCLUDE_CFLAGS} ${BFD_CFLAGS} -DGDBSERVER
# LDFLAGS is specifically reserved for setting from the command line
# when running make.
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include "config.h"
#include <stdio.h>
#include <sys/file.h>
#include <netinet/in.h>
#include <signal.h>
#include <ctype.h>
#include <fcntl.h>
+#include <errno.h>
/* Sort of a hack... */
#define EOL (EOF - 1)
perror_with_name (string)
char *string;
{
+#ifndef STDC_HEADERS
extern int sys_nerr;
extern char *sys_errlist[];
extern int errno;
- char *err;
+#endif
+ const char *err;
char *combined;
err = (errno < sys_nerr) ? sys_errlist[errno] : "unknown error";
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
#include <stdio.h>
#include <sys/param.h>
#include <sys/dir.h>
+#include <sys/ptrace.h>
#include <sys/user.h>
#include <signal.h>
#include <sys/ioctl.h>
-#if 0
-#include <sgtty.h>
-#endif
#include <fcntl.h>
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
char buf2[MAX_REGISTER_RAW_SIZE];
/***************End MY defs*********************/
-#include <sys/ptrace.h>
-
-#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1)
+#ifdef HAVE_SYS_REG_H
#include <sys/reg.h>
#endif
+/* Default the type of the ptrace transfer to int. */
+#ifndef PTRACE_XFER_TYPE
+#define PTRACE_XFER_TYPE int
+#endif
+
extern char **environ;
extern int errno;
extern int inferior_pid;
- KERNEL_U_ADDR
#endif
-#ifndef TARGET_M68K
+#ifdef I386_GNULINUX_TARGET
+/* i386_register_raw_size[i] is the number of bytes of storage in the
+ actual machine representation for register i. */
+int i386_register_raw_size[MAX_NUM_REGS] = {
+ 4, 4, 4, 4,
+ 4, 4, 4, 4,
+ 4, 4, 4, 4,
+ 4, 4, 4, 4,
+ 10, 10, 10, 10,
+ 10, 10, 10, 10,
+ 4, 4, 4, 4,
+ 4, 4, 4, 4,
+ 16, 16, 16, 16,
+ 16, 16, 16, 16,
+ 4
+};
+
+int i386_register_byte[MAX_NUM_REGS];
+
+static void
+initialize_arch()
+{
+ /* Initialize the table saying where each register starts in the
+ register file. */
+ {
+ int i, offset;
+
+ offset = 0;
+ for (i = 0; i < MAX_NUM_REGS; i++)
+ {
+ i386_register_byte[i] = offset;
+ offset += i386_register_raw_size[i];
+ }
+ }
+}
+
/* this table must line up with REGISTER_NAMES in tm-i386v.h */
/* symbols like 'EAX' come from <sys/reg.h> */
static int regmap[] =
return (blockend + 4 * regmap[regnum]);
}
-#else /* TARGET_M68K */
+#elif defined(TARGET_M68K)
+static void
+initialize_arch()
+{
+ return;
+}
+
/* This table must line up with REGISTER_NAMES in tm-m68k.h */
static int regmap[] =
{
{
return (blockend + 4 * regmap[regnum]);
}
+/* start-sanitize-ia64 */
+#elif defined(IA64_GNULINUX_TARGET)
+#undef NUM_FREGS
+#define NUM_FREGS 0
+
+#include <asm/ptrace_offsets.h>
+
+static int u_offsets[] =
+ {
+ /* general registers */
+ -1, /* gr0 not available; i.e, it's always zero */
+ PT_R1,
+ PT_R2,
+ PT_R3,
+ PT_R4,
+ PT_R5,
+ PT_R6,
+ PT_R7,
+ PT_R8,
+ PT_R9,
+ PT_R10,
+ PT_R11,
+ PT_R12,
+ PT_R13,
+ PT_R14,
+ PT_R15,
+ PT_R16,
+ PT_R17,
+ PT_R18,
+ PT_R19,
+ PT_R20,
+ PT_R21,
+ PT_R22,
+ PT_R23,
+ PT_R24,
+ PT_R25,
+ PT_R26,
+ PT_R27,
+ PT_R28,
+ PT_R29,
+ PT_R30,
+ PT_R31,
+ /* gr32 through gr127 not directly available via the ptrace interface */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ /* Floating point registers */
+ -1, -1, /* f0 and f1 not available (f0 is +0.0 and f1 is +1.0) */
+ PT_F2,
+ PT_F3,
+ PT_F4,
+ PT_F5,
+ PT_F6,
+ PT_F7,
+ PT_F8,
+ PT_F9,
+ PT_F10,
+ PT_F11,
+ PT_F12,
+ PT_F13,
+ PT_F14,
+ PT_F15,
+ PT_F16,
+ PT_F17,
+ PT_F18,
+ PT_F19,
+ PT_F20,
+ PT_F21,
+ PT_F22,
+ PT_F23,
+ PT_F24,
+ PT_F25,
+ PT_F26,
+ PT_F27,
+ PT_F28,
+ PT_F29,
+ PT_F30,
+ PT_F31,
+ PT_F32,
+ PT_F33,
+ PT_F34,
+ PT_F35,
+ PT_F36,
+ PT_F37,
+ PT_F38,
+ PT_F39,
+ PT_F40,
+ PT_F41,
+ PT_F42,
+ PT_F43,
+ PT_F44,
+ PT_F45,
+ PT_F46,
+ PT_F47,
+ PT_F48,
+ PT_F49,
+ PT_F50,
+ PT_F51,
+ PT_F52,
+ PT_F53,
+ PT_F54,
+ PT_F55,
+ PT_F56,
+ PT_F57,
+ PT_F58,
+ PT_F59,
+ PT_F60,
+ PT_F61,
+ PT_F62,
+ PT_F63,
+ PT_F64,
+ PT_F65,
+ PT_F66,
+ PT_F67,
+ PT_F68,
+ PT_F69,
+ PT_F70,
+ PT_F71,
+ PT_F72,
+ PT_F73,
+ PT_F74,
+ PT_F75,
+ PT_F76,
+ PT_F77,
+ PT_F78,
+ PT_F79,
+ PT_F80,
+ PT_F81,
+ PT_F82,
+ PT_F83,
+ PT_F84,
+ PT_F85,
+ PT_F86,
+ PT_F87,
+ PT_F88,
+ PT_F89,
+ PT_F90,
+ PT_F91,
+ PT_F92,
+ PT_F93,
+ PT_F94,
+ PT_F95,
+ PT_F96,
+ PT_F97,
+ PT_F98,
+ PT_F99,
+ PT_F100,
+ PT_F101,
+ PT_F102,
+ PT_F103,
+ PT_F104,
+ PT_F105,
+ PT_F106,
+ PT_F107,
+ PT_F108,
+ PT_F109,
+ PT_F110,
+ PT_F111,
+ PT_F112,
+ PT_F113,
+ PT_F114,
+ PT_F115,
+ PT_F116,
+ PT_F117,
+ PT_F118,
+ PT_F119,
+ PT_F120,
+ PT_F121,
+ PT_F122,
+ PT_F123,
+ PT_F124,
+ PT_F125,
+ PT_F126,
+ PT_F127,
+ /* branch registers */
+ PT_B0,
+ PT_B1,
+ PT_B2,
+ PT_B3,
+ PT_B4,
+ PT_B5,
+ PT_B6,
+ PT_B7,
+ /* other registers */
+ PT_PR,
+ PT_CR_IIP,
+ PT_CR_IPSR,
+ /* kernel registers not visible via ptrace interface (?) */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ /* hole */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ PT_AR_RSC,
+ PT_AR_BSP,
+ PT_AR_BSPSTORE,
+ PT_AR_RNAT,
+ -1,
+ -1, /* Not available: FCR, IA32 floating control register */
+ -1, -1,
+ -1, /* Not available: EFLAG */
+ -1, /* Not available: CSD */
+ -1, /* Not available: SSD */
+ -1, /* Not available: CFLG */
+ -1, /* Not available: FSR */
+ -1, /* Not available: FIR */
+ -1, /* Not available: FDR */
+ -1,
+ PT_AR_CCV,
+ -1, -1, -1,
+ PT_AR_UNAT,
+ -1, -1, -1,
+ PT_AR_FPSR,
+ -1, -1, -1,
+ -1, /* Not available: ITC */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ PT_AR_PFS,
+ PT_AR_LC,
+ -1, /* Not available: EC, the Epilog Count register */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1,
+ };
+
+int
+ia64_register_u_addr (int blockend, int regnum)
+{
+ int addr;
+
+ if (regnum < 0 || regnum >= NUM_REGS)
+ error ("Invalid register number %d.", regnum);
+
+ addr = u_offsets[regnum];
+ if (addr == -1)
+ addr = 0;
+
+ return addr;
+}
+
+initialize_arch()
+{
+ return;
+}
+/* end-sanitize-ia64 */
#endif
CORE_ADDR
fetch_register (regno)
int regno;
{
- register unsigned int regaddr;
+ CORE_ADDR regaddr;
register int i;
/* Offset of registers within the u area. */
offset = U_REGS_OFFSET;
regaddr = register_addr (regno, offset);
- for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
+ for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
- *(int *) ®isters[regno * 4 + i] = ptrace (PTRACE_PEEKUSR, inferior_pid,
- (PTRACE_ARG3_TYPE) regaddr, 0);
- regaddr += sizeof (int);
+ *(PTRACE_XFER_TYPE *) ®isters[REGISTER_BYTE (regno) + i] =
+ ptrace (PTRACE_PEEKUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr, 0);
+ regaddr += sizeof (PTRACE_XFER_TYPE);
if (errno != 0)
{
/* Warning, not error, in case we are attached; sometimes the
store_inferior_registers (regno)
int regno;
{
- register unsigned int regaddr;
- register int i;
+ CORE_ADDR regaddr;
+ int i;
unsigned int offset = U_REGS_OFFSET;
if (regno >= 0)
for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
{
errno = 0;
- ptrace (PTRACE_POKEUSR, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
+ ptrace (PTRACE_POKEUSER, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
*(int *) ®isters[REGISTER_BYTE (regno) + i]);
if (errno != 0)
{
{
register int i;
/* Round starting address down to longword boundary. */
- register CORE_ADDR addr = memaddr & -sizeof (int);
+ register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
- register int count
- = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
+ register int count
+ = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
+ / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
- register int *buffer = (int *) alloca (count * sizeof (int));
+ register PTRACE_XFER_TYPE *buffer
+ = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
/* Read all the longwords */
- for (i = 0; i < count; i++, addr += sizeof (int))
+ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
{
buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid, addr, 0);
}
/* Copy appropriate bytes out of the buffer. */
- memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
+ memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);
}
/* Copy LEN bytes of data from debugger memory at MYADDR
{
register int i;
/* Round starting address down to longword boundary. */
- register CORE_ADDR addr = memaddr & -sizeof (int);
+ register CORE_ADDR addr = memaddr & -sizeof (PTRACE_XFER_TYPE);
/* Round ending address up; get number of longwords that makes. */
register int count
- = (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
+ = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1) / sizeof (PTRACE_XFER_TYPE);
/* Allocate buffer of that many longwords. */
- register int *buffer = (int *) alloca (count * sizeof (int));
+ register PTRACE_XFER_TYPE *buffer = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
extern int errno;
/* Fill start and end extra bytes of buffer with existing memory data. */
{
buffer[count - 1]
= ptrace (PTRACE_PEEKTEXT, inferior_pid,
- addr + (count - 1) * sizeof (int), 0);
+ addr + (count - 1) * sizeof (PTRACE_XFER_TYPE), 0);
}
/* Copy data to be written over corresponding part of buffer */
- memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
+ memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), myaddr, len);
/* Write the entire buffer. */
- for (i = 0; i < count; i++, addr += sizeof (int))
+ for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
{
errno = 0;
ptrace (PTRACE_POKETEXT, inferior_pid, addr, buffer[i]);
initialize ()
{
inferior_pid = 0;
+ initialize_arch();
}
int
#include <sys/wait.h>
#include <sys/fpp.h>
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
#include <sys/ptrace.h>
extern host_callback default_callback; /* in sim/common/callback.c */
-char registers[REGISTER_BYTES] __attribute__ ((aligned));
+static char my_registers[REGISTER_BYTES] __attribute__ ((aligned));
+char * registers = my_registers;
int target_byte_order; /* used by simulator */
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
/***************Begin MY defs*********************/
int quit_flag = 0;
-char registers[REGISTER_BYTES];
+static char my_registers[REGISTER_BYTES];
+char *registers = my_registers;
/* Index within `registers' of the first byte of the space for
register N. */
{
int i;
unsigned char csum = 0;
- char buf2[2000];
+ char buf2[PBUFSIZ];
char buf3[1];
int cnt = strlen (buf);
char *p;
int regno;
char *buf;
{
- extern char registers[];
int regsize = REGISTER_RAW_SIZE (regno);
- *buf++ = tohex (regno >> 4);
+ if ((regno >> 12) != 0)
+ *buf++ = tohex ((regno >> 12) & 0xf);
+ if ((regno >> 8) != 0)
+ *buf++ = tohex ((regno >> 8) & 0xf);
+ *buf++ = tohex ((regno >> 4) & 0xf);
*buf++ = tohex (regno & 0xf);
*buf++ = ':';
convert_int_to_ascii (®isters[REGISTER_BYTE (regno)], buf, regsize);
if (status == 'T')
{
+#ifdef GDBSERVER_RESUME_REGS
+ static int gdbserver_resume_regs[] = GDBSERVER_RESUME_REGS ;
+ int i;
+ for (i = 0;
+ i < sizeof (gdbserver_resume_regs)
+ / sizeof (gdbserver_resume_regs[0]);
+ i++)
+ {
+ int regnum = gdbserver_resume_regs[i];
+ buf = outreg (regnum, buf);
+ }
+#else /* !defined(GDBSERVER_RESUME_REGS) */
buf = outreg (PC_REGNUM, buf);
buf = outreg (FP_REGNUM, buf);
buf = outreg (SP_REGNUM, buf);
#ifdef O7_REGNUM
buf = outreg (O7_REGNUM, buf);
#endif
+#endif /* GDBSERVER_RESUME_REGS */
/* If the debugger hasn't used any thread features, don't burden it with
threads. If we didn't check this, GDB 4.13 and older would choke. */
int argc;
char *argv[];
{
- char ch, status, own_buf[2000], mem_buf[2000];
+ char ch, status, own_buf[PBUFSIZ], mem_buf[2000];
int i = 0;
unsigned char signal;
unsigned int len;
/* Target-specific variables */
-extern char registers[];
+extern char *registers;
/* Public variables in server.c */
/* Functions from utils.c */
void perror_with_name PARAMS ((char *string));
+
+
+/* Maximum number of bytes to read/write at once. The value here
+ is chosen to fill up a packet (the headers account for the 32). */
+#define MAXBUFBYTES(N) (((N)-32)/2)
+
+/* Buffer sizes for transferring memory, registers, etc. Round up PBUFSIZ to
+ hold all the registers, at least. */
+#define PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (2000)) \
+ ? (REGISTER_BYTES * 2 + 32) \
+ : 2000)
perror_with_name (string)
char *string;
{
+#ifndef STDC_HEADERS
extern int sys_nerr;
extern char *sys_errlist[];
extern int errno;
- char *err;
+#endif
+ const char *err;
char *combined;
if (errno < sys_nerr)
memset (f, 0, sizeof (*f));
f->loc.bitpos = 0;
f->type = create_array_type (0, elt_type,
- create_range_type (0, builtin_type_int, 0, n));
+ create_range_type (0, builtin_type_int,
+ 0, n-1));
f->name = elt_name;
/* Build a struct type with that field. */
};
+/* Which ptrace request retrieves which registers?
+ These apply to the corresponding SET requests as well. */
+#define GETREGS_SUPPLIES(regno) \
+ (0 <= (regno) && (regno) <= 15)
+#define GETFPREGS_SUPPLIES(regno) \
+ (FP0_REGNUM <= (regno) && (regno) <= LAST_FPU_CTRL_REGNUM)
+#define GETXFPREGS_SUPPLIES(regno) \
+ (FP0_REGNUM <= (regno) && (regno) <= MXCSR_REGNUM)
+
+/* Does the current host support the GETXFPREGS request? The header
+ file may or may not define it, and even if it is defined, the
+ kernel will return EIO if it's running on a pre-SSE processor.
+
+ My instinct is to attach this to some architecture- or
+ target-specific data structure, but really, a particular GDB
+ process can only run on top of one kernel at a time. So it's okay
+ for this to be a simple variable. */
+int have_ptrace_getxfpregs =
+#ifdef HAVE_PTRACE_GETXFPREGS
+ 1
+#else
+ 0
+#endif
+;
+
+
+\f
+/* Transfering the general registers between GDB, inferiors and core files. */
+
/* Given a pointer to a general register set in struct user format
(gregset_t *), unpack the register contents and supply them as
gdb's idea of the current register values. */
}
}
+
/* Fill in a gregset_t object with selected data from a gdb-format
register file.
- GREGSETP points to the gregset_t object to be filled.
*(regp + regmap[regi]) = * (int *) ®isters[REGISTER_BYTE (regi)];
}
+
+/* Store GDB's value for REGNO in *GREGSETP. If REGNO is -1, do all
+ of them. */
void
fill_gregset (gregset_t *gregsetp,
int regno)
}
-/* Where does st(N) start in the fpregset_t structure F? */
-#define FPREGSET_T_FPREG_OFFSET(f, n) \
+/* Read the general registers from the process, and store them
+ in registers[]. */
+static void
+fetch_regs ()
+{
+ int ret, regno;
+ gregset_t buf;
+
+ ret = ptrace (PTRACE_GETREGS, inferior_pid, 0, (int) &buf);
+ if (ret < 0)
+ {
+ warning ("Couldn't get registers");
+ return;
+ }
+
+ supply_gregset (&buf);
+}
+
+
+/* Set the inferior's general registers to the values in registers[]
+ --- but only those registers marked as valid. */
+static void
+store_regs ()
+{
+ int ret, regno;
+ gregset_t buf;
+
+ ret = ptrace (PTRACE_GETREGS, inferior_pid, 0, (int) &buf);
+ if (ret < 0)
+ {
+ warning ("Couldn't get registers");
+ return;
+ }
+
+ convert_to_gregset (&buf, registers, register_valid);
+
+ ret = ptrace (PTRACE_SETREGS, inferior_pid, 0, (int)buf);
+ if (ret < 0)
+ {
+ warning ("Couldn't write registers");
+ return;
+ }
+}
+
+
+\f
+/* Transfering floating-point registers between GDB, inferiors and cores. */
+
+/* What is the address of st(N) within the fpregset_t structure F? */
+#define FPREGSET_T_FPREG_ADDR(f, n) \
((char *) &(f)->st_space + (n) * 10)
/* Fill GDB's register file with the floating-point register values in
/* Supply the floating-point registers. */
for (i = 0; i < 8; i++)
- supply_register (FP0_REGNUM + i, FPREGSET_T_FPREG_OFFSET (fpregsetp, i));
+ supply_register (FP0_REGNUM + i, FPREGSET_T_FPREG_ADDR (fpregsetp, i));
supply_register (FCTRL_REGNUM, (char *) &fpregsetp->cwd);
supply_register (FSTAT_REGNUM, (char *) &fpregsetp->swd);
/* Fill in the floating-point registers. */
for (i = 0; i < 8; i++)
if (!valid || valid[i])
- memcpy (FPREGSET_T_FPREG_OFFSET (fpregsetp, i),
+ memcpy (FPREGSET_T_FPREG_ADDR (fpregsetp, i),
®isters[REGISTER_BYTE (FP0_REGNUM + i)],
REGISTER_RAW_SIZE(FP0_REGNUM + i));
}
}
+\f
+/* Transfering floating-point and SSE registers to and from GDB. */
-/* Read the general registers from the process, and store them
- in registers[]. */
+
+#ifdef HAVE_PTRACE_GETXFPREGS
static void
-fetch_regs ()
+supply_xfpregset (struct user_xfpregs_struct *xfpregs)
{
- int ret, regno;
- gregset_t buf;
+ int reg;
- ret = ptrace (PTRACE_GETREGS, inferior_pid, 0, (int) &buf);
- if (ret < 0)
+ /* Supply the floating-point registers. */
+ for (reg = 0; reg < 8; reg++)
+ supply_register (FP0_REGNUM + reg, (char *) &xfpregs->st_space[reg]);
+
+ {
+ supply_register (FCTRL_REGNUM, (char *) &xfpregs->cwd);
+ supply_register (FSTAT_REGNUM, (char *) &xfpregs->swd);
+ supply_register (FTAG_REGNUM, (char *) &xfpregs->twd);
+ supply_register (FCOFF_REGNUM, (char *) &xfpregs->fip);
+ supply_register (FDS_REGNUM, (char *) &xfpregs->fos);
+ supply_register (FDOFF_REGNUM, (char *) &xfpregs->foo);
+
+ /* Extract the code segment and opcode from the "fcs" member. */
{
- warning ("Couldn't get registers");
- return;
+ long l;
+
+ l = xfpregs->fcs & 0xffff;
+ supply_register (FCS_REGNUM, (char *) &l);
+
+ l = (xfpregs->fcs >> 16) & ((1 << 11) - 1);
+ supply_register (FOP_REGNUM, (char *) &l);
}
+ }
- supply_gregset (&buf);
+ /* Supply the SSE registers. */
+ for (reg = 0; reg < 8; reg++)
+ supply_register (XMM0_REGNUM + reg, (char *) &xfpregs->xmm_space[reg]);
+ supply_register (MXCSR_REGNUM, (char *) &xfpregs->mxcsr);
}
-/* Set the inferior's general registers to the values in registers[]
- --- but only those registers marked as valid. */
static void
-store_regs ()
+convert_to_xfpregset (struct user_xfpregs_struct *xfpregs,
+ char *gdb_regs,
+ signed char *valid)
{
- int ret, regno;
- gregset_t buf;
+ int reg;
- ret = ptrace (PTRACE_GETREGS, inferior_pid, 0, (int) &buf);
- if (ret < 0)
+ /* Fill in the floating-point registers. */
+ for (reg = 0; reg < 8; reg++)
+ if (!valid || valid[reg])
+ memcpy (&xfpregs->st_space[reg],
+ ®isters[REGISTER_BYTE (FP0_REGNUM + reg)],
+ REGISTER_RAW_SIZE(FP0_REGNUM + reg));
+
+#define fill(MEMBER, REGNO) \
+ if (! valid || valid[(REGNO)]) \
+ memcpy (&xfpregs->MEMBER, ®isters[REGISTER_BYTE (REGNO)], \
+ sizeof (xfpregs->MEMBER))
+
+ fill (cwd, FCTRL_REGNUM);
+ fill (swd, FSTAT_REGNUM);
+ fill (twd, FTAG_REGNUM);
+ fill (fip, FCOFF_REGNUM);
+ fill (foo, FDOFF_REGNUM);
+ fill (fos, FDS_REGNUM);
+
+#undef fill
+
+ if (! valid || valid[FCS_REGNUM])
+ xfpregs->fcs
+ = ((xfpregs->fcs & ~0xffff)
+ | (* (int *) ®isters[REGISTER_BYTE (FCS_REGNUM)] & 0xffff));
+
+ if (! valid || valid[FOP_REGNUM])
+ xfpregs->fcs
+ = ((xfpregs->fcs & 0xffff)
+ | ((*(int *) ®isters[REGISTER_BYTE (FOP_REGNUM)] & ((1 << 11) - 1))
+ << 16));
+
+ /* Fill in the XMM registers. */
+ for (reg = 0; reg < 8; reg++)
+ if (! valid || valid[reg])
+ memcpy (&xfpregs->xmm_space[reg],
+ ®isters[REGISTER_BYTE (XMM0_REGNUM + reg)],
+ REGISTER_RAW_SIZE (XMM0_REGNUM + reg));
+}
+
+
+/* Make a PTRACE_GETXFPREGS request, and supply all the register
+ values that yields to GDB. */
+static int
+fetch_xfpregs ()
+{
+ int ret;
+ struct user_xfpregs_struct xfpregs;
+
+ if (! have_ptrace_getxfpregs)
+ return 0;
+
+ ret = ptrace (PTRACE_GETXFPREGS, inferior_pid, 0, &xfpregs);
+ if (ret == -1)
{
- warning ("Couldn't get registers");
- return;
+ if (errno == EIO)
+ {
+ have_ptrace_getxfpregs = 0;
+ return 0;
+ }
+
+ warning ("couldn't read floating-point and SSE registers.");
+ return 0;
}
- convert_to_gregset (&buf, registers, register_valid);
+ supply_xfpregset (&xfpregs);
+ return 1;
+}
- ret = ptrace (PTRACE_SETREGS, inferior_pid, 0, (int)buf);
- if (ret < 0)
+
+/* Send all the valid register values in GDB's register file covered
+ by the PTRACE_SETXFPREGS request to the inferior. */
+static int
+store_xfpregs ()
+{
+ int ret;
+ struct user_xfpregs_struct xfpregs;
+
+ if (! have_ptrace_getxfpregs)
+ return 0;
+
+ ret = ptrace (PTRACE_GETXFPREGS, inferior_pid, 0, &xfpregs);
+ if (ret == -1)
{
- warning ("Couldn't write registers");
- return;
+ if (errno == EIO)
+ {
+ have_ptrace_getxfpregs = 0;
+ return 0;
+ }
+
+ warning ("couldn't read floating-point and SSE registers.");
+ return 0;
}
+
+ convert_to_xfpregset (&xfpregs, registers, register_valid);
+
+ if (ptrace (PTRACE_SETXFPREGS, inferior_pid, 0, &xfpregs) < 0)
+ {
+ warning ("Couldn't write floating-point and SSE registers.");
+ return 0;
+ }
+
+ return 1;
+}
+
+
+/* Fill the XMM registers in the register file with dummy values. For
+ cases where we don't have access to the XMM registers. I think
+ this is cleaner than printing a warning. For a cleaner solution,
+ we should gdbarchify the i386 family. */
+static void
+dummy_sse_values ()
+{
+ /* C doesn't have a syntax for NaN's, so write it out as an array of
+ longs. */
+ static long dummy[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff };
+ static long mxcsr = 0x1f80;
+ int reg;
+
+ for (reg = 0; reg < 8; reg++)
+ supply_register (XMM0_REGNUM + reg, (char *) dummy);
+ supply_register (MXCSR_REGNUM, (char *) &mxcsr);
}
+#else
+
+/* Stub versions of the above routines, for systems that don't have
+ PTRACE_GETXFPREGS. */
+static int store_xfpregs () { return 0; }
+static int fetch_xfpregs () { return 0; }
+static void dummy_sse_values () {}
+
+#endif
+
+\f
+/* Transferring arbitrary registers between GDB and inferior. */
/* Fetch registers from the child process.
Fetch all if regno == -1, otherwise fetch all ordinary
void
fetch_inferior_registers (int regno)
{
- if (regno < NUM_GREGS || regno == -1)
- fetch_regs ();
+ /* Use the xfpregs requests whenever possible, since they transfer
+ more registers in one system call, and we'll cache the results.
+ But remember that fetch_xfpregs can fail, and return zero. */
+ if (regno == -1)
+ {
+ fetch_regs ();
+ if (fetch_xfpregs ())
+ return;
+ fetch_fpregs ();
+ return;
+ }
+
+ if (GETREGS_SUPPLIES (regno))
+ {
+ fetch_regs ();
+ return;
+ }
+
+ if (GETXFPREGS_SUPPLIES (regno))
+ {
+ if (fetch_xfpregs ())
+ return;
+
+ /* Either our processor or our kernel doesn't support the SSE
+ registers, so read the FP registers in the traditional way,
+ and fill the SSE registers with dummy values. It would be
+ more graceful to handle differences in the register set using
+ gdbarch. Until then, this will at least make things work
+ plausibly. */
+ fetch_fpregs ();
+ dummy_sse_values ();
+ return;
+ }
- if (regno >= NUM_GREGS || regno == -1)
- fetch_fpregs ();
+ internal_error ("i386-linux-nat.c (fetch_inferior_registers): "
+ "got request for bad register number %d", regno);
}
store_inferior_registers (regno)
int regno;
{
- if (regno < NUM_GREGS || regno == -1)
- store_regs ();
+ /* Use the xfpregs requests whenever possible, since they transfer
+ more registers in one system call. But remember that
+ fetch_xfpregs can fail, and return zero. */
+ if (regno == -1)
+ {
+ store_regs ();
+ if (store_xfpregs ())
+ return;
+ store_fpregs ();
+ return;
+ }
- if (regno >= NUM_GREGS || regno == -1)
- store_fpregs ();
+ if (GETREGS_SUPPLIES (regno))
+ {
+ store_regs ();
+ return;
+ }
+
+ if (GETXFPREGS_SUPPLIES (regno))
+ {
+ if (store_xfpregs ())
+ return;
+
+ /* Either our processor or our kernel doesn't support the SSE
+ registers, so just write the FP registers in the traditional way. */
+ store_fpregs ();
+ return;
+ }
+
+ internal_error ("i386-linux-nat.c (store_inferior_registers): "
+ "got request to store bad register number %d", regno);
}
+\f
+/* Calling functions in shared libraries. */
+
/* Find the minimal symbol named NAME, and return both the minsym
struct and its objfile. This probably ought to be in minsym.c, but
everything there is trying to deal with things like C++ and
};
struct linuxthreads_signal linuxthreads_sig_restart = {
- "__pthread_sig_restart", 1, 0, 0, 0
+ "__pthread_sig_restart", 1, 0, 0, 0, 0
};
struct linuxthreads_signal linuxthreads_sig_cancel = {
- "__pthread_sig_cancel", 1, 0, 0, 0
+ "__pthread_sig_cancel", 1, 0, 0, 0, 0
};
struct linuxthreads_signal linuxthreads_sig_debug = {
- "__pthread_sig_debug", 0, 0, 0, 0
+ "__pthread_sig_debug", 0, 0, 0, 0, 0
};
/* A table of breakpoint locations, one per PID. */
else if (WSTOPSIG(status) != SIGSTOP)
wstatus[last++] = status;
else if (stop)
- if (found_trap)
- break;
- else
- found_stop = 1;
+ {
+ if (found_trap)
+ break;
+ else
+ found_stop = 1;
+ }
}
/* Resend any other signals we noticed to the thread, to be received
if (pid != inferior_pid
&& in_thread_list (pid)
&& linuxthreads_thread_alive (pid))
- if (pid == linuxthreads_step_pid)
- child_resume (pid, 1, linuxthreads_step_signo);
- else
- child_resume (pid, 0, TARGET_SIGNAL_0);
+ {
+ if (pid == linuxthreads_step_pid)
+ child_resume (pid, 1, linuxthreads_step_signo);
+ else
+ child_resume (pid, 0, TARGET_SIGNAL_0);
+ }
}
/* Detach a thread */
int pid;
{
if (pid != inferior_pid)
- if (in_thread_list (pid))
- kill (pid, SIGSTOP);
- else if (ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0) == 0)
- {
- if (!linuxthreads_attach_pending)
- printf_unfiltered ("[New %s]\n", target_pid_to_str (pid));
- add_thread (pid);
- if (linuxthreads_sig_debug.signal)
- /* After a new thread in glibc 2.1 signals gdb its existence,
- it suspends itself and wait for linuxthreads_sig_restart,
- now we can wake up it. */
- kill (pid, linuxthreads_sig_restart.signal);
- }
- else
- perror_with_name ("ptrace in stop_thread");
+ {
+ if (in_thread_list (pid))
+ kill (pid, SIGSTOP);
+ else if (ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0) == 0)
+ {
+ if (!linuxthreads_attach_pending)
+ printf_unfiltered ("[New %s]\n", target_pid_to_str (pid));
+ add_thread (pid);
+ if (linuxthreads_sig_debug.signal)
+ /* After a new thread in glibc 2.1 signals gdb its existence,
+ it suspends itself and wait for linuxthreads_sig_restart,
+ now we can wake up it. */
+ kill (pid, linuxthreads_sig_restart.signal);
+ }
+ else
+ perror_with_name ("ptrace in stop_thread");
+ }
}
/* Wait for a thread */
if (rpid > 0)
break;
if (rpid < 0)
- if (errno == EINTR)
- continue;
- else if (save_errno != 0)
- break;
+ {
+ if (errno == EINTR)
+ continue;
+ else if (save_errno != 0)
+ break;
+ }
sigsuspend(&omask);
}
{
/* Skip SIGSTOP signals. */
if (!linuxthreads_pending_status (rpid))
- if (linuxthreads_step_pid == rpid)
- child_resume (rpid, 1, linuxthreads_step_signo);
- else
- child_resume (rpid, 0, TARGET_SIGNAL_0);
+ {
+ if (linuxthreads_step_pid == rpid)
+ child_resume (rpid, 1, linuxthreads_step_signo);
+ else
+ child_resume (rpid, 0, TARGET_SIGNAL_0);
+ }
continue;
}
int num_sections;
/* These pointers are used to locate the section table, which
- among other thigs, is used to map pc addresses into sections.
+ among other things, is used to map pc addresses into sections.
SECTIONS points to the first entry in the table, and
SECTIONS_END points to the first location past the last entry
in the table. Currently the table is stored on the
noinst_LIBRARIES = libangsd.a
-libangsd_a_SOURCES = ardi.c bytesex.c crc.c devsw.c drivers.c etherdrv.c \
- hostchan.c hsys.c logging.c msgbuild.c params.c rx.c \
- serdrv.c serpardr.c tx.c unixcomm.c
+libangsd_a_SOURCES = ardi.c angel_bytesex.c crc.c devsw.c drivers.c etherdrv.c \
+ hostchan.c hsys.c logging.c msgbuild.c params.c rx.c \
+ serdrv.c serpardr.c tx.c unixcomm.c
-noinst_HEADERS = adp.h adperr.h angel.h ardi.h armdbg.h buffers.h bytesex.h \
+noinst_HEADERS = adp.h adperr.h angel.h ardi.h armdbg.h buffers.h \
chandefs.h channels.h chanpriv.h crc.h dbg_conf.h dbg_cp.h \
dbg_hif.h dbg_rdi.h devclnt.h devices.h devsw.h drivers.h \
- endian.h ethernet.h host.h hostchan.h hsys.h logging.h \
- msgbuild.h params.h rxtx.h sys.h unixcomm.h
+ angel_endian.h ethernet.h host.h hostchan.h hsys.h logging.h \
+ msgbuild.h params.h rxtx.h sys.h unixcomm.h angel_bytesex.h
EXTRA_DIST = README.CYGNUS
noinst_LIBRARIES = libangsd.a
-libangsd_a_SOURCES = ardi.c bytesex.c crc.c devsw.c drivers.c etherdrv.c \
- hostchan.c hsys.c logging.c msgbuild.c params.c rx.c \
- serdrv.c serpardr.c tx.c unixcomm.c
+libangsd_a_SOURCES = ardi.c angel_bytesex.c crc.c devsw.c drivers.c etherdrv.c \
+ hostchan.c hsys.c logging.c msgbuild.c params.c rx.c \
+ serdrv.c serpardr.c tx.c unixcomm.c
-noinst_HEADERS = adp.h adperr.h angel.h ardi.h armdbg.h buffers.h bytesex.h \
+noinst_HEADERS = adp.h adperr.h angel.h ardi.h armdbg.h buffers.h \
chandefs.h channels.h chanpriv.h crc.h dbg_conf.h dbg_cp.h \
dbg_hif.h dbg_rdi.h devclnt.h devices.h devsw.h drivers.h \
- endian.h ethernet.h host.h hostchan.h hsys.h logging.h \
- msgbuild.h params.h rxtx.h sys.h unixcomm.h
+ angel_endian.h ethernet.h host.h hostchan.h hsys.h logging.h \
+ msgbuild.h params.h rxtx.h sys.h unixcomm.h angel_bytesex.h
EXTRA_DIST = README.CYGNUS
--- /dev/null
+/*
+ * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
+ *
+ * This software may be freely used, copied, modified, and distributed
+ * provided that the above copyright notice is preserved in all copies of the
+ * software.
+ */
+
+/*
+ * angel_bytesex.c - Code to support byte-sex independence
+ * Copyright: (C) 1991, Advanced RISC Machines Ltd., Cambridge, England.
+ */
+
+/*
+ * RCS $Revision$
+ * Checkin $Date$
+ */
+
+#include "angel_bytesex.h"
+
+static int reversing_bytes = 0;
+
+void bytesex_reverse(yes_or_no)
+int yes_or_no;
+{ reversing_bytes = yes_or_no;
+}
+
+int bytesex_reversing()
+{
+ return reversing_bytes;
+}
+
+int32 bytesex_hostval(v)
+int32 v;
+{ /* Return v with the same endian-ness as the host */
+ /* This mess generates better ARM code than the more obvious mess */
+ /* and may eventually peephole to optimal code... */
+ if (reversing_bytes)
+ { unsigned32 t;
+ /* t = v ^ (v ror 16) */
+ t = v ^ ((v << 16) | (((unsigned32)v) >> 16));
+ t &= ~0xff0000;
+ /* v = v ror 8 */
+ v = (v << 24) | (((unsigned32)v) >> 8);
+ v = v ^ (t >> 8);
+ }
+ return v;
+}
+
+int32 bytesex_hostval_16(v)
+int32 v;
+{
+ if (reversing_bytes) {
+ v = ((v >> 8) & 0xff) | ((v << 8) & 0xff00);
+ }
+ return v;
+}
--- /dev/null
+/*
+ * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
+ *
+ * This software may be freely used, copied, modified, and distributed
+ * provided that the above copyright notice is preserved in all copies of the
+ * software.
+ */
+
+/*
+ Title: Code to support byte-sex independence
+ Copyright: (C) 1991, Advanced RISC Machines Ltd., Cambridge, England.
+*/
+/*
+ * RCS $Revision$
+ * Checkin $Date$
+ */
+
+#ifndef angel_bytesex_h
+#define angel_bytesex_h
+
+#include "host.h"
+
+void bytesex_reverse(int yes_or_no);
+/*
+ * Turn sex-reversal on or off - 0 means off, non-0 means on.
+ */
+
+int bytesex_reversing(void);
+/*
+ * Return non-0 if reversing the byte sex, else 0.
+ */
+
+int32 bytesex_hostval(int32 v);
+/*
+ * Return v or byte-reversed v, according to whether sex-reversval
+ * is on or off.
+ */
+
+int32 bytesex_hostval_16(int32 v);
+/* Return v or byte-reversed v for a 16 bit value */
+
+#endif
--- /dev/null
+/*
+ * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
+ *
+ * This software may be freely used, copied, modified, and distributed
+ * provided that the above copyright notice is preserved in all copies of the
+ * software.
+ */
+
+/* -*-C-*-
+ *
+ * $Revision$
+ * $Date$
+ *
+ *
+ * angel_endian.h - target endianness independent read/write primitives.
+ */
+
+#ifndef angel_endian_h
+#define angel_endian_h
+
+/*
+ * The endianness of the data being processed needs to be known, but
+ * the host endianness is not required (since the data is constructed
+ * using bytes). At the moment these are provided as macros. This
+ * gives the compiler freedom in optimising individual calls. However,
+ * if space is at a premium then functions should be provided.
+ *
+ * NOTE: These macros assume that the data has been packed in the same format
+ * as the packing on the build host. If this is not the case then
+ * the wrong addresses could be used when dealing with structures.
+ *
+ */
+
+/*
+ * For all the following routines the target endianness is defined by the
+ * following boolean definitions.
+ */
+#define BE (1 == 1) /* TRUE : big-endian */
+#define LE (1 == 0) /* FALSE : little-endian */
+
+/*
+ * The following type definitions are used by the endianness converting
+ * macros.
+ */
+typedef unsigned char U8;
+typedef U8 *P_U8;
+typedef const U8 *CP_U8;
+
+typedef unsigned short U16;
+typedef U16 *P_U16;
+
+typedef unsigned int U32;
+typedef U32 *P_U32;
+
+/*
+ * If the endianness of the host and target are known (fixed) and the same
+ * then the following macro definitions can be used. These just directly copy
+ * the data.
+ *
+ * #define READ(e,a) (a)
+ * #define WRITE(e,a,v) ((a) = (v))
+ * #define PREAD(e,a) (a)
+ * #define PWRITE(e,a,v) (*(a) = (v))
+ */
+
+/*
+ * These macros assume that a byte (char) is 8bits in size, and that the
+ * endianness is not important when reading or writing bytes.
+ */
+#define PUT8(a,v) (*((P_U8)(a)) = (U8)(v))
+#define PUT16LE(a,v) (PUT8(a,((v) & 0xFF)), \
+ PUT8((((P_U8)(a)) + sizeof(char)),((v) >> 8)))
+#define PUT16BE(a,v) (PUT8(a,((v) >> 8)), \
+ PUT8((((P_U8)(a)) + sizeof(char)),((v) & 0xFF)))
+#define PUT32LE(a,v) (PUT16LE(a,v), \
+ PUT16LE((((P_U8)(a)) + sizeof(short)),((v) >> 16)))
+#define PUT32BE(a,v) (PUT16BE(a,((v) >> 16)), \
+ PUT16BE((((P_U8)(a)) + sizeof(short)),v))
+
+#define GET8(a) (*((CP_U8)(a)))
+#define GET16LE(a) (GET8(a) | (((U16)GET8(((CP_U8)(a)) + sizeof(char))) << 8))
+#define GET16BE(a) ((((U16)GET8(a)) << 8) | GET8(((CP_U8)(a)) + sizeof(char)))
+#define GET32LE(a) (GET16LE(a) | \
+ (((U32)GET16LE(((CP_U8)(a)) + sizeof(short))) << 16))
+#define GET32BE(a) ((((U32)GET16BE(a)) << 16) | \
+ GET16BE(((CP_U8)(a)) + sizeof(short)))
+
+/*
+ * These macros simplify the code in respect to reading and writing the
+ * correct size data when dealing with endianness. "e" is TRUE if we are
+ * dealing with big-endian data, FALSE if we are dealing with little-endian.
+ */
+
+/* void WRITE(int endianness, void *address, unsigned value); */
+
+#define WRITE16(e,a,v) ((e) ? PUT16BE(&(a),v) : PUT16LE(&(a),v))
+#define WRITE32(e,a,v) ((e) ? PUT32BE(&(a),v) : PUT32LE(&(a),v))
+#define WRITE(e,a,v) ((sizeof(v) == sizeof(char)) ? \
+ PUT8(&(a),v) : ((sizeof(v) == sizeof(short)) ? \
+ WRITE16(e,a,v) : WRITE32(e,a,v)))
+
+/* unsigned READ(int endianness, void *address) */
+#define READ16(e,a) ((e) ? GET16BE(&(a)) : GET16LE(&(a)))
+#define READ32(e,a) ((e) ? GET32BE(&(a)) : GET32LE(&(a)))
+#define READ(e,a) ((sizeof(a) == sizeof(char)) ? \
+ GET8((CP_U8)&(a)) : ((sizeof(a) == sizeof(short)) ? \
+ READ16(e,a) : READ32(e,a)))
+
+/* void PWRITE(int endianness, void *address, unsigned value); */
+#define PWRITE16(e,a,v) ((e) ? PUT16BE(a,v) : PUT16LE(a,v))
+#define PWRITE32(e,a,v) ((e) ? PUT32BE(a,v) : PUT32LE(a,v))
+#define PWRITE(e,a,v) ((sizeof(v) == sizeof(char)) ? \
+ PUT8(a,v) : ((sizeof(v) == sizeof(short)) ? \
+ PWRITE16(e,a,v) : PWRITE32(e,a,v)))
+
+/* unsigned PREAD(int endianness, void *address) */
+#define PREAD16(e,a) ((e) ? GET16BE(a) : GET16LE(a))
+#define PREAD32(e,a) ((e) ? GET32BE(a) : GET32LE(a))
+#define PREAD(e,a) ((sizeof(*(a)) == sizeof(char)) ? \
+ GET8((CP_U8)a) : ((sizeof(*(a)) == sizeof(short)) ? \
+ PREAD16(e,a) : PREAD32(e,a)))
+
+#endif /* !defined(angel_endian_h) */
+
+/* EOF angel_endian.h */
#undef uint
-#include "endian.h"
+#include "angel_endian.h"
#include "ardi.h"
#include "buffers.h"
#include "channels.h"
#include "hostchan.h"
#include "host.h"
-#include "bytesex.h"
+#include "angel_bytesex.h"
#include "dbg_cp.h"
#include "adp.h"
#include "hsys.h"
stopped_info->stopped_status = RDIError_NoError;
break;
default:
- stopped_info->stopped_status = RDIError_NoError;
+ stopped_info->stopped_status = RDIError_Error;
break;
}
return RDIError_NoError;
*/
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "adp.h"
#include "hsys.h"
#include "hostchan.h"
#include "logging.h"
+static char *angelDebugFilename = NULL;
+static FILE *angelDebugLogFile = NULL;
+static int angelDebugLogEnable = 0;
+
+static void openLogFile ()
+{
+ time_t t;
+ struct tm lt;
+
+ if (angelDebugFilename == NULL || *angelDebugFilename =='\0')
+ return;
+
+ angelDebugLogFile = fopen (angelDebugFilename,"a");
+
+ if (!angelDebugLogFile)
+ {
+ fprintf (stderr,"Error opening log file '%s'\n",angelDebugFilename);
+ perror ("fopen");
+ }
+ else
+ setlinebuf (angelDebugLogFile);
+
+ time (&t);
+ fprintf (angelDebugLogFile,"ADP log file opened at %s\n",asctime(localtime(&t)));
+}
+
+
+static void closeLogFile (void)
+{
+ time_t t;
+ struct tm lt;
+
+ if (!angelDebugLogFile)
+ return;
+
+ time (&t);
+ fprintf (angelDebugLogFile,"ADP log file closed at %s\n",asctime(localtime(&t)));
+
+ fclose (angelDebugLogFile);
+ angelDebugLogFile = NULL;
+}
+
+void DevSW_SetLogEnable (int logEnableFlag)
+{
+ if (logEnableFlag && !angelDebugLogFile)
+ openLogFile ();
+ else if (!logEnableFlag && angelDebugLogFile)
+ closeLogFile ();
+
+ angelDebugLogEnable = logEnableFlag;
+}
+
+
+void DevSW_SetLogfile (const char *filename)
+{
+ closeLogFile ();
+
+ if (angelDebugFilename)
+ {
+ free (angelDebugFilename);
+ angelDebugFilename = NULL;
+ }
+
+ if (filename && *filename)
+ {
+ angelDebugFilename = strdup (filename);
+ if (angelDebugLogEnable)
+ openLogFile ();
+ }
+}
+
+
+#define WordAt(p) ((unsigned long) ((p)[0] | ((p)[1]<<8) | ((p)[2]<<16) | ((p)[3]<<24)))
+
+static void dumpPacket(FILE *fp, char *label, struct data_packet *p)
+{
+ unsigned r;
+ int i;
+
+ if (!fp)
+ return;
+
+ fprintf(fp,"%s [T=%d L=%d] ",label,p->type,p->len);
+ for (i=0; i<p->len; ++i)
+ fprintf(fp,"%02x ",p->data[i]);
+ fprintf(fp,"\n");
+
+ r = WordAt(p->data+4);
+
+ fprintf(fp,"R=%08x ",r);
+ fprintf(fp,"%s ", r&0x80000000 ? "H<-T" : "H->T");
+
+ switch ((r>>16) & 0xff)
+ {
+ case CI_PRIVATE: fprintf(fp,"CI_PRIVATE: "); break;
+ case CI_HADP: fprintf(fp,"CI_HADP: "); break;
+ case CI_TADP: fprintf(fp,"CI_TADP: "); break;
+ case CI_HBOOT: fprintf(fp,"CI_HBOOT: "); break;
+ case CI_TBOOT: fprintf(fp,"CI_TBOOT: "); break;
+ case CI_CLIB: fprintf(fp,"CI_CLIB: "); break;
+ case CI_HUDBG: fprintf(fp,"CI_HUDBG: "); break;
+ case CI_TUDBG: fprintf(fp,"CI_TUDBG: "); break;
+ case CI_HTDCC: fprintf(fp,"CI_HTDCC: "); break;
+ case CI_TTDCC: fprintf(fp,"CI_TTDCC: "); break;
+ case CI_TLOG: fprintf(fp,"CI_TLOG: "); break;
+ default: fprintf(fp,"BadChan: "); break;
+ }
+
+ switch (r & 0xffffff)
+ {
+ case ADP_Booted: fprintf(fp," ADP_Booted "); break;
+#if defined(ADP_TargetResetIndication)
+ case ADP_TargetResetIndication: fprintf(fp," ADP_TargetResetIndication "); break;
+#endif
+ case ADP_Reboot: fprintf(fp," ADP_Reboot "); break;
+ case ADP_Reset: fprintf(fp," ADP_Reset "); break;
+#if defined(ADP_HostResetIndication)
+ case ADP_HostResetIndication: fprintf(fp," ADP_HostResetIndication "); break;
+#endif
+ case ADP_ParamNegotiate: fprintf(fp," ADP_ParamNegotiate "); break;
+ case ADP_LinkCheck: fprintf(fp," ADP_LinkCheck "); break;
+ case ADP_HADPUnrecognised: fprintf(fp," ADP_HADPUnrecognised "); break;
+ case ADP_Info: fprintf(fp," ADP_Info "); break;
+ case ADP_Control: fprintf(fp," ADP_Control "); break;
+ case ADP_Read: fprintf(fp," ADP_Read "); break;
+ case ADP_Write: fprintf(fp," ADP_Write "); break;
+ case ADP_CPUread: fprintf(fp," ADP_CPUread "); break;
+ case ADP_CPUwrite: fprintf(fp," ADP_CPUwrite "); break;
+ case ADP_CPread: fprintf(fp," ADP_CPread "); break;
+ case ADP_CPwrite: fprintf(fp," ADP_CPwrite "); break;
+ case ADP_SetBreak: fprintf(fp," ADP_SetBreak "); break;
+ case ADP_ClearBreak: fprintf(fp," ADP_ClearBreak "); break;
+ case ADP_SetWatch: fprintf(fp," ADP_SetWatch "); break;
+ case ADP_ClearWatch: fprintf(fp," ADP_ClearWatch "); break;
+ case ADP_Execute: fprintf(fp," ADP_Execute "); break;
+ case ADP_Step: fprintf(fp," ADP_Step "); break;
+ case ADP_InterruptRequest: fprintf(fp," ADP_InterruptRequest "); break;
+ case ADP_HW_Emulation: fprintf(fp," ADP_HW_Emulation "); break;
+ case ADP_ICEbreakerHADP: fprintf(fp," ADP_ICEbreakerHADP "); break;
+ case ADP_ICEman: fprintf(fp," ADP_ICEman "); break;
+ case ADP_Profile: fprintf(fp," ADP_Profile "); break;
+ case ADP_InitialiseApplication: fprintf(fp," ADP_InitialiseApplication "); break;
+ case ADP_End: fprintf(fp," ADP_End "); break;
+ case ADP_TADPUnrecognised: fprintf(fp," ADP_TADPUnrecognised "); break;
+ case ADP_Stopped: fprintf(fp," ADP_Stopped "); break;
+ case ADP_TDCC_ToHost: fprintf(fp," ADP_TDCC_ToHost "); break;
+ case ADP_TDCC_FromHost: fprintf(fp," ADP_TDCC_FromHost "); break;
+ default: fprintf(fp," BadReason "); break;
+ }
+
+ i = 20;
+
+ if (((r & 0xffffff) == ADP_CPUread ||
+ (r & 0xffffff) == ADP_CPUwrite) && (r&0x80000000)==0)
+ {
+ fprintf(fp,"%02x ", p->data[i]);
+ ++i;
+ }
+
+ for (; i<p->len; i+=4)
+ fprintf(fp,"%08x ",WordAt(p->data+i));
+
+ fprintf(fp,"\n");
+}
+
+
/*
* TODO: this should be adjustable - it could be done by defining
* a reason code for DevSW_Ioctl. It could even be a
#ifdef RET_DEBUG
printf("got a complete packet\n");
#endif
+
+ if (angelDebugLogEnable)
+ dumpPacket(angelDebugLogFile,"rx:",&ds->ds_activeread.dc_packet);
+
enqueue_packet(ds);
*packet = Adp_removeFromQueue(&ds->ds_readqueue[type]);
return adp_ok;
* we can take this packet - set things up, then try to get rid of it
*/
initialise_write(dc, packet, type);
+
+ if (angelDebugLogEnable)
+ dumpPacket(angelDebugLogFile,"tx:",&dc->dc_packet);
+
flush_packet(device, dc);
return adp_ok;
*/
bool DevSW_WriteFinished(const DeviceDescr *device);
+
+/*
+ * set filename and enable/disable logginf of ADP packets
+ */
+void DevSW_SetLogfile(const char *filename);
+void DevSW_SetLogEnable(int logEnableFlag);
+
#ifdef __cplusplus
}
#endif
#include "hsys.h"
#include "devices.h"
-#include "endian.h"
+#include "angel_endian.h"
#include "buffers.h"
#include "hostchan.h"
#include "params.h"
* port on the remote target
*/
ia->sin_port = htons(CTRL_PORT);
+#ifdef DEBUG
+ printf("CTLR_PORT=0x%04x sin_port=0x%04x\n");
+#endif
+
if (sendto(sock, ctrlpacket, sizeof(ctrlpacket), 0,
(struct sockaddr *)ia, sizeof(*ia)) < 0)
{
*/
ASSERT(&(((Packet *)0)->pk_next) == 0, "bad struct Packet layout");
-#if DEBUG && 0
+#if defined(DEBUG) && 0
printf("Adp_addToQueue(%p, %p)\n", head, newpkt);
#endif
return pk;
}
+void Adp_SetLogEnable(int logEnableFlag)
+{
+ DevSW_SetLogEnable(logEnableFlag);
+}
+
+void Adp_SetLogfile(const char *filename)
+{
+ DevSW_SetLogfile(filename);
+}
+
AdpErrs Adp_OpenDevice(const char *name, const char *arg,
unsigned int heartbeat_on)
{
extern Packet *Adp_removeFromQueue(Packet **head);
+/*
+ * Set log file and Enable/disable logging of ADP packets to file.
+ */
+
+void Adp_SetLogfile(const char *filename);
+void Adp_SetLogEnable(int logEnableFlag);
+
/*
* Function: Adp_OpenDevice
* Purpose: Open a device to use for channels communication. This is a
#include "ardi.h"
#include "buffers.h"
#include "channels.h" /* Channel interface. */
-#include "endian.h"
+#include "angel_endian.h"
#include "logging.h" /* Angel support functions. */
#include "msgbuild.h"
#include "sys.h"
#include "channels.h"
#include "buffers.h"
-#include "endian.h" /* Endianness support macros */
+#include "angel_endian.h" /* Endianness support macros */
#include "msgbuild.h" /* Header file for this source code */
#ifndef UNUSED
#include "params.h"
-#include "endian.h"
+#include "angel_endian.h"
#include "logging.h"
#include <stdarg.h> /* ANSI varargs support */
#include "angel.h" /* Angel system definitions */
-#include "endian.h" /* Endian independant memory access macros */
+#include "angel_endian.h" /* Endian independant memory access macros */
#include "crc.h" /* crc generation definitions and headers */
#include "rxtx.h"
#include "channels.h"
#include <stdarg.h> /* ANSI varargs support */
#include "angel.h" /* Angel system definitions */
-#include "endian.h" /* Endian independant memory access macros */
+#include "angel_endian.h" /* Endian independant memory access macros */
#include "crc.h" /* crc generation definitions and headers */
#include "rxtx.h"
#include "channels.h"
return -1;
}
else if (err > 0 && FD_ISSET(serpfd, &fdset))
- return read(serpfd, buf, n);
+ {
+ int s;
+
+ s = read(serpfd, buf, n);
+ if (s < 0)
+ perror("read:");
+ return s;
+ }
else /* err == 0 || FD_CLR(serpfd, &fdset) */
{
errno = ERRNO_FOR_BLOCKED_IO;
static int execute_status;
+/* Send heatbeat packets? */
+static int rdi_heartbeat = 0;
+
+/* Target has ROM at address 0. */
+static int rom_at_zero = 0;
+
+/* Enable logging? */
+static int log_enable = 0;
+
+/* Name of the log file. Default is "rdi.log". */
+static char *log_filename;
+
/* A little list of breakpoints that have been set. */
static struct local_bp_list_entry
{
int rslt, i;
unsigned long arg1, arg2;
+ char *openArgs = NULL;
+ char *devName = NULL;
+ char *p;
if (name == NULL)
error ("To open an RDI connection, you need to specify what serial\n\
device is attached to the remote system (e.g. /dev/ttya).");
+ /* split name after whitespace, pass tail as arg to open command */
+
+ devName = strdup(name);
+ p = strchr(devName,' ');
+ if (p)
+ {
+ *p = '\0';
+ ++p;
+
+ while (*p == ' ')
+ ++p;
+
+ openArgs = p;
+ }
+
/* Make the basic low-level connection. */
- rslt = Adp_OpenDevice (name, NULL, 1);
+ Adp_CloseDevice ();
+ rslt = Adp_OpenDevice (devName, openArgs, rdi_heartbeat);
if (rslt != adp_ok)
error ("Could not open device \"%s\"", name);
printf_filtered ("RDI_open: %s\n", rdi_error_message (rslt));
}
- arg1 = 0x13b;
+ arg1 = rom_at_zero ? 0x0 : 0x13b;
+
rslt = angel_RDI_info (RDIVector_Catch, &arg1, &arg2);
if (rslt)
{
arm_rdi_ops.to_magic = OPS_MAGIC;
}
+static void rdilogfile_command (char *arg, int from_tty)
+{
+ if (!arg || strlen (arg) == 0)
+ {
+ printf_filtered ("rdi log file is '%s'\n", log_filename);
+ return;
+ }
+
+ if (log_filename)
+ free (log_filename);
+
+ log_filename = strdup (arg);
+
+ Adp_SetLogfile (log_filename);
+}
+
+static void rdilogenable_command (char *args, int from_tty)
+{
+ if (!args || strlen (args) == 0)
+ {
+ printf_filtered ("rdi log is %s\n", log_enable ? "enabled" : "disabled");
+ return;
+ }
+
+ if (!strcasecmp (args,"1") ||
+ !strcasecmp (args,"y") ||
+ !strcasecmp (args,"yes") ||
+ !strcasecmp (args,"on") ||
+ !strcasecmp (args,"t") ||
+ !strcasecmp (args,"true"))
+ Adp_SetLogEnable (log_enable=1);
+ else if (!strcasecmp (args,"0") ||
+ !strcasecmp (args,"n") ||
+ !strcasecmp (args,"no") ||
+ !strcasecmp (args,"off") ||
+ !strcasecmp (args,"f") ||
+ !strcasecmp (args,"false"))
+ Adp_SetLogEnable (log_enable=0);
+ else
+ printf_filtered ("rdilogenable: unrecognized argument '%s'\n"
+ " try y or n\n",args);
+}
+
void
_initialize_remote_rdi ()
{
init_rdi_ops ();
add_target (&arm_rdi_ops);
+
+ log_filename = strdup("rdi.log");
+ Adp_SetLogfile(log_filename);
+ Adp_SetLogEnable(log_enable);
+
+ add_cmd ("rdilogfile", class_maintenance,
+ rdilogfile_command,
+ "Set filename for ADP packet log.\n\
+This file is used to log Angel Debugger Protocol packets.\n\
+With a single argument, sets the logfile name to that value.\n\
+Without an argument, shows the current logfile name.\n\
+See also: rdilogenable\n",
+ &maintenancelist);
+
+ add_cmd("rdilogenable", class_maintenance,
+ rdilogenable_command,
+ "Set enable logging of ADP packets.\n\
+This will log ADP packets exchanged between gdb and the\n\
+rdi target device.\n\
+An argument of 1,t,true,y,yes will enable.\n\
+An argument of 0,f,false,n,no will disabled.\n\
+Withough an argument, it will display current state.\n",
+ &maintenancelist);
+
+ add_show_from_set
+ (add_set_cmd ("rdiromatzero", no_class,
+ var_boolean, (char *) &rom_at_zero,
+ "Set target has ROM at addr 0.\n\
+A true value disables vector catching, false enables vector catching.\n\
+This is evaluated at the time the 'target rdi' command is executed\n",
+ &setlist),
+ &showlist);
+
+ add_show_from_set
+ (add_set_cmd ("rdiheartbeat", no_class,
+ var_boolean, (char *) &rdi_heartbeat,
+ "Set enable for ADP heartbeat packets.\n\
+I don't know why you would want this. If you enable them,\n\
+it will confuse ARM and EPI JTAG interface boxes as well\n\
+as the Angel Monitor.\n",
+ &setlist),
+ &showlist);
}
/* A little dummy to make linking with the library succeed. */
+1999-11-01 Stan Shebs <shebs@andros.cygnus.com>
+
+ From Jimmy Guo <guo@cup.hp.com>:
+ * gdb.base/annota1.exp: Add tests for annotate ignore count change.
+ * gdb.base/annota1.c: Add code for tests to work with.
+
+1999-10-26 Frank Ch. Eigler <fche@cygnus.com>
+
+ * gdb.base/remote.exp: New test for remote downloading settings.
+ * gdb.base/remote.c: New file with large .data.
+
1999-10-18 Jim Blandy <jimb@zwingli.cygnus.com>
* gdb.threads/linux-dp.c, gdb.threads/linux-dp.exp: New test suite
printf ("value is %d\n", value);
printf ("my_array[2] is %d\n", my_array[2]);
+
+ {
+ int i;
+ for (i = 0; i < 5; i++)
+ value++;
+ }
return 0;
}
timeout { fail "re-run (timeout)" }
}
+#
+# Test that breakpoints-invalid is issued once and only once for
+# breakpoint ignore count changes, after annotation stopped.
+#
+send_gdb "break 46\n"
+gdb_expect {
+ -re "Breakpoint 5 at $hex: file .*$srcfile, line 46.*$gdb_prompt$" {
+ pass "break at 46"
+ }
+ -re ".*$gdb_prompt$" { fail "break at 46" }
+ timeout { fail "break at 46 (timeout)" }
+}
+
+send_gdb "ignore 5 4\n"
+gdb_expect {
+ -re "Will ignore next 4 crossings of breakpoint 5.*$gdb_prompt$" {
+ pass "ignore 5 4"
+ }
+ -re ".*$gdb_prompt$" { fail "ignore 5 4" }
+ timeout { fail "ignore 5 4 (timeout)" }
+}
+
+send_gdb "continue\n"
+gdb_expect {
+ -re ".*$srcfile:46:.*\032\032stopped\r\n\r\n\032\032breakpoints-invalid\r\n$gdb_prompt$" {
+ pass "annotate ignore count change"
+ }
+ -re ".*$gdb_prompt$" { fail "annotate ignore count change" }
+ timeout { fail "annotate ignore count change (timeout)" }
+}
+
+# check that ignore command is working, or the above can provide
+# misleading assurance ...
+
+send_gdb "next\n"
+gdb_expect {
+ -re "$gdb_prompt$" {}
+ timeout { fail "next to exit loop" }
+}
+
+send_gdb "next\n"
+gdb_expect {
+ -re ".*$srcfile:49:.*$gdb_prompt$" {
+ pass "breakpoint ignore count"
+ }
+ -re ".*$gdb_prompt$" { fail "breakpoint ignore count" }
+ timeout { fail "breakpoint ignore count (timeout)" }
+}
#
# Send a signal that is not handled; test:
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+/**************************************************************************
+ * TESTS :
+ * -- downloading of a rather large executable
+ ***************************************************************************/
+
+
+/* A large array in .data. If RLE compression becomes available during
+ downloads, this would have to become a bunch of real random data.
+ Here's a quick way of generating such a bunch:
+
+yes | awk '{printf ("%4d,", rand()*1000);}' | fold -w80 -s | head -4096
+
+*/
+
+unsigned long random_data[65536] = { 1 };
+
+int
+main()
+{
+ printf ("%lu\n", random_data [rand() %
+ (sizeof (random_data) /
+ sizeof (random_data [0]))]);
+}
--- /dev/null
+# Copyright (C) 1999 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+set prms_id 0
+set bug_id 0
+
+
+# test only on a remote target board
+if {! [is_remote target]} {
+ return
+}
+
+
+set testfile "remote"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+
+proc gdb_load_timed {executable writesize} {
+ global test gdb_prompt
+ set test "timed download `[file tail $executable]' ($writesize)"
+
+ if {$writesize != ""} then {
+ send_gdb "set remotewritesize $writesize\n"
+ gdb_expect 5 {
+ -re ".*$gdb_prompt $" { }
+ timeout { fail "$test - setting remotewritesize" ; return }
+ }
+ }
+
+ set load_begin_time [clock clicks]
+ set result [gdb_load $executable]
+ set load_end_time [clock clicks]
+ if {$result < 0} then { fail "$test - loading executable"; return }
+ verbose "$test - time [expr ($load_end_time - $load_begin_time) / 1000] ms"
+ pass $test
+}
+
+
+
+# tests
+
+gdb_start
+
+set result [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}]
+if {$result != "" } then {
+ gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+gdb_load_timed $binfile {}
+gdb_load_timed $binfile 50
+gdb_load_timed $binfile 100
+gdb_load_timed $binfile 200
+gdb_load_timed $binfile 400
+
+# extra tests for capable targets
+if {[target_info gdb,big_rx_buffers] != ""} then {
+ gdb_load_timed $binfile 800
+ gdb_load_timed $binfile 8000
+ gdb_load_timed $binfile 80000
+}
+
+gdb_exit
{
struct tracepoint *t2;
+ if (t == NULL) /* no tracepoint operand */
+ return;
+
switch (opcode)
{
case enable_op:
}
}
-/* Utility: parse a tracepoint number and look it up in the list. */
+/* Utility: parse a tracepoint number and look it up in the list.
+ If MULTI_P is true, there might be a range of tracepoints in ARG. */
struct tracepoint *
-get_tracepoint_by_number (arg)
+get_tracepoint_by_number (arg, multi_p)
char **arg;
+ int multi_p;
{
struct tracepoint *t;
- char *end, *copy;
- value_ptr val;
+ char *instring = *arg;
int tpnum;
- if (arg == 0)
- error ("Bad tracepoint argument");
+ if (arg == NULL)
+ error_no_arg ("tracepoint number");
- if (*arg == 0 || **arg == 0) /* empty arg means refer to last tp */
- tpnum = tracepoint_count;
- else if (**arg == '$') /* handle convenience variable */
- {
- /* Make a copy of the name, so we can null-terminate it
- to pass to lookup_internalvar(). */
- end = *arg + 1;
- while (isalnum ((int) *end) || *end == '_')
- end++;
- copy = (char *) alloca (end - *arg);
- strncpy (copy, *arg + 1, (end - *arg - 1));
- copy[end - *arg - 1] = '\0';
- *arg = end;
-
- val = value_of_internalvar (lookup_internalvar (copy));
- if (TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_INT)
- error ("Convenience variable must have integral type.");
- tpnum = (int) value_as_long (val);
- }
- else
- /* handle tracepoint number */
+ tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
+ if (tpnum <= 0)
{
- tpnum = strtol (*arg, arg, 0);
- if (tpnum == 0) /* possible strtol failure */
- while (**arg && !isspace ((int) **arg))
- (*arg)++; /* advance to next white space, if any */
+ printf_filtered ("bad tracepoint number at or near '%s'\n", instring);
+ return NULL;
}
+
ALL_TRACEPOINTS (t)
if (t->number == tpnum)
{
return t;
}
+
+ /* FIXME: if we are in the middle of a range we don't want to give
+ a message. The current interface to get_number_or_range doesn't
+ allow us to discover this. */
printf_unfiltered ("No tracepoint number %d.\n", tpnum);
return NULL;
}
while (*args)
{
QUIT; /* give user option to bail out with ^C */
- t = get_tracepoint_by_number (&args);
- if (t)
- tracepoint_operation (t, from_tty, opcode);
+ t = get_tracepoint_by_number (&args, 1);
+ tracepoint_operation (t, from_tty, opcode);
while (*args == ' ' || *args == '\t')
args++;
}
{
struct tracepoint *t1 = (struct tracepoint *) -1, *t2;
unsigned int count;
+ int all = 0;
if (args == 0 || *args == 0)
error ("PASS command requires an argument (count + optional TP num)");
args++;
if (*args && strncasecmp (args, "all", 3) == 0)
- args += 3; /* skip special argument "all" */
+ {
+ args += 3; /* skip special argument "all" */
+ all = 1;
+ if (*args)
+ error ("Junk at end of arguments.");
+ }
else
- t1 = get_tracepoint_by_number (&args);
+ t1 = get_tracepoint_by_number (&args, 1);
- if (*args)
- error ("Junk at end of arguments.");
-
- if (t1 == NULL)
- return; /* error, bad tracepoint number */
-
- ALL_TRACEPOINTS (t2)
- if (t1 == (struct tracepoint *) -1 || t1 == t2)
+ do
{
- t2->pass_count = count;
- if (modify_tracepoint_hook)
- modify_tracepoint_hook (t2);
- if (from_tty)
- printf_filtered ("Setting tracepoint %d's passcount to %d\n",
- t2->number, count);
+ if (t1)
+ {
+ ALL_TRACEPOINTS (t2)
+ if (t1 == (struct tracepoint *) -1 || t1 == t2)
+ {
+ t2->pass_count = count;
+ if (modify_tracepoint_hook)
+ modify_tracepoint_hook (t2);
+ if (from_tty)
+ printf_filtered ("Setting tracepoint %d's passcount to %d\n",
+ t2->number, count);
+ }
+ }
+ if (! all)
+ t1 = get_tracepoint_by_number (&args, 1);
}
+ while (*args);
}
/* ACTIONS functions: */
char tmpbuf[128];
char *end_msg = "End with a line saying just \"end\".";
- t = get_tracepoint_by_number (&args);
+ t = get_tracepoint_by_number (&args, 0);
if (t)
{
sprintf (tmpbuf, "Enter actions for tracepoint %d, one per line.",
if (readline_end_hook)
(*readline_end_hook) ();
-
/* tracepoints_changed () */
}
- /* else error, just return; */
+ /* else just return */
}
/* worker function */
/* Data structures associated with tracepoints in GDB.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1999 Free Software Foundation, Inc.
This file is part of GDB.
void (*trace_find_hook) PARAMS ((char *arg, int from_tty));
void (*trace_start_stop_hook) PARAMS ((int start, int from_tty));
-struct tracepoint *get_tracepoint_by_number PARAMS ((char **));
+struct tracepoint *get_tracepoint_by_number PARAMS ((char **, int));
int get_traceframe_number PARAMS ((void));
void free_actions PARAMS ((struct tracepoint *));
enum actionline_type validate_actionline PARAMS ((char **,
+1999-10-27 Nick Clifton <nickc@cygnus.com>
+
+ * thumbemu.c (ARMul_ThumbDecode): Accept 0xbebe as a thumb
+ breakpoint.
+
1999-10-08 Ulrich Drepper <drepper@cygnus.com>
* armos.c (SWIopen): Always pass third parameter with 0666 since
: 0xE28DDF00) /* ADD */
| (tinstr & 0x007F); /* off7 */
}
+ else if ((tinstr & 0x0F00) == 0x0e00)
+ * ainstr = 0xEF000000 | SWI_Breakpoint;
else
{
/* Format 14 */
+Mon Oct 18 18:03:24 MDT 1999 Diego Novillo <dnovillo@cygnus.com>
+
+ * simops.c (OP_3220): Fix trace output for illegal accumulator
+ message.
+
1999-09-14 Nick Clifton <nickc@cygnus.com>
* simops.c: Disable setting of DM bit in PSW.
trace_input ("slae", OP_ACCUM, OP_REG, OP_VOID);
- reg = SEXT16( GPR (OP[1]));
+ reg = SEXT16 (GPR (OP[1]));
if (reg >= 17 || reg <= -17)
{
if (PSW_ST && (tmp < SEXT40 (MIN32) || tmp > SEXT40 (MAX32)))
{
- (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: value to shift 0x%x out of range.\n", tmp);
+ (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: accumulator value 0x%.2x%.8lx out of range\n", ((int)(tmp >> 32) & 0xff), ((unsigned long) tmp) & 0xffffffff);
State.exception = SIGILL;
return;
}