Index: gdb/target-descriptions.c |
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c |
index cbcca765a7536f72376c52e34605dc0446854682..16aaa64026bd255d7d7dcd63b3f15daa7738330a 100644 |
--- a/gdb/target-descriptions.c |
+++ b/gdb/target-descriptions.c |
@@ -657,9 +657,9 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type) |
bitsize = f->end - f->start + 1; |
total_size = tdesc_type->u.u.size * TARGET_CHAR_BIT; |
if (gdbarch_bits_big_endian (gdbarch)) |
- FIELD_BITPOS (fld[0]) = total_size - f->start - bitsize; |
+ SET_FIELD_BITPOS (fld[0], total_size - f->start - bitsize); |
else |
- FIELD_BITPOS (fld[0]) = f->start; |
+ SET_FIELD_BITPOS (fld[0], f->start); |
FIELD_BITSIZE (fld[0]) = bitsize; |
} |
else |
@@ -1550,6 +1550,7 @@ maint_print_c_tdesc_cmd (char *args, int from_tty) |
struct tdesc_type_field *f; |
struct tdesc_type_flag *flag; |
int ix, ix2, ix3; |
+ int printed_field_type = 0; |
/* Use the global target-supplied description, not the current |
architecture's. This lets a GDB for one architecture generate C |
@@ -1588,7 +1589,39 @@ maint_print_c_tdesc_cmd (char *args, int from_tty) |
printf_unfiltered |
(" struct target_desc *result = allocate_target_description ();\n"); |
printf_unfiltered (" struct tdesc_feature *feature;\n"); |
- printf_unfiltered (" struct tdesc_type *field_type, *type;\n"); |
+ |
+ /* Now we do some "filtering" in order to know which variables to |
+ declare. This is needed because otherwise we would declare unused |
+ variables `field_type' and `type'. */ |
+ for (ix = 0; |
+ VEC_iterate (tdesc_feature_p, tdesc->features, ix, feature); |
+ ix++) |
+ { |
+ int printed_desc_type = 0; |
+ |
+ for (ix2 = 0; |
+ VEC_iterate (tdesc_type_p, feature->types, ix2, type); |
+ ix2++) |
+ { |
+ if (!printed_field_type) |
+ { |
+ printf_unfiltered (" struct tdesc_type *field_type;\n"); |
+ printed_field_type = 1; |
+ } |
+ |
+ if (type->kind == TDESC_TYPE_UNION |
+ && VEC_length (tdesc_type_field, type->u.u.fields) > 0) |
+ { |
+ printf_unfiltered (" struct tdesc_type *type;\n"); |
+ printed_desc_type = 1; |
+ break; |
+ } |
+ } |
+ |
+ if (printed_desc_type) |
+ break; |
+ } |
+ |
printf_unfiltered ("\n"); |
if (tdesc_architecture (tdesc) != NULL) |