summaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2024-08-06 02:24:04 -0500
committerNic Gaffney <gaffney_nic@protonmail.com>2024-08-06 02:24:04 -0500
commit6a7467264b506e5812b2d9a8cd55fa307f2b5a10 (patch)
tree97c136f9f65a575d940f647b7c2130b3454fa88d /src/main.zig
parentf8542ab4c65d64e7713063460d750901e7b0362d (diff)
downloadcalico-6a7467264b506e5812b2d9a8cd55fa307f2b5a10.tar.gz
ok so i messed up
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/main.zig b/src/main.zig
index 53421f4..248640b 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -31,7 +31,7 @@ pub fn main() !void {
if (err != error.PathAlreadyExists) return err;
// Setup native code writer
- const outFileName = try getFileName(allocator, out_name, "asm");
+ const outFileName = try getFileName(allocator, out_name, "ll");
defer allocator.free(outFileName);
const outfile = try std.fs.cwd().createFile(outFileName, .{});
const outWriter = outfile.writer();
@@ -47,11 +47,15 @@ pub fn main() !void {
const tokens = try tokenizer.tokenize();
// Parse
- var symbTable = try symb.SymbolTable.init(allocator);
+ var symbTable = try initSymbolTable(allocator);
defer symbTable.deinit();
- var parser = parse.Parser.init(allocator, tokens, &symbTable);
+
+ var parser = parse.Parser.init(allocator, tokens, symbTable);
defer parser.deinit();
const tree = try parser.parse();
+ var pop = symb.Populator.init(allocator);
+ var treeNode = tree.asNode();
+ try pop.populateSymtable(&treeNode);
// Codegen
var generator = gen.Generator.init(allocator, tree);
@@ -59,18 +63,9 @@ pub fn main() !void {
const code = try generator.generate();
try outWriter.writeAll(code);
- // Run nasm and ld to build the executable
- // TODO: switch to qbe or llvm (preferabbly qbe)
- const nasmargv = [_][]const u8{ "nasm", "-felf64", outFileName };
- const nasmproc = try std.process.Child.run(.{ .argv = &nasmargv, .allocator = allocator });
- defer allocator.free(nasmproc.stdout);
- defer allocator.free(nasmproc.stderr);
-
- const ldFile = try getFileName(allocator, out_name, "o");
- defer allocator.free(ldFile);
const binFile = try getFileName(allocator, out_name, "");
defer allocator.free(binFile);
- const ldargv = [_][]const u8{ "ld", "-o", binFile, ldFile };
+ const ldargv = [_][]const u8{ "clang", "-o", binFile, outFileName };
const ldproc = try std.process.Child.run(.{ .argv = &ldargv, .allocator = allocator });
defer allocator.free(ldproc.stdout);
defer allocator.free(ldproc.stderr);
@@ -82,3 +77,10 @@ inline fn getFileName(allocator: std.mem.Allocator, out_name: []const u8, fileTy
if (fileType.len == 0) hasDot = "";
return try std.fmt.allocPrint(allocator, "calico-out/{s}{s}{s}", .{ out_name, hasDot, fileType });
}
+
+pub fn initSymbolTable(allocator: std.mem.Allocator) !*symb.SymbolTable {
+ var table = try symb.SymbolTable.init(allocator);
+ const intSymb: symb.SymbType = symb.SymbType.Integer;
+ if (!try table.insert("i32", intSymb.toSymb())) return error.FailedToInsert;
+ return table;
+}