authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-21 01:20:01-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-21 01:20:01-04:00
log8e0bcaca9b597f510eae2b3ed7423b84a904beb8
tree1e763573d51749668c5a16a94a21bf504318017e
parent4c7507ccebc8b1c03643219dfa45ece668c62993

ir: analyze str instruction


2 files changed, 29 insertions(+), 2 deletions(-)

src-self-hosted/ir.zig+28-1
......@@ -187,9 +187,36 @@ const Analyze = struct {
187187 });
188188 }
189189
190 fn constStr(self: *Analyze, src_offset: usize, str: []const u8) !*Inst {
191 const array_payload = try self.arena.allocator.create(Type.Payload.Array_u8_Sentinel0);
192 array_payload.* = .{ .len = str.len };
193
194 const ty_payload = try self.arena.allocator.create(Type.Payload.SingleConstPointer);
195 ty_payload.* = .{ .pointee_type = Type.initPayload(&array_payload.base) };
196
197 const bytes_payload = try self.arena.allocator.create(Value.Payload.Bytes);
198 bytes_payload.* = .{ .data = str };
199
200 const const_inst = try self.arena.allocator.create(Inst.Constant);
201 const_inst.* = .{
202 .base = .{
203 .tag = Inst.Constant.base_tag,
204 .ty = Type.initPayload(&ty_payload.base),
205 .src_offset = src_offset,
206 },
207 .val = Value.initPayload(&bytes_payload.base),
208 };
209 return &const_inst.base;
210 }
211
190212 fn analyzeDecl(self: *Analyze, old_inst: *text.Inst) !*Inst {
191213 switch (old_inst.tag) {
192 .str => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}),
214 .str => {
215 // We can use this reference because Inst.Const's Value is arena-allocated.
216 // The value would get copied to a MemoryCell before the `text.Inst.Str` lifetime ends.
217 const bytes = old_inst.cast(text.Inst.Str).?.positionals.bytes;
218 return self.constStr(old_inst.src_offset, bytes);
219 },
193220 .int => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}),
194221 .ptrtoint => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}),
195222 .fieldptr => return self.fail(old_inst.src_offset, "TODO implement analyzing {}", .{@tagName(old_inst.tag)}),
src-self-hosted/value.zig+1-1
......@@ -135,7 +135,7 @@ pub const Value = extern union {
135135
136136 pub const Bytes = struct {
137137 base: Payload = Payload{ .tag = .bytes },
138 data: []u8,
138 data: []const u8,
139139 };
140140
141141 pub const Ty = struct {