aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTravis Staloch <twostepted@gmail.com>2022-12-13 13:55:59 -0800
committerAndrew Kelley <andrew@ziglang.org>2022-12-16 06:08:10 -0500
commit1ebb7612445c1b0b0d76c73d17f18254e0d9efab (patch)
tree3b1c24935473e23a374f90780864b040515e2042 /src
parent8a0a6b7387fcd0017db85de14793abfd6ec7f6e5 (diff)
downloadzig-1ebb7612445c1b0b0d76c73d17f18254e0d9efab.tar.gz
zig-1ebb7612445c1b0b0d76c73d17f18254e0d9efab.zip
codegen - lower str_lit to vector
Diffstat (limited to 'src')
-rw-r--r--src/codegen.zig8
-rw-r--r--src/codegen/llvm.zig26
2 files changed, 34 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index bc50f36041..e8dd661684 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -854,6 +854,14 @@ pub fn generateSymbol(
}
return Result{ .appended = {} };
},
+ .str_lit => {
+ const str_lit = typed_value.val.castTag(.str_lit).?.data;
+ const mod = bin_file.options.module.?;
+ const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
+ try code.ensureUnusedCapacity(str_lit.len);
+ code.appendSliceAssumeCapacity(bytes);
+ return Result{ .appended = {} };
+ },
else => unreachable,
},
else => |t| {
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 670efa6d0c..cccc0ff85c 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -3882,6 +3882,32 @@ pub const DeclGen = struct {
@intCast(c_uint, llvm_elems.len),
);
},
+ .str_lit => {
+ // Note, sentinel is not stored
+ const str_lit = tv.val.castTag(.str_lit).?.data;
+ const bytes = dg.module.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
+ const vector_len = @intCast(usize, tv.ty.arrayLen());
+ assert(vector_len == bytes.len);
+
+ const elem_ty = tv.ty.elemType();
+ const llvm_elems = try dg.gpa.alloc(*llvm.Value, vector_len);
+ defer dg.gpa.free(llvm_elems);
+ for (llvm_elems) |*elem, i| {
+ var byte_payload: Value.Payload.U64 = .{
+ .base = .{ .tag = .int_u64 },
+ .data = bytes[i],
+ };
+
+ elem.* = try dg.lowerValue(.{
+ .ty = elem_ty,
+ .val = Value.initPayload(&byte_payload.base),
+ });
+ }
+ return llvm.constVector(
+ llvm_elems.ptr,
+ @intCast(c_uint, llvm_elems.len),
+ );
+ },
else => unreachable,
},