X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftarget-descriptions.c;h=16aaa64026bd255d7d7dcd63b3f15daa7738330a;hb=64c311498e46cef6b70aa88577e7d7c382e0f7cc;hp=86adc9d6beeb459057bca87a04390a53ebfd5dd6;hpb=a6f5ef51d7c85bd0b950fd182284f6cbff5fecf0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index 86adc9d6be..16aaa64026 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -1,6 +1,6 @@ /* Target description support for GDB. - Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2006-2012 Free Software Foundation, Inc. Contributed by CodeSourcery. @@ -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 @@ -702,11 +702,10 @@ tdesc_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *tdesc_type) case TDESC_TYPE_FLAGS: { - struct type *type, *field_type; struct tdesc_type_flag *f; int ix; - type = arch_flags_type (gdbarch, xstrdup (tdesc_type->name), + type = arch_flags_type (gdbarch, tdesc_type->name, tdesc_type->u.f.size); for (ix = 0; VEC_iterate (tdesc_type_flag, tdesc_type->u.f.flags, ix, f); @@ -852,7 +851,6 @@ tdesc_register_size (const struct tdesc_feature *feature, static struct tdesc_arch_reg * tdesc_find_arch_register (struct gdbarch *gdbarch, int regno) { - struct tdesc_arch_reg *reg; struct tdesc_arch_data *data; data = gdbarch_data (gdbarch, tdesc_data); @@ -866,6 +864,7 @@ static struct tdesc_reg * tdesc_find_register (struct gdbarch *gdbarch, int regno) { struct tdesc_arch_reg *reg = tdesc_find_arch_register (gdbarch, regno); + return reg? reg->reg : NULL; } @@ -885,6 +884,7 @@ tdesc_register_name (struct gdbarch *gdbarch, int regno) if (regno >= num_regs && regno < num_regs + num_pseudo_regs) { struct tdesc_arch_data *data = gdbarch_data (gdbarch, tdesc_data); + gdb_assert (data->pseudo_register_name != NULL); return data->pseudo_register_name (gdbarch, regno); } @@ -903,6 +903,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno) if (reg == NULL && regno >= num_regs && regno < num_regs + num_pseudo_regs) { struct tdesc_arch_data *data = gdbarch_data (gdbarch, tdesc_data); + gdb_assert (data->pseudo_register_type != NULL); return data->pseudo_register_type (gdbarch, regno); } @@ -946,7 +947,7 @@ tdesc_register_type (struct gdbarch *gdbarch, int regno) else if (reg->bitsize == gdbarch_long_long_bit (gdbarch)) arch_reg->type = builtin_type (gdbarch)->builtin_long_long; else if (reg->bitsize == gdbarch_ptr_bit (gdbarch)) - /* A bit desperate by this point... */ + /* A bit desperate by this point... */ arch_reg->type = builtin_type (gdbarch)->builtin_data_ptr; else { @@ -1040,6 +1041,7 @@ tdesc_register_reggroup_p (struct gdbarch *gdbarch, int regno, if (regno >= num_regs && regno < num_regs + num_pseudo_regs) { struct tdesc_arch_data *data = gdbarch_data (gdbarch, tdesc_data); + if (data->pseudo_register_reggroup_p != NULL) return data->pseudo_register_reggroup_p (gdbarch, regno, reggroup); /* Otherwise fall through to the default reggroup_p. */ @@ -1091,7 +1093,7 @@ tdesc_use_registers (struct gdbarch *gdbarch, struct tdesc_arch_data *early_data) { int num_regs = gdbarch_num_regs (gdbarch); - int i, ixf, ixr; + int ixf, ixr; struct tdesc_feature *feature; struct tdesc_reg *reg; struct tdesc_arch_data *data; @@ -1200,7 +1202,6 @@ tdesc_create_reg (struct tdesc_feature *feature, const char *name, static void tdesc_free_type (struct tdesc_type *type) { - switch (type->kind) { case TDESC_TYPE_STRUCT: @@ -1519,12 +1520,11 @@ show_tdesc_filename_cmd (struct ui_file *file, int from_tty, const char *value) { if (value != NULL && *value != '\0') - printf_filtered (_("\ -The target description will be read from \"%s\".\n"), + printf_filtered (_("The target description will be read from \"%s\".\n"), value); else - printf_filtered (_("\ -The target description will be read from the target.\n")); + printf_filtered (_("The target description will be " + "read from the target.\n")); } static void @@ -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) @@ -1629,7 +1662,8 @@ maint_print_c_tdesc_cmd (char *args, int from_tty) VEC_iterate (tdesc_feature_p, tdesc->features, ix, feature); ix++) { - printf_unfiltered (" feature = tdesc_create_feature (result, \"%s\");\n", + printf_unfiltered (" \ +feature = tdesc_create_feature (result, \"%s\");\n", feature->name); for (ix2 = 0;