diff options
| author | 2022-08-13 13:00:37 +0200 | |
|---|---|---|
| committer | 2022-08-13 13:00:37 +0200 | |
| commit | a4ddca68662f4bc0531763357b4bc00b6c50b456 (patch) | |
| tree | 97f83407da049732ec97dd2d32ee34e0cd3c8c0f /src | |
| parent | 5b95abb249604e7df9be1d63b1f3dc85b8f5990b (diff) | |
target
Diffstat (limited to 'src')
| -rw-r--r-- | src/all.hff | 39 | ||||
| -rw-r--r-- | src/main.cff | 3 | ||||
| -rw-r--r-- | src/targ.cff | 28 | ||||
| -rw-r--r-- | src/type.cff | 30 | ||||
| -rw-r--r-- | src/util.cff | 4 |
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; |