| author | |
| committer | |
| log | cc5c25d48b5331396bfa5218dc7f29dff26e20f9 |
| tree | 08767d5933f36d6bc57cc284ed62ac9ca0d625c4 |
| parent | 4931b8dc93ee4a99a415dffab03d400e95d1a90a |
5 files changed, 70 insertions(+), 8 deletions(-)
src/AstGen.zig+14-1| ... | ... | @@ -6918,12 +6918,25 @@ fn builtinCall( |
| 6918 | 6918 | return rvalue(gz, rl, result, node); |
| 6919 | 6919 | }, |
| 6920 | 6920 | |
| 6921 | .src => { | |
| 6922 | const token_starts = tree.tokens.items(.start); | |
| 6923 | const node_start = token_starts[tree.firstToken(node)]; | |
| 6924 | ||
| 6925 | astgen.advanceSourceCursor(tree.source, node_start); | |
| 6926 | ||
| 6927 | const result = try gz.addExtendedPayload(.builtin_src, Zir.Inst.LineColumn{ | |
| 6928 | .line = @intCast(u32, astgen.source_line), | |
| 6929 | .column = @intCast(u32, astgen.source_column), | |
| 6930 | }); | |
| 6931 | ||
| 6932 | return rvalue(gz, rl, result, node); | |
| 6933 | }, | |
| 6934 | ||
| 6921 | 6935 | .breakpoint => return simpleNoOpVoid(gz, rl, node, .breakpoint), |
| 6922 | 6936 | |
| 6923 | 6937 | // zig fmt: off |
| 6924 | 6938 | .This => return rvalue(gz, rl, try gz.addNodeExtended(.this, node), node), |
| 6925 | 6939 | .return_address => return rvalue(gz, rl, try gz.addNodeExtended(.ret_addr, node), node), |
| 6926 | .src => return rvalue(gz, rl, try gz.addNodeExtended(.builtin_src, node), node), | |
| 6927 | 6940 | .error_return_trace => return rvalue(gz, rl, try gz.addNodeExtended(.error_return_trace, node), node), |
| 6928 | 6941 | .frame => return rvalue(gz, rl, try gz.addNodeExtended(.frame, node), node), |
| 6929 | 6942 | .frame_address => return rvalue(gz, rl, try gz.addNodeExtended(.frame_address, node), node), |
src/Module.zig+5| ... | ... | @@ -1663,6 +1663,11 @@ pub const File = struct { |
| 1663 | 1663 | return file.pkg.root_src_directory.join(ally, &[_][]const u8{file.sub_file_path}); |
| 1664 | 1664 | } |
| 1665 | 1665 | |
| 1666 | /// Returns the full path to this file relative to its package. | |
| 1667 | pub fn fullPathZ(file: File, ally: Allocator) ![:0]u8 { | |
| 1668 | return file.pkg.root_src_directory.joinZ(ally, &[_][]const u8{file.sub_file_path}); | |
| 1669 | } | |
| 1670 | ||
| 1666 | 1671 | pub fn dumpSrc(file: *File, src: LazySrcLoc) void { |
| 1667 | 1672 | const loc = std.zig.findLineColumn(file.source.bytes, src); |
| 1668 | 1673 | std.debug.print("{s}:{d}:{d}\n", .{ file.sub_file_path, loc.line + 1, loc.column + 1 }); |
src/Sema.zig+43-1| ... | ... | @@ -9182,8 +9182,50 @@ fn zirBuiltinSrc( |
| 9182 | 9182 | block: *Block, |
| 9183 | 9183 | extended: Zir.Inst.Extended.InstData, |
| 9184 | 9184 | ) CompileError!Air.Inst.Ref { |
| 9185 | const tracy = trace(@src()); | |
| 9186 | defer tracy.end(); | |
| 9187 | ||
| 9185 | 9188 | const src: LazySrcLoc = .{ .node_offset = @bitCast(i32, extended.operand) }; |
| 9186 | return sema.fail(block, src, "TODO: implement Sema.zirBuiltinSrc", .{}); | |
| 9189 | const extra = sema.code.extraData(Zir.Inst.LineColumn, extended.operand).data; | |
| 9190 | const func = sema.func orelse return sema.fail(block, src, "@src outside function", .{}); | |
| 9191 | ||
| 9192 | const func_name_val = blk: { | |
| 9193 | var anon_decl = try block.startAnonDecl(); | |
| 9194 | defer anon_decl.deinit(); | |
| 9195 | const name = std.mem.span(func.owner_decl.name); | |
| 9196 | const bytes = try anon_decl.arena().dupe(u8, name[0 .. name.len + 1]); | |
| 9197 | const new_decl = try anon_decl.finish( | |
| 9198 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), bytes.len - 1), | |
| 9199 | try Value.Tag.bytes.create(anon_decl.arena(), bytes), | |
| 9200 | ); | |
| 9201 | break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl); | |
| 9202 | }; | |
| 9203 | ||
| 9204 | const file_name_val = blk: { | |
| 9205 | var anon_decl = try block.startAnonDecl(); | |
| 9206 | defer anon_decl.deinit(); | |
| 9207 | const name = try func.owner_decl.getFileScope().fullPathZ(anon_decl.arena()); | |
| 9208 | const new_decl = try anon_decl.finish( | |
| 9209 | try Type.Tag.array_u8_sentinel_0.create(anon_decl.arena(), name.len), | |
| 9210 | try Value.Tag.bytes.create(anon_decl.arena(), name[0 .. name.len + 1]), | |
| 9211 | ); | |
| 9212 | break :blk try Value.Tag.decl_ref.create(sema.arena, new_decl); | |
| 9213 | }; | |
| 9214 | ||
| 9215 | const field_values = try sema.arena.alloc(Value, 4); | |
| 9216 | // file: [:0]const u8, | |
| 9217 | field_values[0] = file_name_val; | |
| 9218 | // fn_name: [:0]const u8, | |
| 9219 | field_values[1] = func_name_val; | |
| 9220 | // line: u32 | |
| 9221 | field_values[2] = try Value.Tag.int_u64.create(sema.arena, extra.line + 1); | |
| 9222 | // column: u32, | |
| 9223 | field_values[3] = try Value.Tag.int_u64.create(sema.arena, extra.column + 1); | |
| 9224 | ||
| 9225 | return sema.addConstant( | |
| 9226 | try sema.getBuiltinType(block, src, "SourceLocation"), | |
| 9227 | try Value.Tag.@"struct".create(sema.arena, field_values), | |
| 9228 | ); | |
| 9187 | 9229 | } |
| 9188 | 9230 | |
| 9189 | 9231 | fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
src/Zir.zig+7-5| ... | ... | @@ -1510,7 +1510,7 @@ pub const Inst = struct { |
| 1510 | 1510 | /// `operand` is `src_node: i32`. |
| 1511 | 1511 | ret_addr, |
| 1512 | 1512 | /// Implements the `@src` builtin. |
| 1513 | /// `operand` is `src_node: i32`. | |
| 1513 | /// `operand` is payload index to `ColumnLine`. | |
| 1514 | 1514 | builtin_src, |
| 1515 | 1515 | /// Implements the `@errorReturnTrace` builtin. |
| 1516 | 1516 | /// `operand` is `src_node: i32`. |
| ... | ... | @@ -2160,10 +2160,7 @@ pub const Inst = struct { |
| 2160 | 2160 | switch_inst: Index, |
| 2161 | 2161 | prong_index: u32, |
| 2162 | 2162 | }, |
| 2163 | dbg_stmt: struct { | |
| 2164 | line: u32, | |
| 2165 | column: u32, | |
| 2166 | }, | |
| 2163 | dbg_stmt: LineColumn, | |
| 2167 | 2164 | /// Used for unary operators which reference an inst, |
| 2168 | 2165 | /// with an AST node source location. |
| 2169 | 2166 | inst_node: struct { |
| ... | ... | @@ -2964,6 +2961,11 @@ pub const Inst = struct { |
| 2964 | 2961 | token: Ast.TokenIndex, |
| 2965 | 2962 | }; |
| 2966 | 2963 | }; |
| 2964 | ||
| 2965 | pub const LineColumn = struct { | |
| 2966 | line: u32, | |
| 2967 | column: u32, | |
| 2968 | }; | |
| 2967 | 2969 | }; |
| 2968 | 2970 | |
| 2969 | 2971 | pub const SpecialProng = enum { none, @"else", under }; |
test/behavior.zig+1-1| ... | ... | @@ -65,6 +65,7 @@ test { |
| 65 | 65 | _ = @import("behavior/translate_c_macros.zig"); |
| 66 | 66 | _ = @import("behavior/try.zig"); |
| 67 | 67 | _ = @import("behavior/undefined.zig"); |
| 68 | _ = @import("behavior/src.zig"); | |
| 68 | 69 | |
| 69 | 70 | if (builtin.zig_backend != .stage2_c) { |
| 70 | 71 | // Tests that pass for stage1 and the llvm backend. |
| ... | ... | @@ -204,7 +205,6 @@ test { |
| 204 | 205 | _ = @import("behavior/wasm.zig"); |
| 205 | 206 | } |
| 206 | 207 | _ = @import("behavior/while_stage1.zig"); |
| 207 | _ = @import("behavior/src.zig"); | |
| 208 | 208 | _ = @import("behavior/translate_c_macros_stage1.zig"); |
| 209 | 209 | } |
| 210 | 210 | } |