On Thu, Mar 8, 2012 at 9:35 AM, JMGross <msp...@grossibaer.de> wrote: > > > > > ----- Ursprüngliche Nachricht ----- > Von: Peter Bigot > An: Conrado P. L. Gouvêa > Gesendet am: 08 Mrz 2012 13:35:56 > Betreff: Re: [Mspgcc-users] Incorrect generated code > >> Yes, unless it is marked as "hosted" main is handled specially; there >> has been recent discussion about why in a thread about creating >> archives that contain the main routine. See also >> http://www.mail-archive.com/mspgcc-users@lists.sourceforge.net/msg09750.html. > >> At a quick glance does appear that the second call is not appropriate, >> though the return value is right (r15 has the correct value when main >> is left). If you'd like this investigated, please file a ticket on >> the tracker. https://sourceforge.net/tracker/?group_id=42303&atid=432701 > >>> int main(void) { >>> if (dummy() == 1) { >>> foo(); >>> return 1; >>> } >>> return 0; >>> } > >>> 0000403e <main>: >>> 403e: b0 12 62 40 call #0x4062 >>> 4042: 1f 93 cmp #1, r15 ;r3 As==01 >>> 4044: 01 24 jz $+4 ;abs 0x4048 >>> 4046: 0f 43 clr r15 >>> 4048: b0 12 58 40 call #0x4058 >>> 404c: 1f 43 mov #1, r15 ;r3 As==01 > > Teh second call is appropriate. The code does what it shall do. > Except that the source code does something that is not expected for main: > It returns. Where to?
To the code that follows main, as expected and documented within the linker scripts and CRT code (in absence of an updated manual). This is a bug, which I've "fixed" twice before, apparently inadequately. https://sourceforge.net/tracker/index.php?func=detail&aid=3440809&group_id=42303&atid=432701 Third time the charm? We'll see.... Peter > The 'problem' in the above code is that main is not expected to end. > So the return statement does not produce a RET instruction > (which otherwise would be between the "clr r15" and the second call) > > main is a naked function, so even if you use a return statement, no > RET instruction is generated. And in this specific case, due to the > optimizing reordering, the 'return 0' falls through to the if block. > > Well, I must admit I had expected some jump to a dummy > 'end of main' label or such. But thinking over it, it is obvious, that > on a naked function you're responsible for exiting the function properly > A return statement sets the return value, but that's it. > i foyu don't add your own jmp/ret/whatever code after the return statement, > it just continues executing what follows. > > Returning something form main (or returning from main in general) doesn't make > any sense at all for a microcontroller program that isn't hosted by an OS. :) > > JMGross > > > ------------------------------------------------------------------------------ > Virtualization & Cloud Management Using Capacity Planning > Cloud computing makes use of virtualization - but cloud computing > also focuses on allowing computing to be delivered as a service. > http://www.accelacomm.com/jaw/sfnl/114/51521223/ > _______________________________________________ > Mspgcc-users mailing list > Mspgcc-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mspgcc-users ------------------------------------------------------------------------------ Virtualization & Cloud Management Using Capacity Planning Cloud computing makes use of virtualization - but cloud computing also focuses on allowing computing to be delivered as a service. http://www.accelacomm.com/jaw/sfnl/114/51521223/ _______________________________________________ Mspgcc-users mailing list Mspgcc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mspgcc-users