authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-06-02 17:43:51-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-06-02 17:43:51-04:00
log6524a64bda71a2eed9a3160562fd6da7232f9720
treeddb32d70efad9752478f17b6a6116c0cc628a8f9
parent14d235dd6e79dba8d34e05f1912a1bcf9a3ef68c

stage2: fix referencing decls which appear later in the file


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,7 +743,7 @@ pub fn performAllTheWork(self: *Module) error{OutOfMemory}!void {
743 self.allocator,743 self.allocator,
744 decl.src,744 decl.src,
745 "unable to load source file '{}': {}",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 decl.analysis = .codegen_failure_retryable;748 decl.analysis = .codegen_failure_retryable;
749 continue;749 continue;
...@@ -756,7 +756,7 @@ pub fn performAllTheWork(self: *Module) error{OutOfMemory}!void {...@@ -756,7 +756,7 @@ pub fn performAllTheWork(self: *Module) error{OutOfMemory}!void {
756 error.OutOfMemory => return error.OutOfMemory,756 error.OutOfMemory => return error.OutOfMemory,
757 error.AnalysisFail => continue,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,7 +945,7 @@ fn deleteDeclExports(self: *Module, decl: *Decl) void {
945 var new_len = list.len;945 var new_len = list.len;
946 while (i < new_len) {946 while (i < new_len) {
947 if (list[i].owner_decl == decl) {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 new_len -= 1;949 new_len -= 1;
950 } else {950 } else {
951 i += 1;951 i += 1;
...@@ -1494,13 +1494,11 @@ fn analyzeInstDeclRef(self: *Module, scope: *Scope, inst: *zir.Inst.DeclRef) Inn...@@ -1494,13 +1494,11 @@ fn analyzeInstDeclRef(self: *Module, scope: *Scope, inst: *zir.Inst.DeclRef) Inn
1494 const decl_name = try self.resolveConstString(scope, inst.positionals.name);1494 const decl_name = try self.resolveConstString(scope, inst.positionals.name);
1495 // This will need to get more fleshed out when there are proper structs & namespaces.1495 // This will need to get more fleshed out when there are proper structs & namespaces.
1496 const zir_module = scope.namespace();1496 const zir_module = scope.namespace();
1497 for (zir_module.contents.module.decls) |src_decl| {1497 const src_decl = zir_module.contents.module.findDecl(decl_name) orelse
1498 if (mem.eql(u8, src_decl.name, decl_name)) {1498 return self.fail(scope, inst.positionals.name.src, "use of undeclared identifier '{}'", .{decl_name});
1499 const decl = try self.resolveCompleteDecl(scope, src_decl);1499
1500 return self.analyzeDeclRef(scope, inst.base.src, decl);1500 const decl = try self.resolveCompleteDecl(scope, src_decl);
1501 }1501 return self.analyzeDeclRef(scope, inst.base.src, decl);
1502 }
1503 return self.fail(scope, inst.positionals.name.src, "use of undeclared identifier '{}'", .{decl_name});
1504}1502}
15051503
1506fn analyzeDeclRef(self: *Module, scope: *Scope, src: usize, decl: *Decl) InnerError!*Inst {1504fn 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,8 +964,8 @@ const Parser = struct {
964 self.i = src;964 self.i = src;
965 return self.fail("unrecognized identifier: {}", .{bad_name});965 return self.fail("unrecognized identifier: {}", .{bad_name});
966 } else {966 } else {
967 const name = try self.arena.allocator.create(Inst.Str);967 const name_array = try self.arena.allocator.create(Inst.Str);
968 name.* = .{968 name_array.* = .{
969 .base = .{969 .base = .{
970 .name = try self.generateName(),970 .name = try self.generateName(),
971 .src = src,971 .src = src,
...@@ -974,6 +974,16 @@ const Parser = struct {...@@ -974,6 +974,16 @@ const Parser = struct {
974 .positionals = .{ .bytes = ident },974 .positionals = .{ .bytes = ident },
975 .kw_args = .{},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 const declref = try self.arena.allocator.create(Inst.DeclRef);987 const declref = try self.arena.allocator.create(Inst.DeclRef);
978 declref.* = .{988 declref.* = .{
979 .base = .{989 .base = .{
...@@ -984,7 +994,17 @@ const Parser = struct {...@@ -984,7 +994,17 @@ const Parser = struct {
984 .positionals = .{ .name = &name.base },994 .positionals = .{ .name = &name.base },
985 .kw_args = .{},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 if (local_ref) {1010 if (local_ref) {
test/stage2/zir.zig+22
...@@ -9,6 +9,28 @@ const linux_x64 = std.zig.CrossTarget{...@@ -9,6 +9,28 @@ const linux_x64 = std.zig.CrossTarget{
9};9};
1010
11pub fn addCases(ctx: *TestContext) void {11pub 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 ctx.addZIRTransform("elemptr, add, cmp, condbr, return, breakpoint", linux_x64,34 ctx.addZIRTransform("elemptr, add, cmp, condbr, return, breakpoint", linux_x64,
13 \\@void = primitive(void)35 \\@void = primitive(void)
14 \\@usize = primitive(usize)36 \\@usize = primitive(usize)