summaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
new file mode 100644
index 0000000..c8f414e
--- /dev/null
+++ b/src/codegen.zig
@@ -0,0 +1,36 @@
+const std = @import("std");
+const parse = @import("parser.zig");
+
+pub const Generator = struct {
+ root: parse.NodeExit,
+ allocator: std.mem.Allocator,
+ code: std.ArrayList(u8),
+
+ pub fn init(allocator: std.mem.Allocator, root: parse.NodeExit) Generator {
+ return .{
+ .root = root,
+ .allocator = allocator,
+ .code = std.ArrayList(u8).init(allocator),
+ };
+ }
+
+ fn genExit(self: *Generator) ![]const u8 {
+ return try std.fmt.allocPrint(self.allocator,
+ \\ mov rax, 60
+ \\ mov rdi, {}
+ \\ syscall
+ \\
+ , .{self.root.expr.intLit.intLit});
+ }
+
+ pub fn generate(self: *Generator) ![]const u8 {
+ try self.code.appendSlice(
+ \\global _start:
+ \\
+ );
+ const exitStmt = try self.genExit();
+ defer self.allocator.free(exitStmt);
+ try self.code.appendSlice(exitStmt);
+ return try self.code.toOwnedSlice();
+ }
+};