From 8e0bcaca9b597f510eae2b3ed7423b84a904beb8 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 21 Apr 2020 01:20:01 -0400 Subject: [PATCH] ir: analyze str instruction --- src-self-hosted/ir.zig | 29 ++++++++++++++++++++++++++++- src-self-hosted/value.zig | 2 +- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src-self-hosted/ir.zig b/src-self-hosted/ir.zig index affcb34e39..a36a745f87 100644 --- a/src-self-hosted/ir.zig +++ b/src-self-hosted/ir.zig @@ -187,9 +187,36 @@ const Analyze = struct { }); } + fn constStr(self: *Analyze, src_offset: usize, str: []const u8) !*Inst { + const array_payload = try self.arena.allocator.create(Type.Payload.Array_u8_Sentinel0); + array_payload.* = .{ .len = str.len }; + + const ty_payload = try self.arena.allocator.create(Type.Payload.SingleConstPointer); + ty_payload.* = .{ .pointee_type = Type.initPayload(&array_payload.base) }; + + const bytes_payload = try self.arena.allocator.create(Value.Payload.Bytes); + bytes_payload.* = .{ .data = str }; + + const const_inst = try self.arena.allocator.create(Inst.Constant); + const_inst.* = .{ + .base = .{ + .tag = Inst.Constant.base_tag, + .ty = Type.initPayload(&ty_payload.base), + .src_offset = src_offset, + }, + .val = Value.initPayload(&bytes_payload.base), + }; + return &const_inst.base; + } + fn analyzeDecl(self: *Analyze, old_inst: *text.Inst) !*Inst { switch (old_inst.tag) { - .str => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), + .str => { + // We can use this reference because Inst.Const's Value is arena-allocated. + // The value would get copied to a MemoryCell before the `text.Inst.Str` lifetime ends. + const bytes = old_inst.cast(text.Inst.Str).?.positionals.bytes; + return self.constStr(old_inst.src_offset, bytes); + }, .int => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), .ptrtoint => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), .fieldptr => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}), diff --git a/src-self-hosted/value.zig b/src-self-hosted/value.zig index a6a7ebc76d..12fabfd811 100644 --- a/src-self-hosted/value.zig +++ b/src-self-hosted/value.zig @@ -135,7 +135,7 @@ pub const Value = extern union { pub const Bytes = struct { base: Payload = Payload{ .tag = .bytes }, - data: []u8, + data: []const u8, }; pub const Ty = struct {