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] |
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.