<div dir="ltr"><div class="gmail_quote"><br><div dir="ltr"><div>When I talked to Rob about the original qcc project, I basically found that there are some licensing issues -- because there was additional code in tinycc that Fabrice did not have permission to relicense. We basically agreed that starting over with a complete rewrite and a new license was likely to be the best path.</div><div><br></div><div>When you start over, of course that brings in the concept of making some fairly major design choices. Rob wants to leverage the backend of QEMU (TCG) that was written by Fabrice, and turn it into the backend for qcc. I looked at that code, and the output is not sufficiently optimized for my purposes. Rob doesn't particularly want optimization, but I have a register allocation process that I absolutely want implemented in the copy of the compiler that I run.</div><div><br></div><div>So to get what we both want, I figured I'd make the code modular. So the frontend tokenizes the code very efficiently, and then you pick your own backend to convert the tokenized stream into machine code. He can pick the QEMU backend, and I can pick my optimizing backend. If I give everybody a functional fast tiny C compiler with a BSD/MIT/CC0 license, then they can spend a small amount of time tweaking their chosen backend to suit their purposes.</div><div><br></div>I got 95% of the way toward tokenizing the input C code, but I got stuck deciding how to process the infinitely deep recursions of new instances of anonymous structs being declared inside typedefs inside function declarations, with struct elements based on typedefs containing other struct definitions, .... Infinitely deep recursions are always a problem, but when I looked deeply into it, this particular aspect of ANSI C explodes in a really ugly way.<div><br></div><div>But since I do not have a fully tokenized input stream, I could not effectively create the backends or the interfaces to them.<br><div><br></div><div>So what I am currently doing is creating a simplified language that does not allow that sort of circular struct/typedeffing. I am building a compiler for that, which will allow me to finish writing the interface to the backends, and the interface between the frontend and the backends. Once I have those parts built, tested, and running, and I know exactly what I need the inputs to look like -- then I can go back and create some sort of kludge for dealing with the struct/typedef recursion mess -- probably in an incomplete way.</div><div><br></div><div>But yes, tl;dr -- I got stuck in the way I was approaching it logically, and it's going to take me a while longer.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Bruce Ewing</div><div><br></div></font></span></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br></div>
</div></div></div><br></div>