X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Ftic6x-tdep.c;h=ae3138e003ef202891f3683f7445ef8c4e1a6c7e;hb=e609377629a12f6518eaf100c1983e23c80fecc1;hp=ca959475f53ee4fa2a4335e4f3597a47e4d7ddfd;hpb=6a3a010ba62de90c4fb166550a6bcff4782542db;p=platform%2Fupstream%2Fbinutils.git diff --git a/gdb/tic6x-tdep.c b/gdb/tic6x-tdep.c index ca95947..ae3138e 100644 --- a/gdb/tic6x-tdep.c +++ b/gdb/tic6x-tdep.c @@ -1,6 +1,6 @@ /* Target dependent code for GDB on TI C6x systems. - Copyright (C) 2010-2012 Free Software Foundation, Inc. + Copyright (C) 2010-2014 Free Software Foundation, Inc. Contributed by Andrew Jenner Contributed by Yao Qi @@ -44,7 +44,6 @@ #include "linux-tdep.h" #include "solib.h" #include "objfiles.h" -#include "gdb_assert.h" #include "osabi.h" #include "tic6x-tdep.h" #include "language.h" @@ -301,7 +300,6 @@ tic6x_analyze_prologue (struct gdbarch *gdbarch, const CORE_ADDR start_pc, static CORE_ADDR tic6x_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) { - CORE_ADDR limit_pc; CORE_ADDR func_addr; struct tic6x_unwind_cache cache; @@ -324,7 +322,7 @@ tic6x_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) /* This is the implementation of gdbarch method breakpiont_from_pc. */ -static const unsigned char* +static const gdb_byte * tic6x_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *bp_addr, int *bp_size) { @@ -405,7 +403,6 @@ tic6x_frame_unwind_cache (struct frame_info *this_frame, struct gdbarch *gdbarch = get_frame_arch (this_frame); CORE_ADDR current_pc; struct tic6x_unwind_cache *cache; - int i; if (*this_prologue_cache) return *this_prologue_cache; @@ -532,7 +529,7 @@ tic6x_stub_unwind_sniffer (const struct frame_unwind *self, CORE_ADDR addr_in_block; addr_in_block = get_frame_address_in_block (this_frame); - if (in_plt_section (addr_in_block, NULL)) + if (in_plt_section (addr_in_block)) return 1; return 0; @@ -606,7 +603,6 @@ tic6x_get_next_pc (struct frame_info *frame, CORE_ADDR pc) { struct gdbarch *gdbarch = get_frame_arch (frame); unsigned long inst; - int offset; int register_number; int last = 0; @@ -718,27 +714,6 @@ tic6x_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr) return align_down (addr, 8); } -/* This is the implementation of gdbarch method register_to_value. */ - -static int -tic6x_register_to_value (struct frame_info *frame, int regnum, - struct type *type, gdb_byte * to, - int *optimizedp, int *unavailablep) -{ - get_frame_register (frame, regnum, (char *) to); - *optimizedp = *unavailablep = 0; - return 1; -} - -/* This is the implementation of gdbarch method value_to_register. */ - -static void -tic6x_value_to_register (struct frame_info *frame, int regnum, - struct type *type, const gdb_byte *from) -{ - put_frame_register (frame, regnum, from); -} - /* Given a return value in REGCACHE with a type VALTYPE, extract and copy its value into VALBUF. */ @@ -825,6 +800,19 @@ tic6x_return_value (struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf) { + /* In C++, when function returns an object, even its size is small + enough, it stii has to be passed via reference, pointed by register + A3. */ + if (current_language->la_language == language_cplus) + { + if (type != NULL) + { + CHECK_TYPEDEF (type); + if (language_pass_by_reference (type)) + return RETURN_VALUE_STRUCT_CONVENTION; + } + } + if (TYPE_LENGTH (type) > 8) return RETURN_VALUE_STRUCT_CONVENTION; @@ -906,7 +894,6 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function, { int argreg = 0; int argnum; - int len = 0; int stack_offset = 4; int references_offset = 4; CORE_ADDR func_addr = find_function_addr (function, NULL); @@ -915,32 +902,7 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* The first arg passed on stack. Mostly the first 10 args are passed by registers. */ int first_arg_on_stack = 10; - /* If this inf-call is a cpp method call, and return value is passed by - reference, this flag is set to 1, otherwise set to 0. We need this flag - because computation of the return location in - infcall.c:call_function_by_hand is wrong for C6000 ELF ABI. In - call_function_by_hand, the language is considered first, and then - target ABI is considered. If language_pass_by_reference returns true, - the return location is passed as the first parameter to the function, - which is conflict with C6000 ELF ABI. If this flag is true, we should - adjust args and return locations accordingly to comply with C6000 ELF - ABI. */ - int cplus_return_struct_by_reference = 0; - if (current_language->la_language == language_cplus) - { - struct type *values_type; - - find_function_addr (function, &values_type); - - if (values_type) - { - CHECK_TYPEDEF (values_type); - if (language_pass_by_reference (values_type)) - cplus_return_struct_by_reference = 1; - } - - } /* Set the return address register to point to the entry point of the program, where a breakpoint lies in wait. */ regcache_cooked_write_unsigned (regcache, TIC6X_RA_REGNUM, bp_addr); @@ -950,12 +912,6 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function, the address in A3. */ if (struct_return) regcache_cooked_write_unsigned (regcache, 3, struct_addr); - else if (cplus_return_struct_by_reference) - /* When cplus_return_struct_by_reference is 1, means local variable - lang_struct_return in call_function_by_hand is 1, so struct is - returned by reference, even STRUCT_RETURN is 0. Note that STRUCT_ADDR - is still valid in this case. */ - regcache_cooked_write_unsigned (regcache, 3, struct_addr); /* Determine the type of this function. */ func_type = check_typedef (func_type); @@ -970,10 +926,8 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function, if (TYPE_VARARGS (func_type)) first_arg_on_stack = TYPE_NFIELDS (func_type) - 1; - /* Now make space on the stack for the args. If - cplus_return_struct_by_reference is 1, means GDB pass an extra parameter - in ARGS, which is useless here, skip it. */ - for (argnum = cplus_return_struct_by_reference; argnum < nargs; argnum++) + /* Now make space on the stack for the args. */ + for (argnum = 0; argnum < nargs; argnum++) { int len = align_up (TYPE_LENGTH (value_type (args[argnum])), 4); if (argnum >= 10 - argreg) @@ -989,7 +943,7 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function, /* Now load as many as possible of the first arguments into registers, and push the rest onto the stack. Loop through args from first to last. */ - for (argnum = cplus_return_struct_by_reference; argnum < nargs; argnum++) + for (argnum = 0; argnum < nargs; argnum++) { const gdb_byte *val; struct value *arg = args[argnum]; @@ -1195,7 +1149,7 @@ tic6x_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) struct gdbarch *gdbarch = get_frame_arch (frame); enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); CORE_ADDR jb_addr; - char buf[4]; + gdb_byte buf[4]; /* JMP_BUF is passed by reference in A4. */ jb_addr = get_frame_register_unsigned (frame, 4); @@ -1210,6 +1164,16 @@ tic6x_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) return 1; } +/* This is the implementation of gdbarch method + return_in_first_hidden_param_p. */ + +static int +tic6x_return_in_first_hidden_param_p (struct gdbarch *gdbarch, + struct type *type) +{ + return 0; +} + static struct gdbarch * tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) { @@ -1343,6 +1307,7 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) frame_unwind_append_unwinder (gdbarch, &tic6x_stub_unwind); frame_unwind_append_unwinder (gdbarch, &tic6x_frame_unwind); + frame_base_set_default (gdbarch, &tic6x_frame_base); dwarf2_frame_set_init_reg (gdbarch, tic6x_dwarf2_frame_init_reg); @@ -1354,9 +1319,6 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Call dummy code. */ set_gdbarch_frame_align (gdbarch, tic6x_frame_align); - set_gdbarch_register_to_value (gdbarch, tic6x_register_to_value); - set_gdbarch_value_to_register (gdbarch, tic6x_value_to_register); - set_gdbarch_return_value (gdbarch, tic6x_return_value); set_gdbarch_dummy_id (gdbarch, tic6x_dummy_id); @@ -1368,6 +1330,9 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_in_function_epilogue_p (gdbarch, tic6x_in_function_epilogue_p); + set_gdbarch_return_in_first_hidden_param_p (gdbarch, + tic6x_return_in_first_hidden_param_p); + /* Hook in ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch);