aboutsummaryrefslogtreecommitdiff
path: root/type.go
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-09-06 13:19:22 +0200
committerHimbeer <himbeer@disroot.org>2024-09-06 13:56:07 +0200
commit959599b7bf803a91595375f650245609bf7a338f (patch)
tree47aafa8d49e00e45c0cb25255c8486eeec763692 /type.go
parent05c620c4d637b73f6b267ed57d5750587ccfd7a3 (diff)
Add basic type system with only integers
This commit adds static typing with signed and unsigned integers of 8, 16, 32 and 64 bits.
Diffstat (limited to 'type.go')
-rw-r--r--type.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/type.go b/type.go
new file mode 100644
index 0000000..d677472
--- /dev/null
+++ b/type.go
@@ -0,0 +1,102 @@
+// SPDX-FileCopyrightText: 2024 Himbeer <himbeer@disroot.org>
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package main
+
+import "fmt"
+
+type cerType interface {
+ fmt.Stringer
+ qbeBaseType() string
+ qbeExtType() string
+ qbeABIType() string
+}
+
+type cerInteger struct {
+ bits int
+ unsigned bool
+}
+
+func (c cerInteger) String() string {
+ unsigned := ""
+ if c.unsigned {
+ unsigned = "u"
+ }
+
+ return fmt.Sprintf("%sint%d", unsigned, c.bits)
+}
+
+func (c cerInteger) qbeBaseType() string {
+ switch {
+ case c.bits > 32:
+ return "l"
+ default:
+ return "w"
+ }
+}
+
+func (c cerInteger) qbeExtType() string {
+ switch {
+ case c.bits > 32:
+ return "l"
+ case c.bits > 16:
+ return "w"
+ case c.bits > 8:
+ return "h"
+ default:
+ return "b"
+ }
+}
+
+func (c cerInteger) qbeABIType() string {
+ signedness := "s"
+ if c.unsigned {
+ signedness = "u"
+ }
+
+ switch {
+ case c.bits > 32:
+ return "l"
+ case c.bits > 16:
+ return "w"
+ case c.bits > 8:
+ return signedness + "h"
+ default:
+ return signedness + "b"
+ }
+}
+
+func resolveType(name string) cerType {
+ switch name {
+ case "int8":
+ return cerInteger{bits: 8}
+ case "uint8":
+ return cerInteger{bits: 8, unsigned: true}
+ case "int16":
+ return cerInteger{bits: 16}
+ case "uint16":
+ return cerInteger{bits: 16, unsigned: true}
+ case "int32":
+ return cerInteger{bits: 32}
+ case "uint32":
+ return cerInteger{bits: 32, unsigned: true}
+ case "int64":
+ return cerInteger{bits: 64}
+ case "uint64":
+ return cerInteger{bits: 64, unsigned: true}
+ default:
+ return nil
+ }
+}
+
+var (
+ cerInt8 = cerInteger{bits: 8}
+ cerUint8 = cerInteger{bits: 8, unsigned: true}
+ cerInt16 = cerInteger{bits: 16}
+ cerUint16 = cerInteger{bits: 16, unsigned: true}
+ cerInt32 = cerInteger{bits: 32}
+ cerUint32 = cerInteger{bits: 32, unsigned: true}
+ cerInt64 = cerInteger{bits: 64}
+ cerUint64 = cerInteger{bits: 64, unsigned: true}
+)