/* Target description definitions for remote server for GDB.
- Copyright (C) 2012-2017 Free Software Foundation, Inc.
+ Copyright (C) 2012-2018 Free Software Foundation, Inc.
This file is part of GDB.
#ifndef TDESC_H
#define TDESC_H
-#include "arch/tdesc.h"
+#include "common/tdesc.h"
#include "regdef.h"
-
-typedef struct reg *tdesc_reg_p;
-DEF_VEC_P(tdesc_reg_p);
-
-struct tdesc_feature
-{};
+#include <vector>
/* A target description. Inherit from tdesc_feature so that target_desc
can be used as tdesc_feature. */
-struct target_desc : tdesc_feature
+struct target_desc : tdesc_element
{
/* A vector of elements of register definitions that
describe the inferior's register set. */
- VEC(tdesc_reg_p) *reg_defs;
+ std::vector<struct reg> reg_defs;
/* The register cache size, in bytes. */
int registers_size;
+ /* XML features in this target description. */
+ std::vector<tdesc_feature_up> features;
+
#ifndef IN_PROCESS_AGENT
/* An array of register names. These are the "expedite" registers:
registers whose values are sent along with stop replies. */
/* Defines what to return when looking for the "target.xml" file in
response to qXfer:features:read. Its contents can either be
verbatim XML code (prefixed with a '@') or else the name of the
- actual XML file to be used in place of "target.xml". */
- const char *xmltarget = NULL;
+ actual XML file to be used in place of "target.xml".
+
+ If NULL then its content will be generated by parsing the target
+ description into xml. */
+ mutable const char *xmltarget = NULL;
+
+ /* The value of <architecture> element in the XML, replying GDB. */
+ const char *arch = NULL;
+
+ /* The value of <osabi> element in the XML, replying GDB. */
+ const char *osabi = NULL;
public:
target_desc ()
- : reg_defs (NULL), registers_size (0)
+ : registers_size (0)
{}
- ~target_desc ()
- {
- int i;
- struct reg *reg;
-
- for (i = 0; VEC_iterate (tdesc_reg_p, reg_defs, i, reg); i++)
- xfree (reg);
- VEC_free (tdesc_reg_p, reg_defs);
- }
+ ~target_desc ();
- bool operator== (const target_desc &other) const
- {
- if (VEC_length (tdesc_reg_p, reg_defs)
- != VEC_length (tdesc_reg_p, other.reg_defs))
- return false;
-
- struct reg *reg;
-
- for (int ix = 0;
- VEC_iterate (tdesc_reg_p, reg_defs, ix, reg);
- ix++)
- {
- struct reg *reg2
- = VEC_index (tdesc_reg_p, other.reg_defs, ix);
-
- if (reg != reg2 && *reg != *reg2)
- return false;
- }
-
- /* Compare expedite_regs. */
- int i = 0;
- for (; expedite_regs[i] != NULL; i++)
- {
- if (strcmp (expedite_regs[i], other.expedite_regs[i]) != 0)
- return false;
- }
- if (other.expedite_regs[i] != NULL)
- return false;
-
- if (strcmp (xmltarget, other.xmltarget) != 0)
- return false;
-
- return true;
- }
+ bool operator== (const target_desc &other) const;
bool operator!= (const target_desc &other) const
{
return !(*this == other);
}
#endif
+
+ void accept (tdesc_element_visitor &v) const override;
};
/* Copy target description SRC to DEST. */
void copy_target_description (struct target_desc *dest,
const struct target_desc *src);
-/* Initialize TDESC. */
+/* Initialize TDESC, and then set its expedite_regs field to
+ EXPEDITE_REGS. */
-void init_target_desc (struct target_desc *tdesc);
+void init_target_desc (struct target_desc *tdesc,
+ const char **expedite_regs);
/* Return the current inferior's target description. Never returns
NULL. */