+2015-11-19 Pedro Alves <palves@redhat.com>
+
+ * linux-low.c (linux_process_qsupported): Change prototype.
+ Adjust.
+ * linux-low.h (struct linux_target_ops) <process_qsupported>:
+ Change prototype.
+ * linux-x86-low.c (x86_linux_process_qsupported): Change prototype
+ and adjust to loop over all features.
+ * server.c (handle_query) <qSupported>: Adjust to call
+ target_process_qsupported once, passing it a vector of unprocessed
+ features.
+ * target.h (struct target_ops) <process_qsupported>: Change
+ prototype.
+ (target_process_qsupported): Adjust.
+
2015-11-19 Pedro Alves <palves@redhat.com>
* configure.ac (ERROR_ON_WARNING): Don't check whether in C++
#endif /* defined PT_GETDSBT || defined PTRACE_GETFDPIC */
static void
-linux_process_qsupported (const char *query)
+linux_process_qsupported (char **features, int count)
{
if (the_low_target.process_qsupported != NULL)
- the_low_target.process_qsupported (query);
+ the_low_target.process_qsupported (features, count);
}
static int
void (*prepare_to_resume) (struct lwp_info *);
/* Hook to support target specific qSupported. */
- void (*process_qsupported) (const char *);
+ void (*process_qsupported) (char **, int count);
/* Returns true if the low target supports tracepoints. */
int (*supports_tracepoints) (void);
PTRACE_GETREGSET. */
static void
-x86_linux_process_qsupported (const char *query)
+x86_linux_process_qsupported (char **features, int count)
{
+ int i;
+
/* Return if gdb doesn't support XML. If gdb sends "xmlRegisters="
with "i386" in qSupported query, it supports x86 XML target
descriptions. */
use_xml = 0;
- if (query != NULL && startswith (query, "xmlRegisters="))
+ for (i = 0; i < count; i++)
{
- char *copy = xstrdup (query + 13);
- char *p;
+ const char *feature = features[i];
- for (p = strtok (copy, ","); p != NULL; p = strtok (NULL, ","))
+ if (startswith (feature, "xmlRegisters="))
{
- if (strcmp (p, "i386") == 0)
+ char *copy = xstrdup (feature + 13);
+ char *p;
+
+ for (p = strtok (copy, ","); p != NULL; p = strtok (NULL, ","))
{
- use_xml = 1;
- break;
+ if (strcmp (p, "i386") == 0)
+ {
+ use_xml = 1;
+ break;
+ }
}
- }
- free (copy);
+ free (copy);
+ }
}
-
x86_linux_update_xmltarget ();
}
char *p = &own_buf[10];
int gdb_supports_qRelocInsn = 0;
- /* Start processing qSupported packet. */
- target_process_qsupported (NULL);
-
/* Process each feature being provided by GDB. The first
feature will follow a ':', and latter features will follow
';'. */
{
char **qsupported = NULL;
int count = 0;
+ int unknown = 0;
int i;
/* Two passes, to avoid nested strtok calls in
else if (strcmp (p, "vContSupported+") == 0)
vCont_supported = 1;
else
- target_process_qsupported (p);
-
- free (p);
+ {
+ /* Move the unknown features all together. */
+ qsupported[i] = NULL;
+ qsupported[unknown] = p;
+ unknown++;
+ }
}
+ /* Give the target backend a chance to process the unknown
+ features. */
+ target_process_qsupported (qsupported, unknown);
+
+ for (i = 0; i < count; i++)
+ free (qsupported[i]);
free (qsupported);
}
int (*read_loadmap) (const char *annex, CORE_ADDR offset,
unsigned char *myaddr, unsigned int len);
- /* Target specific qSupported support. */
- void (*process_qsupported) (const char *);
+ /* Target specific qSupported support. FEATURES is an array of
+ features with COUNT elements. */
+ void (*process_qsupported) (char **features, int count);
/* Return 1 if the target supports tracepoints, 0 (or leave the
callback NULL) otherwise. */
(the_target->supports_multi_process ? \
(*the_target->supports_multi_process) () : 0)
-#define target_process_qsupported(query) \
+#define target_process_qsupported(features, count) \
do \
{ \
if (the_target->process_qsupported) \
- the_target->process_qsupported (query); \
+ the_target->process_qsupported (features, count); \
} while (0)
#define target_supports_tracepoints() \