|
@@ -422,6 +422,71 @@ static const char *get_feature_xml(const char *p, const char **newp,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+void gdb_feature_builder_init(GDBFeatureBuilder *builder, GDBFeature *feature,
|
|
|
+ const char *name, const char *xmlname,
|
|
|
+ int base_reg)
|
|
|
+{
|
|
|
+ char *header = g_markup_printf_escaped(
|
|
|
+ "<?xml version=\"1.0\"?>"
|
|
|
+ "<!DOCTYPE feature SYSTEM \"gdb-target.dtd\">"
|
|
|
+ "<feature name=\"%s\">",
|
|
|
+ name);
|
|
|
+
|
|
|
+ builder->feature = feature;
|
|
|
+ builder->xml = g_ptr_array_new();
|
|
|
+ g_ptr_array_add(builder->xml, header);
|
|
|
+ builder->base_reg = base_reg;
|
|
|
+ feature->xmlname = xmlname;
|
|
|
+ feature->num_regs = 0;
|
|
|
+}
|
|
|
+
|
|
|
+void gdb_feature_builder_append_tag(const GDBFeatureBuilder *builder,
|
|
|
+ const char *format, ...)
|
|
|
+{
|
|
|
+ va_list ap;
|
|
|
+ va_start(ap, format);
|
|
|
+ g_ptr_array_add(builder->xml, g_markup_vprintf_escaped(format, ap));
|
|
|
+ va_end(ap);
|
|
|
+}
|
|
|
+
|
|
|
+void gdb_feature_builder_append_reg(const GDBFeatureBuilder *builder,
|
|
|
+ const char *name,
|
|
|
+ int bitsize,
|
|
|
+ int regnum,
|
|
|
+ const char *type,
|
|
|
+ const char *group)
|
|
|
+{
|
|
|
+ if (builder->feature->num_regs < regnum) {
|
|
|
+ builder->feature->num_regs = regnum;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (group) {
|
|
|
+ gdb_feature_builder_append_tag(
|
|
|
+ builder,
|
|
|
+ "<reg name=\"%s\" bitsize=\"%d\" regnum=\"%d\" type=\"%s\" group=\"%s\"/>",
|
|
|
+ name, bitsize, builder->base_reg + regnum, type, group);
|
|
|
+ } else {
|
|
|
+ gdb_feature_builder_append_tag(
|
|
|
+ builder,
|
|
|
+ "<reg name=\"%s\" bitsize=\"%d\" regnum=\"%d\" type=\"%s\"/>",
|
|
|
+ name, bitsize, builder->base_reg + regnum, type);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void gdb_feature_builder_end(const GDBFeatureBuilder *builder)
|
|
|
+{
|
|
|
+ g_ptr_array_add(builder->xml, (void *)"</feature>");
|
|
|
+ g_ptr_array_add(builder->xml, NULL);
|
|
|
+
|
|
|
+ builder->feature->xml = g_strjoinv(NULL, (void *)builder->xml->pdata);
|
|
|
+
|
|
|
+ for (guint i = 0; i < builder->xml->len - 2; i++) {
|
|
|
+ g_free(g_ptr_array_index(builder->xml, i));
|
|
|
+ }
|
|
|
+
|
|
|
+ g_ptr_array_free(builder->xml, TRUE);
|
|
|
+}
|
|
|
+
|
|
|
const GDBFeature *gdb_find_static_feature(const char *xmlname)
|
|
|
{
|
|
|
const GDBFeature *feature;
|