3 ms·
One issue with Wasm is you essentially can't target it with a single-pass compiler, unlike just about any real machine. Wasm can only represent reducible contro
by mananaysiempre 2y ago
One issue with Wasm is you essentially can't target it with a single-pass compiler, unlike just about any real machine. Wasm can only represent reducible control flow, so you have to pass your control-flow graph through some variation of the Relooper[1,2]. I don't know if upstream tcc can do that (there are apparently some forks?..).
[1] http://troubles.md/why-do-we-need-the-relooper-algorithm-again/ http://troubles.md/why-do-we-need-the-relooper-algorithm-aga...
[2] https://medium.com/leaningtech/solving-the-structured-control-flow-problem-once-and-for-all-5123117b1ee2 https://medium.com/leaningtech/solving-the-structured-contro...
- titzer 2y ago> you essentially can't target it with a single-pass compiler, That might be true if your source language has goto, but for other languages that start with structured control flow, it's possible to just carry the structure through and emit Wasm directly from the AST.
- alexdovzhanyn 2y agoThis is true. In Theta (https://github.com/ThetaLang/Theta https://github.com/ThetaLang/Theta) this is exactly what we do -- no need for more than one pass for the WASM codegen.
- mananaysiempre 2y agoSure, I was speaking in the context of C specifically. (In non-simplistic compilers, you may not want to preserve the source structure anyway—e.g. in Scheme or Lua with tail calls all over the place.)
- RossBencina 2y agoPresumably C's `switch` is also a problem.
- metadat 2y agoYes, I don't recall all the confusing elements and technicalities of what's allowed in Switch statements in C offhand but here are a few brainfscks: https://old.reddit.com/r/C_Programming/comments/16kg48y/mind_blown_by_switch_statement_syntax_and_labels/ https://old.reddit.com/r/C_Programming/comments/16kg48y/mind... https://old.reddit.com/r/programminghorror/comments/ylc7f3/why_do_c_devs_love_switch_statements_so_much/ https://old.reddit.com/r/programminghorror/comments/ylc7f3/w...
- r1chardnl 2y agoI went down a rabbithole and wow. Found a comment from the author of https://github.com/stclib/STC https://github.com/stclib/STC apparently and then came across this example: https://stackoverflow.com/a/76887723 https://stackoverflow.com/a/76887723 int coro_a(struct a* g) { cco_routine (g) { printf("entering a\n"); for (g->i = 0; g->i < 3; g->i++) { printf("A step %d\n", g->i); cco_yield(); } cco_final: printf("returning from a\n"); } return 0; // done } gcc -E -ISTC/include co.c After running it through a preprocessor, it gives me this. int coro_a(struct a* g) { for (int* _state = &(g)->cco_state; *_state != CCO_STATE_DONE; *_state = CCO_STATE_DONE) _resume: switch (*_state) case 0: { printf("entering a\n"); for (g->i = 0; g->i < 3; g->i++) { printf("A step %d\n", g->i); do { *_state = 14; return CCO_YIELD; goto _resume; case 14:; } while (0); } *_state = CCO_STATE_FINAL; case CCO_STATE_FINAL: printf("returning from a\n"); } return 0; }
- mananaysiempre 2y agoI don’t want to become the switch-statement guy, but neither can I resist, apparently. There are no technicalities in what is allowed in a switch statement: the same things are as with bare gotos. That is, a switch statement is a fancy goto, and case labels are just labels that look a bit funny. Except for the case labels being restricted to inside of the switch body, nesting doesn’t really come into it. So then the question becomes, which things are you allowed to jump over? In C++, I don’t really know, the restrictions seem fairly stringent. In C, you can jump over anything except a declaration using a variably modified type (i.e. a variable-length array, a pointer to one, etc.), but keep in mind that the variables whose declarations you’ve jumped over will be uninitialized even if the declaration does have an initializer.