<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><div>The jmpbuf/alloca fix?</div><div><br></div><div><br></div><div>For reference, here is most of the undo:</div><div>http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-sys/m3front/src/misc/Marker.m3.diff?r1=1.9;r2=1.10;f=u</div><div>or </div><div>http://modula3.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-sys/m3front/src/misc/Marker.m3.diff?r1=1.9;r2=1.10</div><div><br></div><div><br></div><div>I had generated code like:</div><div><br></div><div><br></div><div>old:</div><div>char buf[sizeof(jmpbuf)]; // frontend knows sizeof(jmpbuf) -- the portability problem to be solved </div><div>TRY => setjmp(buf);</div><div><br></div><div><br></div><div>new:</div><div>jmpbuf* buf;</div><div>extern const size_t Csetjmp__Jumpbuf_size/* = sizeof(jmp_buf)*/; *)</div><div>TRY => buf = m3_alloca(sizeof(Csetjmp__Jumpbuf_size)); setjmp(buf);</div><div>=> alloca for every TRY, even if TRY in a loop, not good</div><div><br></div><div><br></div><div>Understanding that is a further de-optimization, how about I just do:</div><div>jmpbuf* buf;</div><div>TRY => buf = buf ? buf : alloca(sizeof(jmpbuf)); setjmp(buf);</div><div><br></div><div><br></div><div>?</div><div><br></div><div><br></div><div>It seems easy enough?</div><div><br></div><div><br></div><div>furthermore, let's think ahead to the C and maybe C++ backends?</div><div><br></div><div><br></div><div>The portable slightly optimizing C backend will go back to jmpbuf, no alloca.</div><div>The optimizing C++ backend will try to use native C++ exception handling.</div><div>And/or the optimizing C-for-NT backend will use __try/__except/__finally.</div><div><br></div><div><br></div><div>Should I start/end "buf" with some distinguished name?</div><div>So some backends will remove it, in favor of whatever they do better?</div><div>Should "m3_alloca" be named something more specific like "m3_alloca_for_try"?</div><div>Again, so it is easier to backends to recognize and remove?</div><div>i.e. one of the first optimizations the C backend should make is</div><div>to #include <setjmp.h> and change these to jmpbuf.</div><div><br></div><div><br></div><div>Should we invent a higher level interface?</div><div>Should we do "both", make low level and high level calls to the backend?</div><div>It will chose to ignore one set?</div><div>But the low level calls need to be altered at least a little bit.</div><div>Like the locals and the calls will have a flag or a boolean indicating</div><div>they are "exception handling related"?</div><div><br></div><div><br></div><div>Am I making sense?</div><div><br></div><div><br></div><div>Thanks,</div><div> - Jay</div><br><br>                                      </div></body>
</html>