Difference between revisions of "WebAssembly/Roadmap"

From Lazarus wiki
(Short-Term)
(Long-Term)
Line 84: Line 84:
 
|There's experimental DWARF support for WebAssembly, but it isn't working yet and the debugging tools for WebAssembly aren't very mature at this point even for C and C++.
 
|There's experimental DWARF support for WebAssembly, but it isn't working yet and the debugging tools for WebAssembly aren't very mature at this point even for C and C++.
  
 +
There's an LLVM linker bug, related to generating linker map files: [https://bugs.llvm.org/show_bug.cgi?id=48972]
 
|-
 
|-
 
|Internal Writer
 
|Internal Writer

Revision as of 23:15, 14 March 2021

Short-Term

These steps are critical for completion in order to have wasm a full scope CPU target for FPC compiler

Feature Status Description
Assembly (textual wasm) working Pick an assembler utility that's sequence instruction (FPC) friendly

FPC should produce a textual assembly file.

Currently, FPC uses the LLVM assembler llvm-mc.

Linking working Pick an linker utility that's sequence instruction (FPC) friendly.

Linker is a moving target. As a new feature is added, the linking needs to be re-verified.

Currently, FPC uses the LLVM linker.

Basic function calls and local variables working Implement direct function calls, with passing basic parameters (that don't require any memory. I.e. int and floats)
Verify float-point values in progress As the float points are being converted from the textual format. it's necessary to make sure that the proper values are generated
Global variables working Implement symbol reference to global variables (basic or complex)

Consider linking - as the index of symbols can change. (Wasm binaries are index based )

Stack/Call frame support working WebAssembly doesn't have any native stack and/or frame support.

It has to be emulated using global and local variables.

Blocking issue: https://github.com/WebAssembly/wabt/issues/1199

Indirect function calls working WebAssembly has a specific way of indirect calls

Needed for vmt and procedure variables (callback) calls

VMT working Support for calls via virtual method table
RTL.Memory Manager working
RTL.(Ansi/Wide) String Manager working
RTL.WASI.Console I/O working Standard input, standard output and error output (stderr) works on the WASI target.
RTL.WASI.File I/O in progress The WASI target needs a mechanism for converting path names (both relative and absolute) to paths, relative to a given set of preopened directories (these are the directories you're given access to). Also, the concept of current directory needs to be emulated, too.

Relevant upstream development to follow: [1]

Long-Term

Future improvements for wasm target. Some of those are nice to have, but not critical. Others are difficult to implement or need features of WebAssembly, which haven't been standardized yet.

Feature Status Description
Debug Info in progress There's experimental DWARF support for WebAssembly, but it isn't working yet and the debugging tools for WebAssembly aren't very mature at this point even for C and C++.

There's an LLVM linker bug, related to generating linker map files: [2]

Internal Writer not implemented The binary wasm format is well defined and could be implemented within FPC
Internal Linker not implemented
GOTO support not implemented Goto is difficult to implement, due to WebAssembly's lack of labels and jumps. It requires all gotos to be converted to structured flow, such as loops and break/continue. This requires implementing a complex algorithm, such as Relooper or Stackifier. Useful read: [3]
Exceptions support not implemented Exceptions for WebAssembly are not standardized yet. FPC's default implementation relies on setjmp/longjmp, which are not available in WebAssembly.

See Also