aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorIsaac Freund <ifreund@ifreund.xyz>2020-08-18 18:30:48 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-08-19 02:05:01 +0200
commitfe3aa4ccd0bc157e1dd9d84b7c57b0cb2f0a77a9 (patch)
tree9412eed471ec13ed1649ee3348f6d62e802202a9 /src/ir.cpp
parent741fb8d30675f85316f7df100801e7cf8c2b3194 (diff)
downloadzig-fe3aa4ccd0bc157e1dd9d84b7c57b0cb2f0a77a9.tar.gz
zig-fe3aa4ccd0bc157e1dd9d84b7c57b0cb2f0a77a9.zip
stage2/wasm: do incremental compilation in-memory
Before this commit the wasm backend worked similarly to elf. As functions were generated they were written directly to the output file and existing code was shifted around in the file as necessary. This approach had several disadvantages: - Large amounts of padding in the output were necessary to avoid expensive copying of data within the file. - Function/type/global/etc indexes were required to be known at the time of preforming codegen, which severely limited the flexibility of where code could be placed in the binary - Significant complexity to track the state of the output file through incremental updates This commit takes things in a different direction. Code is incrementally compiled into in-memory buffers and the entire binary is rewritten using these buffers on flush. This has several advantages: - Significantly smaller resulting binaries - More performant resulting binaries due to lack of indirection - Significantly simpler compiler code - Indexes no longer need to be known before codegen. We can track where Decls must be referenced by index insert the proper indexes while writing the code in the flush() function. This is not yet implemented but is planned for the next commit. The main disadvantage is of course increased memory usage in order to store these buffers of generated code.
Diffstat (limited to 'src/ir.cpp')
0 files changed, 0 insertions, 0 deletions