authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-08-30 08:52:29-04:00
committergravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-09-18 19:44:41-04:00
log84ab03a875b2a1b9d38f094242ddbd54f133c1a5
tree177803b056903400b587cda7172482f3723d520a
parent4cb2d6bc3e3ab7c27cabdc7318abaea1afc34654

plan9 linker: get ready to delete allocateDeclIndexes


2 files changed, 22 insertions(+), 8 deletions(-)

src/codegen.zig+3
......@@ -2965,6 +2965,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
29652965 }
29662966 if (self.air.value(callee)) |func_value| {
29672967 if (func_value.castTag(.function)) |func_payload| {
2968 try p9.seeDecl(func_payload.data.owner_decl);
29682969 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
29692970 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
29702971 const got_addr = p9.bases.data;
......@@ -3012,6 +3013,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
30123013 }
30133014 if (self.air.value(callee)) |func_value| {
30143015 if (func_value.castTag(.function)) |func_payload| {
3016 try p9.seeDecl(func_payload.data.owner_decl);
30153017 const ptr_bits = self.target.cpu.arch.ptrBitWidth();
30163018 const ptr_bytes: u64 = @divExact(ptr_bits, 8);
30173019 const got_addr = p9.bases.data;
......@@ -4939,6 +4941,7 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
49394941 const got_addr = coff_file.offset_table_virtual_address + decl.link.coff.offset_table_index * ptr_bytes;
49404942 return MCValue{ .memory = got_addr };
49414943 } else if (self.bin_file.cast(link.File.Plan9)) |p9| {
4944 try p9.seeDecl(decl);
49424945 const got_addr = p9.bases.data + decl.link.plan9.got_index.? * ptr_bytes;
49434946 return MCValue{ .memory = got_addr };
49444947 } else {
src/link/Plan9.zig+19-8
......@@ -131,6 +131,8 @@ pub fn updateFunc(self: *Plan9, module: *Module, func: *Module.Fn, air: Air, liv
131131 }
132132
133133 const decl = func.owner_decl;
134
135 try self.seeDecl(decl);
134136 log.debug("codegen decl {*} ({s})", .{ decl, decl.name });
135137
136138 var code_buffer = std.ArrayList(u8).init(self.base.allocator);
......@@ -176,6 +178,8 @@ pub fn updateDecl(self: *Plan9, module: *Module, decl: *Module.Decl) !void {
176178 }
177179 }
178180
181 try self.seeDecl(decl);
182
179183 log.debug("codegen decl {*} ({s})", .{ decl, decl.name });
180184
181185 var code_buffer = std.ArrayList(u8).init(self.base.allocator);
......@@ -407,12 +411,24 @@ pub fn freeDecl(self: *Plan9, decl: *Module.Decl) void {
407411 }
408412}
409413
414pub fn seeDecl(self: *Plan9, decl: *Module.Decl) !void {
415 if (decl.link.plan9.got_index == null) {
416 if (self.got_index_free_list.popOrNull()) |i| {
417 decl.link.plan9.got_index = i;
418 } else {
419 self.got_len += 1;
420 decl.link.plan9.got_index = self.got_len - 1;
421 }
422 }
423}
424
410425pub fn updateDeclExports(
411426 self: *Plan9,
412427 module: *Module,
413428 decl: *Module.Decl,
414429 exports: []const *Module.Export,
415430) !void {
431 try self.seeDecl(decl);
416432 // we do all the things in flush
417433 _ = self;
418434 _ = module;
......@@ -494,13 +510,8 @@ pub fn writeSyms(self: *Plan9, buf: *std.ArrayList(u8)) !void {
494510 }
495511}
496512
513/// this will be removed, moved to updateFinish
497514pub fn allocateDeclIndexes(self: *Plan9, decl: *Module.Decl) !void {
498 if (decl.link.plan9.got_index == null) {
499 if (self.got_index_free_list.popOrNull()) |i| {
500 decl.link.plan9.got_index = i;
501 } else {
502 self.got_len += 1;
503 decl.link.plan9.got_index = self.got_len - 1;
504 }
505 }
515 _ = self;
516 _ = decl;
506517}