This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Problems using -mrtd and -mshort for m68k


Hi All,

I am using GNU GCC (from objsw.com) to build a library
that can be loaded into an embedded 68340 system. The software on
this system is using Pascal calling conventions.

The closest I could get to Pascal calling conventions with GCC is by
using the -mrtd option when compiling:
  gcc -b 68k -mcpu32 -mshort -mrtd -c -o file.o file.c
The order of the arguments on the stack is still wrong, but I can
live with that.

GCC does not use the -mrtd calling convention for all functions that
get called.
My own functions get called with the -mrtd calling convention, and
library functions like strcpy and sin too (called function pops
arguments from stack).
Functions like __floatsidf are not called with this calling
convention (calling function pops arguments from stack).

With and without the -mrtd option, the asm output of the function
call looks something like this (argument is popped after call):
    x = (double)i;
     3001e:     306e 0008       moveaw %fp@(8),%a0
     30022:     2f08            movel %a0,%sp@-
     30024:     4eb9 0003 0050  jsr 30050 <__floatsidf>
     3002a:     588f            addql #4,%sp
     3002c:     2d40 fff8       movel %d0,%fp@(-8)
     30030:     2d41 fffc       movel %d1,%fp@(-4)

The linked __floatsidf function is as expected:

  gcc -b 68k -mcpu32 -mshort -mrtd -Tlinkfile.ld -o file.cof file.o
  00030050 <__floatsidf>:
     30050:     4e56 0000       linkw %fp,#0
     ....
     300ca:     4e5e            unlk %fp
     300aa:     4e74 0004       rtd #4

  gcc -b 68k -mcpu32 -mshort -Tlinkfile.ld -o file.cof file.o
  00030050 <__floatsidf>:
     30050:     4e56 0000       linkw %fp,#0
     ....
     300ca:     4e5e            unlk %fp
     300cc:     4e75            rts

When linking with -mrtd, the stack gets corrupted: The function
arguments are popped twice for __floatsidf.
When linking without -mrtd, the stack gets corrupted too: The
function arguments aren't popped for strcpy.

Is there a solution to this problem that does not involve
editing asm intermediate files?


A call to strcpy is changed to a call to bcopy if optimisation is
turned on and the string is long enough. The stack gets corrupted
again:

  strcpy(pch, "Testing my 'Hello World!' string");
     30044:     3f3c 0021       movew #33,%sp@-
     30048:     2f02            movel %d2,%sp@-
     3004a:     487a ffc4       pea %pc@(30010 <.text>)
     3004e:     4eb9 0003 0064  jsr 30064 <bcopy>

  00030064 <bcopy>:
     30064:     4e56 0000       linkw %fp,#0
     30068:     2f2e 0010       movel %fp@(16),%sp@-
     3006c:     2f2e 0008       movel %fp@(8),%sp@-
     30070:     2f2e 000c       movel %fp@(12),%sp@-
     30074:     4eb9 0003 0080  jsr 30080 <memmove>
     3007a:     4e5e            unlk %fp
     3007c:     4e74 000c       rtd #12

I can solve this by replacing 'movew #33,%sp@-' by 'movel #33,%sp@-',
but I would like to fix this without having to edit the intermediate
asm files. Another solution is not using the -mshort option, but
the int size preferably is 16-bit.


Thanks,

Arjan Koers.
_______________________________________________
New CrossGCC FAQ: http://www.objsw.com/CrossGCC
_______________________________________________
To remove yourself from the crossgcc list, send
mail to crossgcc-request@cygnus.com with the
text 'unsubscribe' (without the quotes) in the
body of the message.