X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fmt-tdep.c;h=58fc4912648b263e05a40227fe38ca532bca8a28;hb=e17a4113357102b55cfa5b80557d590a46a43300;hp=da6e99cf77a1653107da4bf49f38f0b7a5512cc1;hpb=94afd7a6d348a66ea3fb35fdb8234b050ec8c779;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mt-tdep.c b/gdb/mt-tdep.c index da6e99cf77..58fc491264 100644 --- a/gdb/mt-tdep.c +++ b/gdb/mt-tdep.c @@ -1,6 +1,6 @@ /* Target-dependent code for Morpho mt processor, for GDB. - Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GDB. @@ -37,6 +37,7 @@ #include "infcall.h" #include "gdb_assert.h" #include "language.h" +#include "valprint.h" enum mt_arch_constants { @@ -138,6 +139,14 @@ enum mt_gdb_regnums * MT_COPRO_PSEUDOREG_DIM_2) }; +/* The tdep structure. */ +struct gdbarch_tdep +{ + /* ISA-specific types. */ + struct type *copro_type; +}; + + /* Return name of register number specified by REGNUM. */ static const char * @@ -212,7 +221,7 @@ mt_copro_register_type (struct gdbarch *arch, int regnum) case MT_QCHANNEL_REGNUM: case MT_ISCRAMB_REGNUM: case MT_QSCRAMB_REGNUM: - return builtin_type_int32; + return builtin_type (arch)->builtin_int32; case MT_BYPA_REGNUM: case MT_BYPB_REGNUM: case MT_BYPC_REGNUM: @@ -221,27 +230,27 @@ mt_copro_register_type (struct gdbarch *arch, int regnum) case MT_OUT_REGNUM: case MT_ZI2_REGNUM: case MT_ZQ2_REGNUM: - return builtin_type_int16; + return builtin_type (arch)->builtin_int16; case MT_EXMAC_REGNUM: case MT_MAC_REGNUM: - return builtin_type_uint32; + return builtin_type (arch)->builtin_uint32; case MT_CONTEXT_REGNUM: - return builtin_type_long_long; + return builtin_type (arch)->builtin_long_long; case MT_FLAG_REGNUM: - return builtin_type_unsigned_char; + return builtin_type (arch)->builtin_unsigned_char; default: if (regnum >= MT_CPR0_REGNUM && regnum <= MT_CPR15_REGNUM) - return builtin_type_int16; + return builtin_type (arch)->builtin_int16; else if (regnum == MT_CPR0_REGNUM + MT_COPRO_PSEUDOREG_MAC_REGNUM) { if (gdbarch_bfd_arch_info (arch)->mach == bfd_mach_mrisc2 || gdbarch_bfd_arch_info (arch)->mach == bfd_mach_ms2) - return builtin_type_uint64; + return builtin_type (arch)->builtin_uint64; else - return builtin_type_uint32; + return builtin_type (arch)->builtin_uint32; } else - return builtin_type_uint32; + return builtin_type (arch)->builtin_uint32; } } @@ -251,41 +260,34 @@ mt_copro_register_type (struct gdbarch *arch, int regnum) static struct type * mt_register_type (struct gdbarch *arch, int regnum) { - static struct type *void_func_ptr = NULL; - static struct type *void_ptr = NULL; - static struct type *copro_type; + struct gdbarch_tdep *tdep = gdbarch_tdep (arch); if (regnum >= 0 && regnum < MT_NUM_REGS + MT_NUM_PSEUDO_REGS) { - if (void_func_ptr == NULL) - { - struct type *temp; - - void_ptr = lookup_pointer_type (builtin_type_void); - void_func_ptr = - lookup_pointer_type (lookup_function_type (builtin_type_void)); - temp = create_range_type (NULL, builtin_type_unsigned_int, 0, 1); - copro_type = create_array_type (NULL, builtin_type_int16, temp); - } switch (regnum) { case MT_PC_REGNUM: case MT_RA_REGNUM: case MT_IRA_REGNUM: - return void_func_ptr; + return builtin_type (arch)->builtin_func_ptr; case MT_SP_REGNUM: case MT_FP_REGNUM: - return void_ptr; + return builtin_type (arch)->builtin_data_ptr; case MT_COPRO_REGNUM: case MT_COPRO_PSEUDOREG_REGNUM: - return copro_type; + if (tdep->copro_type == NULL) + { + struct type *elt = builtin_type (arch)->builtin_int16; + tdep->copro_type = lookup_array_range_type (elt, 0, 1); + } + return tdep->copro_type; case MT_MAC_PSEUDOREG_REGNUM: return mt_copro_register_type (arch, MT_CPR0_REGNUM + MT_COPRO_PSEUDOREG_MAC_REGNUM); default: if (regnum >= MT_R0_REGNUM && regnum <= MT_R15_REGNUM) - return builtin_type_int32; + return builtin_type (arch)->builtin_int32; else if (regnum < MT_COPRO_PSEUDOREG_ARRAY) return mt_copro_register_type (arch, regnum); else @@ -337,6 +339,8 @@ mt_return_value (struct gdbarch *gdbarch, struct type *func_type, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + if (TYPE_LENGTH (type) > 4) { /* Return values > 4 bytes are returned in memory, @@ -367,7 +371,8 @@ mt_return_value (struct gdbarch *gdbarch, struct type *func_type, /* Return values of <= 4 bytes are returned in R11. */ regcache_cooked_read_unsigned (regcache, MT_R11_REGNUM, &temp); - store_unsigned_integer (readbuf, TYPE_LENGTH (type), temp); + store_unsigned_integer (readbuf, TYPE_LENGTH (type), + byte_order, temp); } if (writebuf) @@ -401,6 +406,7 @@ mt_return_value (struct gdbarch *gdbarch, struct type *func_type, static CORE_ADDR mt_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR func_addr = 0, func_end = 0; char *func_name; unsigned long instr; @@ -428,7 +434,7 @@ mt_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc) /* No function symbol, or no line symbol. Use prologue scanning method. */ for (;; pc += 4) { - instr = read_memory_unsigned_integer (pc, 4); + instr = read_memory_unsigned_integer (pc, 4, byte_order); if (instr == 0x12000000) /* nop */ continue; if (instr == 0x12ddc000) /* copy sp into fp */ @@ -472,13 +478,15 @@ static int mt_select_coprocessor (struct gdbarch *gdbarch, struct regcache *regcache, int regno) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); unsigned index, base; gdb_byte copro[4]; /* Get the copro pseudo regnum. */ regcache_raw_read (regcache, MT_COPRO_REGNUM, copro); - base = (extract_signed_integer (&copro[0], 2) * MT_COPRO_PSEUDOREG_DIM_2 - + extract_signed_integer (&copro[2], 2)); + base = ((extract_signed_integer (&copro[0], 2, byte_order) + * MT_COPRO_PSEUDOREG_DIM_2) + + extract_signed_integer (&copro[2], 2, byte_order)); regno -= MT_COPRO_PSEUDOREG_ARRAY; index = regno % MT_COPRO_PSEUDOREG_REGS; @@ -489,8 +497,10 @@ mt_select_coprocessor (struct gdbarch *gdbarch, coprocessor register cache. */ unsigned ix; - store_signed_integer (&copro[0], 2, regno / MT_COPRO_PSEUDOREG_DIM_2); - store_signed_integer (&copro[2], 2, regno % MT_COPRO_PSEUDOREG_DIM_2); + store_signed_integer (&copro[0], 2, byte_order, + regno / MT_COPRO_PSEUDOREG_DIM_2); + store_signed_integer (&copro[2], 2, byte_order, + regno % MT_COPRO_PSEUDOREG_DIM_2); regcache_raw_write (regcache, MT_COPRO_REGNUM, copro); /* We must flush the cache, as it is now invalid. */ @@ -517,6 +527,8 @@ static void mt_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache, int regno, gdb_byte *buf) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + switch (regno) { case MT_COPRO_REGNUM: @@ -535,7 +547,7 @@ mt_pseudo_register_read (struct gdbarch *gdbarch, regcache_cooked_read_unsigned (regcache, MT_EXMAC_REGNUM, &ext_mac); newmac = (oldmac & 0xffffffff) | ((long long) (ext_mac & 0xff) << 32); - store_signed_integer (buf, 8, newmac); + store_signed_integer (buf, 8, byte_order, newmac); } else regcache_raw_read (regcache, MT_MAC_REGNUM, buf); @@ -565,6 +577,7 @@ mt_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, int regno, const gdb_byte *buf) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); int i; switch (regno) @@ -585,7 +598,7 @@ mt_pseudo_register_write (struct gdbarch *gdbarch, unsigned int oldmac, ext_mac; ULONGEST newmac; - newmac = extract_unsigned_integer (buf, 8); + newmac = extract_unsigned_integer (buf, 8, byte_order); oldmac = newmac & 0xffffffff; ext_mac = (newmac >> 32) & 0xff; regcache_cooked_write_unsigned (regcache, MT_MAC_REGNUM, oldmac); @@ -624,6 +637,8 @@ mt_registers_info (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regnum, int all) { + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + if (regnum == -1) { int lim; @@ -670,10 +685,10 @@ mt_registers_info (struct gdbarch *gdbarch, for (i = 0; i < regsize; i++) fprintf_filtered (file, "%02x", (unsigned int) - extract_unsigned_integer (buff + i, 1)); + extract_unsigned_integer (buff + i, 1, byte_order)); fputs_filtered ("\t", file); print_longest (file, 'd', 0, - extract_unsigned_integer (buff, regsize)); + extract_unsigned_integer (buff, regsize, byte_order)); fputs_filtered ("\n", file); } else if (regnum == MT_COPRO_REGNUM @@ -681,6 +696,7 @@ mt_registers_info (struct gdbarch *gdbarch, { /* Special output handling for the 'coprocessor' register. */ gdb_byte *buf; + struct value_print_options opts; buf = alloca (register_size (gdbarch, MT_COPRO_REGNUM)); frame_register_read (frame, MT_COPRO_REGNUM, buf); @@ -691,8 +707,10 @@ mt_registers_info (struct gdbarch *gdbarch, print_spaces_filtered (15 - strlen (gdbarch_register_name (gdbarch, regnum)), file); + get_raw_print_options (&opts); + opts.deref_ref = 1; val_print (register_type (gdbarch, regnum), buf, - 0, 0, file, 0, 1, 0, Val_no_prettyprint, + 0, 0, file, 0, &opts, current_language); fputs_filtered ("\n", file); } @@ -704,13 +722,13 @@ mt_registers_info (struct gdbarch *gdbarch, /* Get the two "real" mac registers. */ frame_register_read (frame, MT_MAC_REGNUM, buf); oldmac = extract_unsigned_integer - (buf, register_size (gdbarch, MT_MAC_REGNUM)); + (buf, register_size (gdbarch, MT_MAC_REGNUM), byte_order); if (gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_mrisc2 || gdbarch_bfd_arch_info (gdbarch)->mach == bfd_mach_ms2) { frame_register_read (frame, MT_EXMAC_REGNUM, buf); ext_mac = extract_unsigned_integer - (buf, register_size (gdbarch, MT_EXMAC_REGNUM)); + (buf, register_size (gdbarch, MT_EXMAC_REGNUM), byte_order); } else ext_mac = 0; @@ -750,6 +768,7 @@ mt_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int struct_return, CORE_ADDR struct_addr) { #define wordsize 4 + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); gdb_byte buf[MT_MAX_STRUCT_SIZE]; int argreg = MT_1ST_ARGREG; int split_param_len = 0; @@ -773,7 +792,7 @@ mt_push_dummy_call (struct gdbarch *gdbarch, struct value *function, regcache_cooked_write_unsigned (regcache, argreg++, extract_unsigned_integer (value_contents (args[i]), - wordsize)); + wordsize, byte_order)); break; case 8: case 12: @@ -786,7 +805,7 @@ mt_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* This word of the argument is passed in a register. */ regcache_cooked_write_unsigned (regcache, argreg++, extract_unsigned_integer - (val, wordsize)); + (val, wordsize, byte_order)); typelen -= wordsize; val += wordsize; } @@ -908,7 +927,7 @@ mt_frame_unwind_cache (struct frame_info *this_frame, return info; end_addr = get_frame_pc (this_frame); - prologue_end_addr = skip_prologue_using_sal (start_addr); + prologue_end_addr = skip_prologue_using_sal (gdbarch, start_addr); if (end_addr == 0) for (next_addr = start_addr; next_addr < end_addr; next_addr += 4) { @@ -1104,6 +1123,7 @@ static struct gdbarch * mt_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { struct gdbarch *gdbarch; + struct gdbarch_tdep *tdep; /* Find a candidate among the list of pre-declared architectures. */ arches = gdbarch_list_lookup_by_info (arches, &info); @@ -1112,7 +1132,8 @@ mt_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* None found, create a new architecture from the information provided. */ - gdbarch = gdbarch_alloc (&info, NULL); + tdep = XCALLOC (1, struct gdbarch_tdep); + gdbarch = gdbarch_alloc (&info, tdep); set_gdbarch_float_format (gdbarch, floatformats_ieee_single); set_gdbarch_double_format (gdbarch, floatformats_ieee_double); @@ -1171,6 +1192,9 @@ mt_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) return gdbarch; } +/* Provide a prototype to silence -Wmissing-prototypes. */ +extern initialize_file_ftype _initialize_mt_tdep; + void _initialize_mt_tdep (void) {