From change made to branch by Bob Manson <manson@cygnus.com>:
authorMark Alexander <marka@cygnus>
Fri, 12 Dec 1997 06:43:11 +0000 (06:43 +0000)
committerMark Alexander <marka@cygnus>
Fri, 12 Dec 1997 06:43:11 +0000 (06:43 +0000)
* tic80-tdep.c (tic80_push_arguments): The compiler always
passes structs by reference.

gdb/ChangeLog
gdb/tic80-tdep.c

index 27e186651fb868fc4fdec36d4364cbec0999915e..28260d3e6491ac84541f662b9fcc35f1f6c8357f 100644 (file)
@@ -1,3 +1,9 @@
+Thu Dec 11 22:39:02 1997  Mark Alexander  <marka@cygnus.com>
+
+       From change made to branch by Bob Manson <manson@cygnus.com>:
+       * tic80-tdep.c (tic80_push_arguments): The compiler always
+       passes structs by reference.
+
 Thu Dec 11 14:28:01 1997  Michael Snyder  (msnyder@cleaver.cygnus.com)
 
        * tracepoint.c (trace_find_command): don't error if going
index 9648d55b9101873699fe0e32765c4d8e63945699..4a9883b7d2a40dd78b7b3feb379605790c4f992d 100644 (file)
@@ -306,7 +306,7 @@ tic80_frame_saved_pc (fi)
      struct frame_info *fi;
 {
   if (PC_IN_CALL_DUMMY(fi->pc, fi->frame, fi->frame))
-    return generic_read_register_dummy(fi->pc, fi->frame, PC_REGNUM);
+    return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
   else
     return tic80_find_callers_reg (fi, LR_REGNUM);
 }
@@ -380,6 +380,7 @@ tic80_push_arguments (nargs, args, sp, struct_return, struct_addr)
   char valbuf[4];
   int len;
   int odd_sized_struct;
+  int is_struct;
 
   /* first force sp to a 4-byte alignment */
   sp = sp & ~3;
@@ -405,30 +406,41 @@ tic80_push_arguments (nargs, args, sp, struct_return, struct_addr)
     {
       type = VALUE_TYPE (args[argnum]);
       len  = TYPE_LENGTH (type);
-      memset(valbuf, 0, sizeof(valbuf));
+      memset (valbuf, 0, sizeof (valbuf));
       val = (char *) VALUE_CONTENTS (args[argnum]);
-      if (len < 4)
-        { /* value gets right-justified in the register or stack word */
-          memcpy(valbuf + (4 - len), val, len);
-          val = valbuf;
-        }
  
 /* FIXME -- tic80 can take doubleword arguments in register pairs */
-      if (len > 4 && (len & 3) != 0)
-        odd_sized_struct = 1;           /* such structs go entirely on stack */
+      is_struct = (type->code == TYPE_CODE_STRUCT);
+      odd_sized_struct = 0;
+
+      if (! is_struct)
+       {
+         if (len < 4)
+           { /* value gets right-justified in the register or stack word */
+             memcpy (valbuf + (4 - len), val, len);
+             val = valbuf;
+           }
+         if (len > 4 && (len & 3) != 0)
+           odd_sized_struct = 1;     /* such structs go entirely on stack */
+       }
       else
-        odd_sized_struct = 0;
+       {
+         /* Structs are always passed by reference. */
+         write_register (argreg, sp + stack_offset);
+         argreg ++;
+       }
+
       while (len > 0)
         {
-          if (argreg > ARGLAST_REGNUM || odd_sized_struct)
+          if (is_struct || argreg > ARGLAST_REGNUM || odd_sized_struct)
             {                          /* must go on the stack */
               write_memory (sp + stack_offset, val, 4);
               stack_offset += 4;
             }
           /* NOTE WELL!!!!!  This is not an "else if" clause!!!
-             That's because some *&^%$ things get passed on the stack
+             That's because some things get passed on the stack
              AND in the registers!   */
-          if (argreg <= ARGLAST_REGNUM)
+          if (!is_struct && argreg <= ARGLAST_REGNUM)
             {                          /* there's room in a register */
               regval = extract_address (val, REGISTER_RAW_SIZE(argreg));
               write_register (argreg, regval);