Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@redhat.com>
To: gdb-patches@sources.redhat.com
Subject: [commit] mn10300_push_call -- handle structs
Date: Sat, 02 Apr 2005 00:41:00 -0000	[thread overview]
Message-ID: <424DEA37.5080301@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2: structs --]
[-- Type: text/plain, Size: 5226 bytes --]

2005-04-01  Michael Snyder  <msnyder@redhat.com>

	* mn10300-tdep.c (mn10300_frame_unwind_cache): Use 
	find_partial_func instead of unwind_pc to identify frame.
	(mn10300_push_dummy_call): Handle struct args, struct_return.

Index: mn10300-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mn10300-tdep.c,v
retrieving revision 1.120
diff -p -r1.120 mn10300-tdep.c
*** mn10300-tdep.c	2 Apr 2005 00:08:14 -0000	1.120
--- mn10300-tdep.c	2 Apr 2005 00:38:07 -0000
*************** mn10300_frame_unwind_cache (struct frame
*** 313,319 ****
  			    void **this_prologue_cache)
  {
    struct trad_frame_cache *cache;
!   CORE_ADDR pc;
  
    if (*this_prologue_cache)
      return (*this_prologue_cache);
--- 313,319 ----
  			    void **this_prologue_cache)
  {
    struct trad_frame_cache *cache;
!   CORE_ADDR pc, start, end;
  
    if (*this_prologue_cache)
      return (*this_prologue_cache);
*************** mn10300_frame_unwind_cache (struct frame
*** 321,330 ****
    cache = trad_frame_cache_zalloc (next_frame);
    pc = gdbarch_unwind_pc (current_gdbarch, next_frame);
    mn10300_analyze_prologue (next_frame, (void **) &cache, pc);
! 
!   trad_frame_set_id (cache, 
! 		     frame_id_build (trad_frame_get_this_base (cache), 
! 				     frame_func_unwind (next_frame)));
  
    (*this_prologue_cache) = cache;
    return cache;
--- 321,334 ----
    cache = trad_frame_cache_zalloc (next_frame);
    pc = gdbarch_unwind_pc (current_gdbarch, next_frame);
    mn10300_analyze_prologue (next_frame, (void **) &cache, pc);
!   if (find_pc_partial_function (pc, NULL, &start, &end))
!     trad_frame_set_id (cache, 
! 		       frame_id_build (trad_frame_get_this_base (cache), 
! 				       start));
!   else
!     trad_frame_set_id (cache, 
! 		       frame_id_build (trad_frame_get_this_base (cache), 
! 				       frame_func_unwind (next_frame)));
  
    (*this_prologue_cache) = cache;
    return cache;
*************** mn10300_push_dummy_call (struct gdbarch 
*** 445,459 ****
  			 CORE_ADDR struct_addr)
  {
    const int push_size = register_size (gdbarch, E_PC_REGNUM);
!   int regs_used = struct_return ? 1 : 0;
    int len, arg_len; 
    int stack_offset = 0;
    int argnum;
!   char *val;
  
    /* FIXME temp, don't handle struct args at all.  */
    if (struct_return)
      error ("Target doesn't handle struct return");
  
    /* This should be a nop, but align the stack just in case something
       went wrong.  Stacks are four byte aligned on the mn10300.  */
--- 449,465 ----
  			 CORE_ADDR struct_addr)
  {
    const int push_size = register_size (gdbarch, E_PC_REGNUM);
!   int regs_used;
    int len, arg_len; 
    int stack_offset = 0;
    int argnum;
!   char *val, valbuf[MAX_REGISTER_SIZE];
  
+ #if 0
    /* FIXME temp, don't handle struct args at all.  */
    if (struct_return)
      error ("Target doesn't handle struct return");
+ #endif
  
    /* This should be a nop, but align the stack just in case something
       went wrong.  Stacks are four byte aligned on the mn10300.  */
*************** mn10300_push_dummy_call (struct gdbarch 
*** 463,473 ****
--- 469,482 ----
  
       XXX This doesn't appear to handle pass-by-invisible reference
       arguments.  */
+   regs_used = struct_return ? 1 : 0;
    for (len = 0, argnum = 0; argnum < nargs; argnum++)
      {
        arg_len = (TYPE_LENGTH (value_type (args[argnum])) + 3) & ~3;
+ #if 0
        if (TYPE_CODE (value_type (args[argnum])) == TYPE_CODE_STRUCT)
  	error ("Target does not handle struct args");
+ #endif
        while (regs_used < 2 && arg_len > 0)
  	{
  	  regs_used++;
*************** mn10300_push_dummy_call (struct gdbarch 
*** 479,496 ****
    /* Allocate stack space.  */
    sp -= len;
  
!   regs_used = struct_return ? 1 : 0;
    /* Push all arguments onto the stack. */
    for (argnum = 0; argnum < nargs; argnum++)
      {
!       /* FIXME what about structs?  */
!       arg_len = TYPE_LENGTH (value_type (*args));
!       val = (char *) value_contents (*args);
  
        while (regs_used < 2 && arg_len > 0)
  	{
! 	  write_register (regs_used, extract_unsigned_integer (val, 
! 							       push_size));
  	  val += push_size;
  	  arg_len -= push_size;
  	  regs_used++;
--- 488,524 ----
    /* Allocate stack space.  */
    sp -= len;
  
!   if (struct_return)
!     {
!       regs_used = 1;
!       write_register (E_D0_REGNUM, struct_addr);
!     }
!   else
!     regs_used = 0;
! 
    /* Push all arguments onto the stack. */
    for (argnum = 0; argnum < nargs; argnum++)
      {
!       /* FIXME what about structs?  Unions?  */
!       if (TYPE_CODE (value_type (*args)) == TYPE_CODE_STRUCT
! 	  && TYPE_LENGTH (value_type (*args)) > 8)
! 	{
! 	  /* Change to pointer-to-type.  */
! 	  arg_len = push_size;
! 	  store_unsigned_integer (valbuf, push_size, 
! 				  VALUE_ADDRESS (*args));
! 	  val = &valbuf[0];
! 	}
!       else
! 	{
! 	  arg_len = TYPE_LENGTH (value_type (*args));
! 	  val = (char *) value_contents (*args);
! 	}
  
        while (regs_used < 2 && arg_len > 0)
  	{
! 	  write_register (regs_used, 
! 			  extract_unsigned_integer (val, push_size));
  	  val += push_size;
  	  arg_len -= push_size;
  	  regs_used++;

             reply	other threads:[~2005-04-02  0:41 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-02  0:41 Michael Snyder [this message]
2005-04-02  1:18 ` Daniel Jacobowitz
2005-04-02  2:20   ` Michael Snyder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=424DEA37.5080301@redhat.com \
    --to=msnyder@redhat.com \
    --cc=gdb-patches@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox