See previous discussion here[1]. It's unclear to me how to preview HTML page
generated from the .txt file, though.
[1]: https://lists.sr.ht/~mpu/qbe/%3C87cz1jq26k.fsf%40greenfork.me%3E
---
doc/il.txt | 30 ++++++++++++++++++++++++++++--
1 file changed, 28 insertions(+), 2 deletions(-)
diff --git a/doc/il.txt b/doc/il.txt
index cc3e021..b036273 100644
--- a/doc/il.txt+++ b/doc/il.txt
@@ -15,7 +15,7 @@
2. <@ Types >
* <@ Simple Types >
* <@ Subtyping >
- 3. <@ Constants >+ 3. <@ Constants & Values > 4. <@ Linkage >
5. <@ Definitions >
* <@ Aggregate Types >
@@ -168,7 +168,7 @@ The rationale is that a word can be signed or unsigned, so
extending it to a long could be done in two ways, either
by zero-extension, or by sign-extension.
-- 3. Constants+- 3. Constants & Values--------------
`bnf
@@ -182,6 +182,10 @@ by zero-extension, or by sign-extension.
CONST
| 'thread' $IDENT # Thread-local symbol
+ VAL :=+ DYNCONST+ | %IDENT+Constants come in two kinds: compile-time constants and
dynamic constants. Dynamic constants include compile-time
constants and other symbol variants that are only known at
@@ -221,6 +225,10 @@ When the `thread` keyword prefixes a symbol name, the
symbol's numeric value is resolved at runtime in the
thread-local storage.
+Values are used in regular, phi, and jump instructions+within function definitions. They could be either constants+or function-scope temporaries.+- 4. Linkage
------------
@@ -293,6 +301,15 @@ using linkage flags.
'{'
( SUBTY [NUMBER] ),
'}'
+ | # Union type+ 'type' :IDENT '=' ['align' NUMBER]+ '{'+ (+ '{'+ ( SUBTY [NUMBER] ),+ '}'+ )++ '}' | # Opaque type
'type' :IDENT '=' 'align' NUMBER '{' NUMBER '}'
@@ -318,6 +335,15 @@ explicitly specified by the programmer.
type :cryptovector = align 16 { w 4 }
+Union types allows the same chunk of memory to be+reinterpreted using different layouts. They are defined by+enclosing multiple regular aggregate type bodies in another+pair of curly braces. Size and alignment of union types are+determined by the max size and alignment of each variation,+or for the case of alignment, could be explicitly specified.++ type :un9 = { { b } { s } }+Opaque types are used when the inner structure of an
aggregate cannot be specified; the alignment for opaque
types is mandatory. They are defined simply by enclosing
--
2.42.0