[Coco] CC issue

James Jones jejones3141 at gmail.com
Mon Nov 11 21:19:15 EST 2019


C compilers of that day were typically recursive descent parsers (with
operator precedence for expressions given all the various operators and
precedence levels). Seeing the right brace ought to make it emit the code
for the loop. To get the problem described, something would have to make
the lexical scanner try to get the next token before returning the right
brace--that's what it would take to force the assembly language insert to
be processed before the loop end code is emitted.

On Thu, Nov 7, 2019 at 11:52 PM Walter Zambotti <zambotti at iinet.net.au>
wrote:

> I found a small issue in both c.pass1/2 and o c_comp.
>
>
>
> In the following demonstrative code (which is not meant to be logical):
>
>
>
> main()
>
> {
>
>   int I;
>
>   while(i++) { i--;}
>
> #asm
>
>   clra
>
>   clrb
>
> #endasm
>
>   i = i + 1;
>
> }
>
>
>
> The asm code is incorrectly placed inside the while loop.
>
>
>
> This occurs because the compiler is looking for a semicolon after the loop
> block.  Which of course is not required and is tolerated.
>
> However while it is looking for the semicolon if it comes across any
> comments it outputs them immediately doing so before it has
> finalised the output for the loop.
>
>
>
> This issue does effect program execution.
>
>
>
> The easy work around is to place an extraneous semicolon after the loop
> block like so:
>
>
>
>   while(i++) { i--;};
>
> or
>
> while(i++) i++;;
>
>
>
> This forces the compiler to place the asm code after the loop as expected.
>
>
>
> This occurs for any statement block that contains exit logic such as:
>
>
>
> While, for, switch
>
>
>
> This also affects C lines added as comments to the assembly.  The C comment
> lines appear out of context to their respective asm.
>
>
>
> This last issue does not effect program execution but makes it difficult to
> use the assembly listing to debug your code.
>
>
>
> I have traced through c.comp extensively and the fix would not be easy.
>
>
>
> I did however manage to add a fix to c.prep so that it outputs a semicolon
> before any asm code.  This seems to fix the
> issue but would need extensive testing.
>
>
>
> Walter
>
>
> --
> Coco mailing list
> Coco at maltedmedia.com
> https://pairlist5.pair.net/mailman/listinfo/coco
>


More information about the Coco mailing list