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]

Re: Problems using -mrtd and -mshort for m68k


Hi,

this may be a bug in the m68k machine description for gcc.

In order to confirm it, can you please re-run your compile and link
commands, but add the option '-v' to the each of the command lines, to
generate a verbose listing of the compiler's activity; and then please
post the output to the list.

Until we get this sorted out, the safest option is to not use -mshort or
-mrtd.

This is very surprising.  These two options have existed in gcc for a
long time.  Thanks for your great detective work!

Scott
scott@objsw.com

Arjan Koers wrote:
> 
> 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.
_______________________________________________
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.