Difference between revisions of "WebAssembly/Globals"

From Lazarus wiki
Jump to navigationJump to search
Line 7: Line 7:
 
* their address cannot be taken
 
* their address cannot be taken
 
* in a multithreaded environment, they are usually not shared between threads, i.e. they behave like threadvars
 
* in a multithreaded environment, they are usually not shared between threads, i.e. they behave like threadvars
 +
 +
== Special WebAssembly globals ==
 +
 +
Free Pascal already creates and uses some WebAssembly globals, which are considered special and are part of the Basic C ABI, which Free Pascal supports.
 +
 +
=== __stack_pointer ===
 +
 +
WebAssembly has an evaluation stack, which holds local variables, stack frames and temporary values. However, this stack is not visible in linear memory. This means that you cannot take the address of a value on this stack. Another restriction is that it can only hold the 4 basic WebAssembly types (int32, int64, float32, float64). To avoid these restrictions, Free Pascal maintains a second stack in linear memory. The WebAssembly global ''__stack_pointer'' points to the top of this stack. It is always 16-byte aligned.
 +
 +
=== TLS-related globals ===
 +
TBD
  
 
[[Category:WebAssembly]]
 
[[Category:WebAssembly]]

Revision as of 14:28, 22 July 2022

WebAssembly supports a feature, called "global variables" or just "globals". They differ from global variables in Pascal. This page discusses the possibility of extending FPC, in order to be able to declare WebAssembly globals from Pascal code.

Differences between Pascal global variables and WebAssembly globals

WebAssembly globals have the following restrictions:

  • they can be only one of 4 types - 32-bit int, 64-bit int, single (float32) or double (float64)
  • their address cannot be taken
  • in a multithreaded environment, they are usually not shared between threads, i.e. they behave like threadvars

Special WebAssembly globals

Free Pascal already creates and uses some WebAssembly globals, which are considered special and are part of the Basic C ABI, which Free Pascal supports.

__stack_pointer

WebAssembly has an evaluation stack, which holds local variables, stack frames and temporary values. However, this stack is not visible in linear memory. This means that you cannot take the address of a value on this stack. Another restriction is that it can only hold the 4 basic WebAssembly types (int32, int64, float32, float64). To avoid these restrictions, Free Pascal maintains a second stack in linear memory. The WebAssembly global __stack_pointer points to the top of this stack. It is always 16-byte aligned.

TLS-related globals

TBD