authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-02-22 15:25:50+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-02-22 15:25:50+02:00
logdf38c46bee9a54b9935f2e3372f6b86299730888
treefd7226c3b7380b6f650cf3864e95b3528f5ce9c2
parentc2a9a591f6f746c777800e4394ca0ee875be3688
parent176f7b86004b6e882d628ee50b272f859e5e9aba
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #10929 from davidmrt98/cbe

stage2: C backend: fix codegen for field_ptr/elem_ptr values

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

src/codegen/c.zig+15-15
...@@ -389,19 +389,19 @@ pub const DeclGen = struct {...@@ -389,19 +389,19 @@ pub const DeclGen = struct {
389 // Determine if we must pointer cast.389 // Determine if we must pointer cast.
390 if (ty.eql(decl.ty)) {390 if (ty.eql(decl.ty)) {
391 try writer.writeByte('&');391 try writer.writeByte('&');
392 try dg.renderDeclName(decl, writer);392 try dg.renderDeclName(writer, decl);
393 return;393 return;
394 }394 }
395395
396 try writer.writeAll("((");396 try writer.writeAll("((");
397 try dg.renderTypecast(writer, ty);397 try dg.renderTypecast(writer, ty);
398 try writer.writeAll(")&");398 try writer.writeAll(")&");
399 try dg.renderDeclName(decl, writer);399 try dg.renderDeclName(writer, decl);
400 try writer.writeByte(')');400 try writer.writeByte(')');
401 return;401 return;
402 }402 }
403403
404 try dg.renderDeclName(decl, writer);404 try dg.renderDeclName(writer, decl);
405 }405 }
406406
407 fn renderInt128(407 fn renderInt128(
...@@ -464,7 +464,7 @@ pub const DeclGen = struct {...@@ -464,7 +464,7 @@ pub const DeclGen = struct {
464 .variable => ptr_val.castTag(.variable).?.data.owner_decl,464 .variable => ptr_val.castTag(.variable).?.data.owner_decl,
465 else => unreachable,465 else => unreachable,
466 };466 };
467 try dg.renderDeclValue(writer, decl.ty, ptr_val, decl);467 try dg.renderDeclName(writer, decl);
468 return decl.ty;468 return decl.ty;
469 },469 },
470 .field_ptr => {470 .field_ptr => {
...@@ -490,7 +490,7 @@ pub const DeclGen = struct {...@@ -490,7 +490,7 @@ pub const DeclGen = struct {
490 },490 },
491 .elem_ptr => {491 .elem_ptr => {
492 const elem_ptr = ptr_val.castTag(.elem_ptr).?.data;492 const elem_ptr = ptr_val.castTag(.elem_ptr).?.data;
493 try writer.writeAll("&(*");493 try writer.writeAll("&(");
494 const container_ty = try dg.renderChildPtr(writer, elem_ptr.array_ptr);494 const container_ty = try dg.renderChildPtr(writer, elem_ptr.array_ptr);
495 try writer.print(")[{d}]", .{elem_ptr.index});495 try writer.print(")[{d}]", .{elem_ptr.index});
496 return container_ty.childType();496 return container_ty.childType();
...@@ -599,11 +599,11 @@ pub const DeclGen = struct {...@@ -599,11 +599,11 @@ pub const DeclGen = struct {
599 },599 },
600 .function => {600 .function => {
601 const func = val.castTag(.function).?.data;601 const func = val.castTag(.function).?.data;
602 try dg.renderDeclName(func.owner_decl, writer);602 try dg.renderDeclName(writer, func.owner_decl);
603 },603 },
604 .extern_fn => {604 .extern_fn => {
605 const extern_fn = val.castTag(.extern_fn).?.data;605 const extern_fn = val.castTag(.extern_fn).?.data;
606 try dg.renderDeclName(extern_fn.owner_decl, writer);606 try dg.renderDeclName(writer, extern_fn.owner_decl);
607 },607 },
608 .int_u64, .one => {608 .int_u64, .one => {
609 try writer.writeAll("((");609 try writer.writeAll("((");
...@@ -834,7 +834,7 @@ pub const DeclGen = struct {...@@ -834,7 +834,7 @@ pub const DeclGen = struct {
834 try w.writeAll("void");834 try w.writeAll("void");
835 }835 }
836 try w.writeAll(" ");836 try w.writeAll(" ");
837 try dg.renderDeclName(dg.decl, w);837 try dg.renderDeclName(w, dg.decl);
838 try w.writeAll("(");838 try w.writeAll("(");
839 const param_len = dg.decl.ty.fnParamLen();839 const param_len = dg.decl.ty.fnParamLen();
840840
...@@ -1058,7 +1058,7 @@ pub const DeclGen = struct {...@@ -1058,7 +1058,7 @@ pub const DeclGen = struct {
1058 if (err_set_type.castTag(.error_set_inferred)) |inf_err_set_payload| {1058 if (err_set_type.castTag(.error_set_inferred)) |inf_err_set_payload| {
1059 const func = inf_err_set_payload.data.func;1059 const func = inf_err_set_payload.data.func;
1060 try bw.writeAll("zig_E_");1060 try bw.writeAll("zig_E_");
1061 try dg.renderDeclName(func.owner_decl, bw);1061 try dg.renderDeclName(bw, func.owner_decl);
1062 try bw.writeAll(";\n");1062 try bw.writeAll(";\n");
1063 } else {1063 } else {
1064 try bw.print("zig_E_{s}_{s};\n", .{1064 try bw.print("zig_E_{s}_{s};\n", .{
...@@ -1391,10 +1391,10 @@ pub const DeclGen = struct {...@@ -1391,10 +1391,10 @@ pub const DeclGen = struct {
1391 .local_ref => |i| return w.print("&t{d}", .{i}),1391 .local_ref => |i| return w.print("&t{d}", .{i}),
1392 .constant => unreachable,1392 .constant => unreachable,
1393 .arg => |i| return w.print("a{d}", .{i}),1393 .arg => |i| return w.print("a{d}", .{i}),
1394 .decl => |decl| return dg.renderDeclName(decl, w),1394 .decl => |decl| return dg.renderDeclName(w, decl),
1395 .decl_ref => |decl| {1395 .decl_ref => |decl| {
1396 try w.writeByte('&');1396 try w.writeByte('&');
1397 return dg.renderDeclName(decl, w);1397 return dg.renderDeclName(w, decl);
1398 },1398 },
1399 .undefined_ptr => {1399 .undefined_ptr => {
1400 const target = dg.module.getTarget();1400 const target = dg.module.getTarget();
...@@ -1418,10 +1418,10 @@ pub const DeclGen = struct {...@@ -1418,10 +1418,10 @@ pub const DeclGen = struct {
1418 .arg => |i| return w.print("(*a{d})", .{i}),1418 .arg => |i| return w.print("(*a{d})", .{i}),
1419 .decl => |decl| {1419 .decl => |decl| {
1420 try w.writeAll("(*");1420 try w.writeAll("(*");
1421 try dg.renderDeclName(decl, w);1421 try dg.renderDeclName(w, decl);
1422 return w.writeByte(')');1422 return w.writeByte(')');
1423 },1423 },
1424 .decl_ref => |decl| return dg.renderDeclName(decl, w),1424 .decl_ref => |decl| return dg.renderDeclName(w, decl),
1425 .undefined_ptr => unreachable,1425 .undefined_ptr => unreachable,
1426 .identifier => |ident| return w.print("(*{ })", .{fmtIdent(ident)}),1426 .identifier => |ident| return w.print("(*{ })", .{fmtIdent(ident)}),
1427 .bytes => |bytes| {1427 .bytes => |bytes| {
...@@ -1432,7 +1432,7 @@ pub const DeclGen = struct {...@@ -1432,7 +1432,7 @@ pub const DeclGen = struct {
1432 }1432 }
1433 }1433 }
14341434
1435 fn renderDeclName(dg: DeclGen, decl: *Decl, writer: anytype) !void {1435 fn renderDeclName(dg: DeclGen, writer: anytype, decl: *Decl) !void {
1436 if (dg.module.decl_exports.get(decl)) |exports| {1436 if (dg.module.decl_exports.get(decl)) |exports| {
1437 return writer.writeAll(exports[0].options.name);1437 return writer.writeAll(exports[0].options.name);
1438 } else if (decl.val.tag() == .extern_fn) {1438 } else if (decl.val.tag() == .extern_fn) {
...@@ -2586,7 +2586,7 @@ fn airCall(f: *Function, inst: Air.Inst.Index) !CValue {...@@ -2586,7 +2586,7 @@ fn airCall(f: *Function, inst: Air.Inst.Index) !CValue {
2586 else => break :known,2586 else => break :known,
2587 };2587 };
2588 };2588 };
2589 try f.object.dg.renderDeclName(fn_decl, writer);2589 try f.object.dg.renderDeclName(writer, fn_decl);
2590 break :callee;2590 break :callee;
2591 }2591 }
2592 // Fall back to function pointer call.2592 // Fall back to function pointer call.
test/behavior.zig+3-3
...@@ -101,19 +101,19 @@ test {...@@ -101,19 +101,19 @@ test {
101101
102 if (builtin.zig_backend != .stage2_wasm) {102 if (builtin.zig_backend != .stage2_wasm) {
103 // Tests that pass for stage1, llvm backend, C backend103 // Tests that pass for stage1, llvm backend, C backend
104 _ = @import("behavior/bugs/9584.zig");
104 _ = @import("behavior/cast_int.zig");105 _ = @import("behavior/cast_int.zig");
106 _ = @import("behavior/eval.zig");
105 _ = @import("behavior/int128.zig");107 _ = @import("behavior/int128.zig");
108 _ = @import("behavior/merge_error_sets.zig");
106 _ = @import("behavior/translate_c_macros.zig");109 _ = @import("behavior/translate_c_macros.zig");
107110
108 if (builtin.zig_backend != .stage2_c) {111 if (builtin.zig_backend != .stage2_c) {
109 // Tests that pass for stage1 and the llvm backend.112 // Tests that pass for stage1 and the llvm backend.
110 _ = @import("behavior/atomics.zig");113 _ = @import("behavior/atomics.zig");
111 _ = @import("behavior/bugs/9584.zig");
112 _ = @import("behavior/eval.zig");
113 _ = @import("behavior/floatop.zig");114 _ = @import("behavior/floatop.zig");
114 _ = @import("behavior/math.zig");115 _ = @import("behavior/math.zig");
115 _ = @import("behavior/maximum_minimum.zig");116 _ = @import("behavior/maximum_minimum.zig");
116 _ = @import("behavior/merge_error_sets.zig");
117 _ = @import("behavior/popcount.zig");117 _ = @import("behavior/popcount.zig");
118 _ = @import("behavior/saturating_arithmetic.zig");118 _ = @import("behavior/saturating_arithmetic.zig");
119 _ = @import("behavior/sizeof_and_typeof.zig");119 _ = @import("behavior/sizeof_and_typeof.zig");