authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-24 16:41:57-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-25 19:57:02-07:00
log03b473d21becb85d61ddd4b672323256d7747f19
tree52fdd8df23ef7bf93feda9c23f94a75249d71b22
parentf841b265c5523147f69127b968806454b64e1944

Sema: rework addConstantMaybeRef

and add anonDeclRef and migrate some anon decls to it

1 files changed, 23 insertions(+), 35 deletions(-)

src/Sema.zig+23-35
...@@ -5466,19 +5466,24 @@ fn addStrLitNoAlias(sema: *Sema, bytes: []const u8) CompileError!Air.Inst.Ref {...@@ -5466,19 +5466,24 @@ fn addStrLitNoAlias(sema: *Sema, bytes: []const u8) CompileError!Air.Inst.Ref {
5466 .ty = array_ty.toIntern(),5466 .ty = array_ty.toIntern(),
5467 .storage = .{ .bytes = bytes },5467 .storage = .{ .bytes = bytes },
5468 } });5468 } });
5469 const ptr_ty = try sema.ptrType(.{5469 return anonDeclRef(sema, val);
5470 .child = array_ty.toIntern(),5470}
5471
5472fn anonDeclRef(sema: *Sema, val: InternPool.Index) CompileError!Air.Inst.Ref {
5473 const mod = sema.mod;
5474 const ptr_ty = (try sema.ptrType(.{
5475 .child = mod.intern_pool.typeOf(val),
5471 .flags = .{5476 .flags = .{
5472 .alignment = .none,5477 .alignment = .none,
5473 .is_const = true,5478 .is_const = true,
5474 .address_space = .generic,5479 .address_space = .generic,
5475 },5480 },
5476 });5481 })).toIntern();
5477 return Air.internedToRef(try mod.intern(.{ .ptr = .{5482 return Air.internedToRef(try mod.intern(.{ .ptr = .{
5478 .ty = ptr_ty.toIntern(),5483 .ty = ptr_ty,
5479 .addr = .{ .anon_decl = .{5484 .addr = .{ .anon_decl = .{
5480 .val = val,5485 .val = val,
5481 .orig_ty = ptr_ty.toIntern(),5486 .orig_ty = ptr_ty,
5482 } },5487 } },
5483 } }));5488 } }));
5484}5489}
...@@ -10740,7 +10745,7 @@ const SwitchProngAnalysis = struct {...@@ -10740,7 +10745,7 @@ const SwitchProngAnalysis = struct {
10740 return block.addStructFieldVal(spa.operand, field_index, field_ty);10745 return block.addStructFieldVal(spa.operand, field_index, field_ty);
10741 }10746 }
10742 } else if (capture_byref) {10747 } else if (capture_byref) {
10743 return sema.addConstantMaybeRef(block, operand_ty, item_val, true);10748 return anonDeclRef(sema, item_val.toIntern());
10744 } else {10749 } else {
10745 return inline_case_capture;10750 return inline_case_capture;
10746 }10751 }
...@@ -13765,10 +13770,10 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -13765,10 +13770,10 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
13765 const coerced_elem_val = try sema.resolveConstValue(block, .unneeded, coerced_elem_val_inst, undefined);13770 const coerced_elem_val = try sema.resolveConstValue(block, .unneeded, coerced_elem_val_inst, undefined);
13766 element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod);13771 element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod);
13767 }13772 }
13768 return sema.addConstantMaybeRef(block, result_ty, (try mod.intern(.{ .aggregate = .{13773 return sema.addConstantMaybeRef(try mod.intern(.{ .aggregate = .{
13769 .ty = result_ty.toIntern(),13774 .ty = result_ty.toIntern(),
13770 .storage = .{ .elems = element_vals },13775 .storage = .{ .elems = element_vals },
13771 } })).toValue(), ptr_addrspace != null);13776 } }), ptr_addrspace != null);
13772 } else break :rs rhs_src;13777 } else break :rs rhs_src;
13773 } else lhs_src;13778 } else lhs_src;
1377413779
...@@ -14034,7 +14039,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -14034,7 +14039,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
14034 .storage = .{ .elems = element_vals },14039 .storage = .{ .elems = element_vals },
14035 } });14040 } });
14036 };14041 };
14037 return sema.addConstantMaybeRef(block, result_ty, val.toValue(), ptr_addrspace != null);14042 return sema.addConstantMaybeRef(val, ptr_addrspace != null);
14038 }14043 }
1403914044
14040 try sema.requireRuntimeBlock(block, src, lhs_src);14045 try sema.requireRuntimeBlock(block, src, lhs_src);
...@@ -19022,10 +19027,7 @@ fn zirStructInitEmptyResult(sema: *Sema, block: *Block, inst: Zir.Inst.Index, is...@@ -19022,10 +19027,7 @@ fn zirStructInitEmptyResult(sema: *Sema, block: *Block, inst: Zir.Inst.Index, is
1902219027
19023 if (is_byref) {19028 if (is_byref) {
19024 const init_val = (try sema.resolveValue(init_ref)).?;19029 const init_val = (try sema.resolveValue(init_ref)).?;
19025 var anon_decl = try block.startAnonDecl();19030 return anonDeclRef(sema, init_val.toIntern());
19026 defer anon_decl.deinit();
19027 const decl = try anon_decl.finish(init_ty, init_val, .none);
19028 return sema.analyzeDeclRef(decl);
19029 } else {19031 } else {
19030 return init_ref;19032 return init_ref;
19031 }19033 }
...@@ -19248,7 +19250,7 @@ fn zirStructInit(...@@ -19248,7 +19250,7 @@ fn zirStructInit(
19248 } })).toValue();19250 } })).toValue();
19249 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src);19251 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val.toIntern()), src);
19250 const final_val = (try sema.resolveValue(final_val_inst)).?;19252 const final_val = (try sema.resolveValue(final_val_inst)).?;
19251 return sema.addConstantMaybeRef(block, resolved_ty, final_val, is_ref);19253 return sema.addConstantMaybeRef(final_val.toIntern(), is_ref);
19252 }19254 }
1925319255
19254 if (try sema.typeRequiresComptime(resolved_ty)) {19256 if (try sema.typeRequiresComptime(resolved_ty)) {
...@@ -19408,7 +19410,7 @@ fn finishStructInit(...@@ -19408,7 +19410,7 @@ fn finishStructInit(
19408 } });19410 } });
19409 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val), init_src);19411 const final_val_inst = try sema.coerce(block, result_ty, Air.internedToRef(struct_val), init_src);
19410 const final_val = (try sema.resolveValue(final_val_inst)).?;19412 const final_val = (try sema.resolveValue(final_val_inst)).?;
19411 return sema.addConstantMaybeRef(block, result_ty, final_val, is_ref);19413 return sema.addConstantMaybeRef(final_val.toIntern(), is_ref);
19412 };19414 };
1941319415
19414 if (try sema.typeRequiresComptime(struct_ty)) {19416 if (try sema.typeRequiresComptime(struct_ty)) {
...@@ -19561,7 +19563,7 @@ fn structInitAnon(...@@ -19561,7 +19563,7 @@ fn structInitAnon(
19561 .ty = tuple_ty,19563 .ty = tuple_ty,
19562 .storage = .{ .elems = values },19564 .storage = .{ .elems = values },
19563 } });19565 } });
19564 return sema.addConstantMaybeRef(block, tuple_ty.toType(), tuple_val.toValue(), is_ref);19566 return sema.addConstantMaybeRef(tuple_val, is_ref);
19565 };19567 };
1956619568
19567 sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) {19569 sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) {
...@@ -19727,7 +19729,8 @@ fn zirArrayInit(...@@ -19727,7 +19729,8 @@ fn zirArrayInit(
19727 .storage = .{ .elems = elem_vals },19729 .storage = .{ .elems = elem_vals },
19728 } });19730 } });
19729 const result_ref = try sema.coerce(block, result_ty, Air.internedToRef(arr_val), src);19731 const result_ref = try sema.coerce(block, result_ty, Air.internedToRef(arr_val), src);
19730 return sema.addConstantMaybeRef(block, result_ty, (try sema.resolveValue(result_ref)).?, is_ref);19732 const result_val = (try sema.resolveValue(result_ref)).?;
19733 return sema.addConstantMaybeRef(result_val.toIntern(), is_ref);
19731 };19734 };
1973219735
19733 sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) {19736 sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) {
...@@ -19846,7 +19849,7 @@ fn arrayInitAnon(...@@ -19846,7 +19849,7 @@ fn arrayInitAnon(
19846 .ty = tuple_ty,19849 .ty = tuple_ty,
19847 .storage = .{ .elems = values },19850 .storage = .{ .elems = values },
19848 } });19851 } });
19849 return sema.addConstantMaybeRef(block, tuple_ty.toType(), tuple_val.toValue(), is_ref);19852 return sema.addConstantMaybeRef(tuple_val, is_ref);
19850 };19853 };
1985119854
19852 try sema.requireRuntimeBlock(block, src, runtime_src);19855 try sema.requireRuntimeBlock(block, src, runtime_src);
...@@ -19881,23 +19884,8 @@ fn arrayInitAnon(...@@ -19881,23 +19884,8 @@ fn arrayInitAnon(
19881 return block.addAggregateInit(tuple_ty.toType(), element_refs);19884 return block.addAggregateInit(tuple_ty.toType(), element_refs);
19882}19885}
1988319886
19884fn addConstantMaybeRef(19887fn addConstantMaybeRef(sema: *Sema, val: InternPool.Index, is_ref: bool) !Air.Inst.Ref {
19885 sema: *Sema,19888 return if (is_ref) anonDeclRef(sema, val) else Air.internedToRef(val);
19886 block: *Block,
19887 ty: Type,
19888 val: Value,
19889 is_ref: bool,
19890) !Air.Inst.Ref {
19891 if (!is_ref) return Air.internedToRef(val.toIntern());
19892
19893 var anon_decl = try block.startAnonDecl();
19894 defer anon_decl.deinit();
19895 const decl = try anon_decl.finish(
19896 ty,
19897 val,
19898 .none, // default alignment
19899 );
19900 return sema.analyzeDeclRef(decl);
19901}19889}
1990219890
19903fn zirFieldTypeRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {19891fn zirFieldTypeRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {