authorgravatar for wrongnull@gmail.comBogdan Romanyuk <wrongnull@gmail.com> 2023-11-25 20:29:07+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-11-25 17:29:07+00:00
log2252dcc508c53dc302ec1f919c4792a7f00ce125
tree5b4fb9d2ded6453efa46012d98e6503904c3aee4
parentbece97ef248ad36d31a48fb761b4a41324c9c5d5
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Compiler: move checking function-scope-only builtins to AstGen


5 files changed, 92 insertions(+), 44 deletions(-)

src/AstGen.zig+22-21
...@@ -8266,6 +8266,28 @@ fn builtinCall(...@@ -8266,6 +8266,28 @@ fn builtinCall(
8266 }8266 }
8267 }8267 }
82688268
8269 // Check function scope-only builtins
8270
8271 if (astgen.fn_block == null) {
8272 switch (info.tag) {
8273 .c_va_arg,
8274 .c_va_copy,
8275 .c_va_end,
8276 .c_va_start,
8277 .work_item_id,
8278 .work_group_size,
8279 .work_group_id,
8280 .set_align_stack,
8281 .set_cold,
8282 .return_address,
8283 .frame_address,
8284 .breakpoint,
8285 .src,
8286 => return astgen.failNode(node, "'{s}' outside function scope", .{builtin_name}),
8287 else => {},
8288 }
8289 }
8290
8269 switch (info.tag) {8291 switch (info.tag) {
8270 .import => {8292 .import => {
8271 const node_tags = tree.nodes.items(.tag);8293 const node_tags = tree.nodes.items(.tag);
...@@ -8802,9 +8824,6 @@ fn builtinCall(...@@ -8802,9 +8824,6 @@ fn builtinCall(
8802 return rvalue(gz, ri, .void_value, node);8824 return rvalue(gz, ri, .void_value, node);
8803 },8825 },
8804 .c_va_arg => {8826 .c_va_arg => {
8805 if (astgen.fn_block == null) {
8806 return astgen.failNode(node, "'@cVaArg' outside function scope", .{});
8807 }
8808 const result = try gz.addExtendedPayload(.c_va_arg, Zir.Inst.BinNode{8827 const result = try gz.addExtendedPayload(.c_va_arg, Zir.Inst.BinNode{
8809 .node = gz.nodeIndexToRelative(node),8828 .node = gz.nodeIndexToRelative(node),
8810 .lhs = try expr(gz, scope, .{ .rl = .none }, params[0]),8829 .lhs = try expr(gz, scope, .{ .rl = .none }, params[0]),
...@@ -8813,9 +8832,6 @@ fn builtinCall(...@@ -8813,9 +8832,6 @@ fn builtinCall(
8813 return rvalue(gz, ri, result, node);8832 return rvalue(gz, ri, result, node);
8814 },8833 },
8815 .c_va_copy => {8834 .c_va_copy => {
8816 if (astgen.fn_block == null) {
8817 return astgen.failNode(node, "'@cVaCopy' outside function scope", .{});
8818 }
8819 const result = try gz.addExtendedPayload(.c_va_copy, Zir.Inst.UnNode{8835 const result = try gz.addExtendedPayload(.c_va_copy, Zir.Inst.UnNode{
8820 .node = gz.nodeIndexToRelative(node),8836 .node = gz.nodeIndexToRelative(node),
8821 .operand = try expr(gz, scope, .{ .rl = .none }, params[0]),8837 .operand = try expr(gz, scope, .{ .rl = .none }, params[0]),
...@@ -8823,9 +8839,6 @@ fn builtinCall(...@@ -8823,9 +8839,6 @@ fn builtinCall(
8823 return rvalue(gz, ri, result, node);8839 return rvalue(gz, ri, result, node);
8824 },8840 },
8825 .c_va_end => {8841 .c_va_end => {
8826 if (astgen.fn_block == null) {
8827 return astgen.failNode(node, "'@cVaEnd' outside function scope", .{});
8828 }
8829 const result = try gz.addExtendedPayload(.c_va_end, Zir.Inst.UnNode{8842 const result = try gz.addExtendedPayload(.c_va_end, Zir.Inst.UnNode{
8830 .node = gz.nodeIndexToRelative(node),8843 .node = gz.nodeIndexToRelative(node),
8831 .operand = try expr(gz, scope, .{ .rl = .none }, params[0]),8844 .operand = try expr(gz, scope, .{ .rl = .none }, params[0]),
...@@ -8833,9 +8846,6 @@ fn builtinCall(...@@ -8833,9 +8846,6 @@ fn builtinCall(
8833 return rvalue(gz, ri, result, node);8846 return rvalue(gz, ri, result, node);
8834 },8847 },
8835 .c_va_start => {8848 .c_va_start => {
8836 if (astgen.fn_block == null) {
8837 return astgen.failNode(node, "'@cVaStart' outside function scope", .{});
8838 }
8839 if (!astgen.fn_var_args) {8849 if (!astgen.fn_var_args) {
8840 return astgen.failNode(node, "'@cVaStart' in a non-variadic function", .{});8850 return astgen.failNode(node, "'@cVaStart' in a non-variadic function", .{});
8841 }8851 }
...@@ -8843,9 +8853,6 @@ fn builtinCall(...@@ -8843,9 +8853,6 @@ fn builtinCall(
8843 },8853 },
88448854
8845 .work_item_id => {8855 .work_item_id => {
8846 if (astgen.fn_block == null) {
8847 return astgen.failNode(node, "'@workItemId' outside function scope", .{});
8848 }
8849 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);8856 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);
8850 const result = try gz.addExtendedPayload(.work_item_id, Zir.Inst.UnNode{8857 const result = try gz.addExtendedPayload(.work_item_id, Zir.Inst.UnNode{
8851 .node = gz.nodeIndexToRelative(node),8858 .node = gz.nodeIndexToRelative(node),
...@@ -8854,9 +8861,6 @@ fn builtinCall(...@@ -8854,9 +8861,6 @@ fn builtinCall(
8854 return rvalue(gz, ri, result, node);8861 return rvalue(gz, ri, result, node);
8855 },8862 },
8856 .work_group_size => {8863 .work_group_size => {
8857 if (astgen.fn_block == null) {
8858 return astgen.failNode(node, "'@workGroupSize' outside function scope", .{});
8859 }
8860 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);8864 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);
8861 const result = try gz.addExtendedPayload(.work_group_size, Zir.Inst.UnNode{8865 const result = try gz.addExtendedPayload(.work_group_size, Zir.Inst.UnNode{
8862 .node = gz.nodeIndexToRelative(node),8866 .node = gz.nodeIndexToRelative(node),
...@@ -8865,9 +8869,6 @@ fn builtinCall(...@@ -8865,9 +8869,6 @@ fn builtinCall(
8865 return rvalue(gz, ri, result, node);8869 return rvalue(gz, ri, result, node);
8866 },8870 },
8867 .work_group_id => {8871 .work_group_id => {
8868 if (astgen.fn_block == null) {
8869 return astgen.failNode(node, "'@workGroupId' outside function scope", .{});
8870 }
8871 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);8872 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);
8872 const result = try gz.addExtendedPayload(.work_group_id, Zir.Inst.UnNode{8873 const result = try gz.addExtendedPayload(.work_group_id, Zir.Inst.UnNode{
8873 .node = gz.nodeIndexToRelative(node),8874 .node = gz.nodeIndexToRelative(node),
src/Sema.zig+1-5
...@@ -6151,9 +6151,6 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst...@@ -6151,9 +6151,6 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst
6151 alignment.toByteUnitsOptional().?,6151 alignment.toByteUnitsOptional().?,
6152 });6152 });
6153 }6153 }
6154 if (sema.func_index == .none) {
6155 return sema.fail(block, src, "@setAlignStack outside function body", .{});
6156 }
61576154
6158 const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index);6155 const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index);
6159 switch (fn_owner_decl.ty.fnCallingConvention(mod)) {6156 switch (fn_owner_decl.ty.fnCallingConvention(mod)) {
...@@ -16780,13 +16777,12 @@ fn zirBuiltinSrc(...@@ -16780,13 +16777,12 @@ fn zirBuiltinSrc(
16780 block: *Block,16777 block: *Block,
16781 extended: Zir.Inst.Extended.InstData,16778 extended: Zir.Inst.Extended.InstData,
16782) CompileError!Air.Inst.Ref {16779) CompileError!Air.Inst.Ref {
16780 _ = block;
16783 const tracy = trace(@src());16781 const tracy = trace(@src());
16784 defer tracy.end();16782 defer tracy.end();
1678516783
16786 const mod = sema.mod;16784 const mod = sema.mod;
16787 const extra = sema.code.extraData(Zir.Inst.Src, extended.operand).data;16785 const extra = sema.code.extraData(Zir.Inst.Src, extended.operand).data;
16788 const src = LazySrcLoc.nodeOffset(extra.node);
16789 if (sema.func_index == .none) return sema.fail(block, src, "@src outside function", .{});
16790 const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index);16786 const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index);
16791 const ip = &mod.intern_pool;16787 const ip = &mod.intern_pool;
16792 const gpa = sema.gpa;16788 const gpa = sema.gpa;
test/cases/compile_errors/function-only_builtins_outside_function.zig created+69
...@@ -0,0 +1,69 @@
1comptime {
2 @setAlignStack(1);
3}
4
5comptime {
6 @setCold(true);
7}
8
9comptime {
10 @src();
11}
12
13comptime {
14 @returnAddress();
15}
16
17comptime {
18 @frameAddress();
19}
20
21comptime {
22 @breakpoint();
23}
24
25comptime {
26 @cVaArg(1, 2);
27}
28
29comptime {
30 @cVaCopy(1);
31}
32
33comptime {
34 @cVaEnd(1);
35}
36
37comptime {
38 @cVaStart();
39}
40
41comptime {
42 @workItemId(42);
43}
44
45comptime {
46 @workGroupSize(42);
47}
48
49comptime {
50 @workGroupId(42);
51}
52
53// error
54// backend=stage2
55// target=native
56//
57// :2:5: error: '@setAlignStack' outside function scope
58// :6:5: error: '@setCold' outside function scope
59// :10:5: error: '@src' outside function scope
60// :14:5: error: '@returnAddress' outside function scope
61// :18:5: error: '@frameAddress' outside function scope
62// :22:5: error: '@breakpoint' outside function scope
63// :26:5: error: '@cVaArg' outside function scope
64// :30:5: error: '@cVaCopy' outside function scope
65// :34:5: error: '@cVaEnd' outside function scope
66// :38:5: error: '@cVaStart' outside function scope
67// :42:5: error: '@workItemId' outside function scope
68// :46:5: error: '@workGroupSize' outside function scope
69// :50:5: error: '@workGroupId' outside function scope
test/cases/compile_errors/setAlignStack_outside_function.zig deleted-9
...@@ -1,9 +0,0 @@
1comptime {
2 @setAlignStack(16);
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:5: error: @setAlignStack outside function body
test/cases/compile_errors/src_outside_function.zig deleted-9
...@@ -1,9 +0,0 @@
1comptime {
2 @src();
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:5: error: @src outside function