aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2022-08-13 13:00:37 +0200
committerlemon <lsof@mailbox.org>2022-08-13 13:00:37 +0200
commita4ddca68662f4bc0531763357b4bc00b6c50b456 (patch)
tree97f83407da049732ec97dd2d32ee34e0cd3c8c0f /src
parent5b95abb249604e7df9be1d63b1f3dc85b8f5990b (diff)
target
Diffstat (limited to 'src')
-rw-r--r--src/all.hff39
-rw-r--r--src/main.cff3
-rw-r--r--src/targ.cff28
-rw-r--r--src/type.cff30
-rw-r--r--src/util.cff4
5 files changed, 93 insertions, 11 deletions
diff --git a/src/all.hff b/src/all.hff
index ff74ab7..63ca996 100644
--- a/src/all.hff
+++ b/src/all.hff
@@ -90,20 +90,17 @@ struct Type {
align usize,
konst bool,
id uint,
- t enum union {
- void,
- bool,
- int struct { sgn bool },
- flo,
- ptr *Type,
- arr struct { child *Type, length i64 },
- slice *Type,
+ u enum union {
+ Void,
+ Bool,
+ Int struct { sgn bool },
+ Flo,
+ Ptr *Type,
+ Arr struct { child *Type, length i64 },
+ Slice *Type,
}
}
-struct Decl {
-}
-
struct Parser {
fp *FILE,
curfile *const u8,
@@ -115,6 +112,19 @@ struct Parser {
}
+struct Targ {
+ name *const u8,
+ ptrsize u8,
+ intsize u8,
+ longsize u8, longalign u8,
+ llongsize u8, llongalign u8,
+ sizesize u8,
+ f64align u8,
+ valistsize u8, valistalign u8,
+ charsigned bool,
+ shortenum bool,
+}
+
// parse.cff
extern fn parser_init(*Parser, path *const u8) void;
extern fn parse(*Parser) [#]Decl;
@@ -127,6 +137,7 @@ extern fn xstrdup(str *const u8) *u8;
def FNV1A_INI u32 = 0x811c9dc5;
extern fn fnv1a(h u32, [#]const u8) u32;
extern fn fnv1a_s(h u32, *const u8) u32;
+extern fn fnv1a_i(h u32, i64) u32;
extern fn addfilepath(*const u8) int;
extern fn fatal(*Parser, Loc, fmt *const u8, ...) void;
extern fn internstr(*const u8) *const u8;
@@ -137,6 +148,12 @@ extern fn pfmt(proc *fn(u8, *void) void, parg *void, fmt *const u8, ...) void;
extern fn vefmt(fmt *const u8, ap va_list) void;
extern fn efmt(fmt *const u8, ...) void;
+// type.cff
+
+// targ.cff
+extern static g_targ *const Targ;
+extern fn targ_ini(name *const u8) bool;
+
// Inline functions
fn bswap32(x u32) u32 {
return (x >> 24)
diff --git a/src/main.cff b/src/main.cff
index cfb6390..596a411 100644
--- a/src/main.cff
+++ b/src/main.cff
@@ -5,6 +5,9 @@ import "vec.hff";
extern fn main(argc int, argv **u8) int {
assert(argc > 1, "args?");
+ targ_ini("amd64-sysv");
+ assert(g_targ != #null, "target?");
+
let p = Parser {};
parser_init(&p, argv[1]);
parse(&p);
diff --git a/src/targ.cff b/src/targ.cff
new file mode 100644
index 0000000..6490dff
--- /dev/null
+++ b/src/targ.cff
@@ -0,0 +1,28 @@
+import "all.hff";
+
+static const targs []const Targ = {
+ {
+ "amd64-sysv",
+ .ptrsize: 8,
+ .intsize: 4,
+ .longsize: 8, .longalign: 8,
+ .llongsize: 8, .llongalign: 8,
+ .sizesize: 8,
+ .f64align: 8,
+ .valistsize: 24, .valistalign: 8,
+ .charsigned: #t,
+ .shortenum: #f,
+ }
+};
+
+extern static g_targ *const Targ = {};
+
+extern fn targ_ini(name *const u8) bool {
+ foreach(targ, i, targs[0::],
+ if streq(name, targ.name) {
+ g_targ = &targs[i];
+ return #t;
+ }
+ )
+ return #f;
+}
diff --git a/src/type.cff b/src/type.cff
new file mode 100644
index 0000000..bd56503
--- /dev/null
+++ b/src/type.cff
@@ -0,0 +1,30 @@
+import "all.hff";
+
+fn hashtype(ty *const Type) u32 {
+ let h = FNV1A_INI;
+ h = fnv1a_i(h, ty.konst ? 1 : 0);
+ switch ty.u {
+ case Void; case Bool;
+
+ case Flo;
+ h = fnv1a_i(h, ty.size);
+ h = fnv1a_i(h, ty.align);
+
+ case Int i;
+ h = fnv1a_i(h, i.sgn ? 1 : 0);
+ h = fnv1a_i(h, ty.size);
+ h = fnv1a_i(h, ty.align);
+
+ case Ptr child;
+ h = fnv1a_i(h, child.id);
+
+ case Arr arr;
+ h = fnv1a_i(h, arr.child.id);
+ h = fnv1a_i(h, arr.length);
+
+ case Slice child;
+ h = fnv1a_i(h, child.id);
+
+ }
+ return h;
+}
diff --git a/src/util.cff b/src/util.cff
index 9bb5db9..926b1e4 100644
--- a/src/util.cff
+++ b/src/util.cff
@@ -41,6 +41,10 @@ extern fn fnv1a_s(h u32, str *const u8) u32 {
return h;
}
+extern fn fnv1a_i(h u32, x i64) u32 {
+ return fnv1a(h, (as(*u8)&x)[0::8]);
+}
+
static filepaths [64]*const u8 = {};
static nfilepaths int = 0;