diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-03-15 00:40:32 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-03-15 00:40:32 -0400 |
| commit | a2a5d3c2885cacf16d55d7943d10a81a5dc31b8a (patch) | |
| tree | 1061a7063f360df1f547a959ca174bda4d9db02f /src | |
| parent | c757f197903940115c1d42883240ec1fe7ef660c (diff) | |
| parent | 67647154c1c307dcf34413d013e6cd4a1df81945 (diff) | |
| download | zig-a2a5d3c2885cacf16d55d7943d10a81a5dc31b8a.tar.gz zig-a2a5d3c2885cacf16d55d7943d10a81a5dc31b8a.zip | |
Merge pull request #11167 from mitchellh/codegen-arrays
stage2: codegen of arrays should use type length, not value length
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen.zig | 25 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 7 |
2 files changed, 11 insertions, 21 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 1a30738b07..6d5e140dca 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -207,29 +207,18 @@ pub fn generateSymbol( .bytes => { // TODO populate .debug_info for the array const payload = typed_value.val.castTag(.bytes).?; - if (typed_value.ty.sentinel()) |sentinel| { - try code.ensureUnusedCapacity(payload.data.len + 1); - code.appendSliceAssumeCapacity(payload.data); - switch (try generateSymbol(bin_file, src_loc, .{ - .ty = typed_value.ty.elemType(), - .val = sentinel, - }, code, debug_output, reloc_info)) { - .appended => return Result{ .appended = {} }, - .externally_managed => |slice| { - code.appendSliceAssumeCapacity(slice); - return Result{ .appended = {} }; - }, - .fail => |em| return Result{ .fail = em }, - } - } else { - return Result{ .externally_managed = payload.data }; - } + const len = @intCast(usize, typed_value.ty.arrayLenIncludingSentinel()); + // The bytes payload already includes the sentinel, if any + try code.ensureUnusedCapacity(len); + code.appendSliceAssumeCapacity(payload.data[0..len]); + return Result{ .appended = {} }; }, .aggregate => { // TODO populate .debug_info for the array const elem_vals = typed_value.val.castTag(.aggregate).?.data; const elem_ty = typed_value.ty.elemType(); - for (elem_vals) |elem_val| { + const len = @intCast(usize, typed_value.ty.arrayLenIncludingSentinel()); + for (elem_vals[0..len]) |elem_val| { switch (try generateSymbol(bin_file, src_loc, .{ .ty = elem_ty, .val = elem_val, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 4d59b73f20..7c4455f296 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1550,7 +1550,7 @@ pub const DeclGen = struct { const bytes = tv.val.castTag(.bytes).?.data; return dg.context.constString( bytes.ptr, - @intCast(c_uint, bytes.len), + @intCast(c_uint, tv.ty.arrayLenIncludingSentinel()), .True, // don't null terminate. bytes has the sentinel, if any. ); }, @@ -1558,10 +1558,11 @@ pub const DeclGen = struct { const elem_vals = tv.val.castTag(.aggregate).?.data; const elem_ty = tv.ty.elemType(); const gpa = dg.gpa; - const llvm_elems = try gpa.alloc(*const llvm.Value, elem_vals.len); + const len = @intCast(usize, tv.ty.arrayLenIncludingSentinel()); + const llvm_elems = try gpa.alloc(*const llvm.Value, len); defer gpa.free(llvm_elems); var need_unnamed = false; - for (elem_vals) |elem_val, i| { + for (elem_vals[0..len]) |elem_val, i| { llvm_elems[i] = try dg.genTypedValue(.{ .ty = elem_ty, .val = elem_val }); need_unnamed = need_unnamed or dg.isUnnamedType(elem_ty, llvm_elems[i]); } |
