| author | |
| committer | |
| log | 6524a64bda71a2eed9a3160562fd6da7232f9720 |
| tree | ddb32d70efad9752478f17b6a6116c0cc628a8f9 |
| parent | 14d235dd6e79dba8d34e05f1912a1bcf9a3ef68c |
3 files changed, 53 insertions(+), 13 deletions(-)
src-self-hosted/Module.zig+8-10| ... | ... | @@ -743,7 +743,7 @@ pub fn performAllTheWork(self: *Module) error{OutOfMemory}!void { |
| 743 | 743 | self.allocator, |
| 744 | 744 | decl.src, |
| 745 | 745 | "unable to load source file '{}': {}", |
| 746 | .{decl.scope.sub_file_path, @errorName(err)}, | |
| 746 | .{ decl.scope.sub_file_path, @errorName(err) }, | |
| 747 | 747 | )); |
| 748 | 748 | decl.analysis = .codegen_failure_retryable; |
| 749 | 749 | continue; |
| ... | ... | @@ -756,7 +756,7 @@ pub fn performAllTheWork(self: *Module) error{OutOfMemory}!void { |
| 756 | 756 | error.OutOfMemory => return error.OutOfMemory, |
| 757 | 757 | error.AnalysisFail => continue, |
| 758 | 758 | }; |
| 759 | } | |
| 759 | }, | |
| 760 | 760 | }, |
| 761 | 761 | }; |
| 762 | 762 | } |
| ... | ... | @@ -945,7 +945,7 @@ fn deleteDeclExports(self: *Module, decl: *Decl) void { |
| 945 | 945 | var new_len = list.len; |
| 946 | 946 | while (i < new_len) { |
| 947 | 947 | if (list[i].owner_decl == decl) { |
| 948 | mem.copyBackwards(*Export, list[i..], list[i + 1..new_len]); | |
| 948 | mem.copyBackwards(*Export, list[i..], list[i + 1 .. new_len]); | |
| 949 | 949 | new_len -= 1; |
| 950 | 950 | } else { |
| 951 | 951 | i += 1; |
| ... | ... | @@ -1494,13 +1494,11 @@ fn analyzeInstDeclRef(self: *Module, scope: *Scope, inst: *zir.Inst.DeclRef) Inn |
| 1494 | 1494 | const decl_name = try self.resolveConstString(scope, inst.positionals.name); |
| 1495 | 1495 | // This will need to get more fleshed out when there are proper structs & namespaces. |
| 1496 | 1496 | const zir_module = scope.namespace(); |
| 1497 | for (zir_module.contents.module.decls) |src_decl| { | |
| 1498 | if (mem.eql(u8, src_decl.name, decl_name)) { | |
| 1499 | const decl = try self.resolveCompleteDecl(scope, src_decl); | |
| 1500 | return self.analyzeDeclRef(scope, inst.base.src, decl); | |
| 1501 | } | |
| 1502 | } | |
| 1503 | return self.fail(scope, inst.positionals.name.src, "use of undeclared identifier '{}'", .{decl_name}); | |
| 1497 | const src_decl = zir_module.contents.module.findDecl(decl_name) orelse | |
| 1498 | return self.fail(scope, inst.positionals.name.src, "use of undeclared identifier '{}'", .{decl_name}); | |
| 1499 | ||
| 1500 | const decl = try self.resolveCompleteDecl(scope, src_decl); | |
| 1501 | return self.analyzeDeclRef(scope, inst.base.src, decl); | |
| 1504 | 1502 | } |
| 1505 | 1503 | |
| 1506 | 1504 | fn analyzeDeclRef(self: *Module, scope: *Scope, src: usize, decl: *Decl) InnerError!*Inst { |
src-self-hosted/zir.zig+23-3| ... | ... | @@ -964,8 +964,8 @@ const Parser = struct { |
| 964 | 964 | self.i = src; |
| 965 | 965 | return self.fail("unrecognized identifier: {}", .{bad_name}); |
| 966 | 966 | } else { |
| 967 | const name = try self.arena.allocator.create(Inst.Str); | |
| 968 | name.* = .{ | |
| 967 | const name_array = try self.arena.allocator.create(Inst.Str); | |
| 968 | name_array.* = .{ | |
| 969 | 969 | .base = .{ |
| 970 | 970 | .name = try self.generateName(), |
| 971 | 971 | .src = src, |
| ... | ... | @@ -974,6 +974,16 @@ const Parser = struct { |
| 974 | 974 | .positionals = .{ .bytes = ident }, |
| 975 | 975 | .kw_args = .{}, |
| 976 | 976 | }; |
| 977 | const name = try self.arena.allocator.create(Inst.Ref); | |
| 978 | name.* = .{ | |
| 979 | .base = .{ | |
| 980 | .name = try self.generateName(), | |
| 981 | .src = src, | |
| 982 | .tag = Inst.Ref.base_tag, | |
| 983 | }, | |
| 984 | .positionals = .{ .operand = &name_array.base }, | |
| 985 | .kw_args = .{}, | |
| 986 | }; | |
| 977 | 987 | const declref = try self.arena.allocator.create(Inst.DeclRef); |
| 978 | 988 | declref.* = .{ |
| 979 | 989 | .base = .{ |
| ... | ... | @@ -984,7 +994,17 @@ const Parser = struct { |
| 984 | 994 | .positionals = .{ .name = &name.base }, |
| 985 | 995 | .kw_args = .{}, |
| 986 | 996 | }; |
| 987 | return &declref.base; | |
| 997 | const deref = try self.arena.allocator.create(Inst.Deref); | |
| 998 | deref.* = .{ | |
| 999 | .base = .{ | |
| 1000 | .name = try self.generateName(), | |
| 1001 | .src = src, | |
| 1002 | .tag = Inst.Deref.base_tag, | |
| 1003 | }, | |
| 1004 | .positionals = .{ .ptr = &declref.base }, | |
| 1005 | .kw_args = .{}, | |
| 1006 | }; | |
| 1007 | return &deref.base; | |
| 988 | 1008 | } |
| 989 | 1009 | }; |
| 990 | 1010 | if (local_ref) { |
test/stage2/zir.zig+22| ... | ... | @@ -9,6 +9,28 @@ const linux_x64 = std.zig.CrossTarget{ |
| 9 | 9 | }; |
| 10 | 10 | |
| 11 | 11 | pub fn addCases(ctx: *TestContext) void { |
| 12 | ctx.addZIRTransform("referencing decls which appear later in the file", linux_x64, | |
| 13 | \\@void = primitive(void) | |
| 14 | \\@fnty = fntype([], @void, cc=C) | |
| 15 | \\ | |
| 16 | \\@9 = str("entry") | |
| 17 | \\@10 = ref(@9) | |
| 18 | \\@11 = export(@10, @entry) | |
| 19 | \\ | |
| 20 | \\@entry = fn(@fnty, { | |
| 21 | \\ %11 = return() | |
| 22 | \\}) | |
| 23 | , | |
| 24 | \\@0 = primitive(void) | |
| 25 | \\@1 = fntype([], @0, cc=C) | |
| 26 | \\@2 = fn(@1, { | |
| 27 | \\ %0 = return() | |
| 28 | \\}) | |
| 29 | \\@3 = str("entry") | |
| 30 | \\@4 = ref(@3) | |
| 31 | \\@5 = export(@4, @2) | |
| 32 | \\ | |
| 33 | ); | |
| 12 | 34 | ctx.addZIRTransform("elemptr, add, cmp, condbr, return, breakpoint", linux_x64, |
| 13 | 35 | \\@void = primitive(void) |
| 14 | 36 | \\@usize = primitive(usize) |