authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-03 09:14:36+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-04-03 09:14:36+02:00
logad8dfd367384a104f588bdc393cabae90c47c82f
tree60d59eb9fe9c81d91a1edaa3eef94b77293656ba
parenta31450375eaadfead340c28c32dd414160a99e65

macho+coff: remove alignment from Atom as it is unused


4 files changed, 19 insertions(+), 32 deletions(-)

src/link/Coff.zig+5-8
...@@ -155,6 +155,7 @@ const LazySymbolTable = std.ArrayHashMapUnmanaged(...@@ -155,6 +155,7 @@ const LazySymbolTable = std.ArrayHashMapUnmanaged(
155const LazySymbolMetadata = struct {155const LazySymbolMetadata = struct {
156 atom: Atom.Index,156 atom: Atom.Index,
157 section: u16,157 section: u16,
158 alignment: u32,
158};159};
159160
160const DeclMetadata = struct {161const DeclMetadata = struct {
...@@ -625,7 +626,6 @@ fn allocateAtom(self: *Coff, atom_index: Atom.Index, new_atom_size: u32, alignme...@@ -625,7 +626,6 @@ fn allocateAtom(self: *Coff, atom_index: Atom.Index, new_atom_size: u32, alignme
625 {626 {
626 const atom_ptr = self.getAtomPtr(atom_index);627 const atom_ptr = self.getAtomPtr(atom_index);
627 atom_ptr.size = new_atom_size;628 atom_ptr.size = new_atom_size;
628 atom_ptr.alignment = alignment;
629 }629 }
630630
631 if (atom.prev_index) |prev_index| {631 if (atom.prev_index) |prev_index| {
...@@ -739,7 +739,6 @@ pub fn createAtom(self: *Coff) !Atom.Index {...@@ -739,7 +739,6 @@ pub fn createAtom(self: *Coff) !Atom.Index {
739 .sym_index = sym_index,739 .sym_index = sym_index,
740 .file = null,740 .file = null,
741 .size = 0,741 .size = 0,
742 .alignment = 0,
743 .prev_index = null,742 .prev_index = null,
744 .next_index = null,743 .next_index = null,
745 };744 };
...@@ -751,11 +750,10 @@ fn createGotAtom(self: *Coff, target: SymbolWithLoc) !Atom.Index {...@@ -751,11 +750,10 @@ fn createGotAtom(self: *Coff, target: SymbolWithLoc) !Atom.Index {
751 const atom_index = try self.createAtom();750 const atom_index = try self.createAtom();
752 const atom = self.getAtomPtr(atom_index);751 const atom = self.getAtomPtr(atom_index);
753 atom.size = @sizeOf(u64);752 atom.size = @sizeOf(u64);
754 atom.alignment = @alignOf(u64);
755753
756 const sym = atom.getSymbolPtr(self);754 const sym = atom.getSymbolPtr(self);
757 sym.section_number = @intToEnum(coff.SectionNumber, self.got_section_index.? + 1);755 sym.section_number = @intToEnum(coff.SectionNumber, self.got_section_index.? + 1);
758 sym.value = try self.allocateAtom(atom_index, atom.size, atom.alignment);756 sym.value = try self.allocateAtom(atom_index, atom.size, @sizeOf(u64));
759757
760 log.debug("allocated GOT atom at 0x{x}", .{sym.value});758 log.debug("allocated GOT atom at 0x{x}", .{sym.value});
761759
...@@ -1116,9 +1114,8 @@ pub fn lowerUnnamedConst(self: *Coff, tv: TypedValue, decl_index: Module.Decl.In...@@ -1116,9 +1114,8 @@ pub fn lowerUnnamedConst(self: *Coff, tv: TypedValue, decl_index: Module.Decl.In
11161114
1117 const required_alignment = tv.ty.abiAlignment(self.base.options.target);1115 const required_alignment = tv.ty.abiAlignment(self.base.options.target);
1118 const atom = self.getAtomPtr(atom_index);1116 const atom = self.getAtomPtr(atom_index);
1119 atom.alignment = required_alignment;
1120 atom.size = @intCast(u32, code.len);1117 atom.size = @intCast(u32, code.len);
1121 atom.getSymbolPtr(self).value = try self.allocateAtom(atom_index, atom.size, atom.alignment);1118 atom.getSymbolPtr(self).value = try self.allocateAtom(atom_index, atom.size, required_alignment);
1122 errdefer self.freeAtom(atom_index);1119 errdefer self.freeAtom(atom_index);
11231120
1124 try unnamed_consts.append(gpa, atom_index);1121 try unnamed_consts.append(gpa, atom_index);
...@@ -1228,7 +1225,7 @@ fn updateLazySymbol(...@@ -1228,7 +1225,7 @@ fn updateLazySymbol(
1228 },1225 },
1229 };1226 };
12301227
1231 const required_alignment = atom.alignment;1228 const required_alignment = lazy_metadata.alignment;
1232 const code_len = @intCast(u32, code.len);1229 const code_len = @intCast(u32, code.len);
1233 const symbol = atom.getSymbolPtr(self);1230 const symbol = atom.getSymbolPtr(self);
1234 try self.setSymbolName(symbol, name);1231 try self.setSymbolName(symbol, name);
...@@ -1271,8 +1268,8 @@ pub fn getOrCreateAtomForLazySymbol(...@@ -1271,8 +1268,8 @@ pub fn getOrCreateAtomForLazySymbol(
1271 .code => self.text_section_index.?,1268 .code => self.text_section_index.?,
1272 .const_data => self.rdata_section_index.?,1269 .const_data => self.rdata_section_index.?,
1273 },1270 },
1271 .alignment = alignment,
1274 };1272 };
1275 self.getAtomPtr(gop.value_ptr.atom).alignment = alignment;
1276 }1273 }
1277 return gop.value_ptr.atom;1274 return gop.value_ptr.atom;
1278}1275}
src/link/Coff/Atom.zig+1-4
...@@ -19,12 +19,9 @@ sym_index: u32,...@@ -19,12 +19,9 @@ sym_index: u32,
19/// null means symbol defined by Zig source.19/// null means symbol defined by Zig source.
20file: ?u32,20file: ?u32,
2121
22/// Used size of the atom22/// Size of the atom
23size: u32,23size: u32,
2424
25/// Alignment of the atom
26alignment: u32,
27
28/// Points to the previous and next neighbors, based on the `text_offset`.25/// Points to the previous and next neighbors, based on the `text_offset`.
29/// This can be used to find, for example, the capacity of this `Atom`.26/// This can be used to find, for example, the capacity of this `Atom`.
30prev_index: ?Index,27prev_index: ?Index,
src/link/MachO.zig+13-16
...@@ -242,6 +242,7 @@ const LazySymbolTable = std.ArrayHashMapUnmanaged(...@@ -242,6 +242,7 @@ const LazySymbolTable = std.ArrayHashMapUnmanaged(
242const LazySymbolMetadata = struct {242const LazySymbolMetadata = struct {
243 atom: Atom.Index,243 atom: Atom.Index,
244 section: u8,244 section: u8,
245 alignment: u32,
245};246};
246247
247const DeclMetadata = struct {248const DeclMetadata = struct {
...@@ -1205,7 +1206,6 @@ pub fn createAtom(self: *MachO) !Atom.Index {...@@ -1205,7 +1206,6 @@ pub fn createAtom(self: *MachO) !Atom.Index {
1205 .sym_index = sym_index,1206 .sym_index = sym_index,
1206 .file = null,1207 .file = null,
1207 .size = 0,1208 .size = 0,
1208 .alignment = 0,
1209 .prev_index = null,1209 .prev_index = null,
1210 .next_index = null,1210 .next_index = null,
1211 };1211 };
...@@ -1217,7 +1217,6 @@ pub fn createGotAtom(self: *MachO, target: SymbolWithLoc) !Atom.Index {...@@ -1217,7 +1217,6 @@ pub fn createGotAtom(self: *MachO, target: SymbolWithLoc) !Atom.Index {
1217 const atom_index = try self.createAtom();1217 const atom_index = try self.createAtom();
1218 const atom = self.getAtomPtr(atom_index);1218 const atom = self.getAtomPtr(atom_index);
1219 atom.size = @sizeOf(u64);1219 atom.size = @sizeOf(u64);
1220 atom.alignment = @alignOf(u64);
12211220
1222 const sym = atom.getSymbolPtr(self);1221 const sym = atom.getSymbolPtr(self);
1223 sym.n_type = macho.N_SECT;1222 sym.n_type = macho.N_SECT;
...@@ -1259,7 +1258,6 @@ pub fn createDyldPrivateAtom(self: *MachO) !void {...@@ -1259,7 +1258,6 @@ pub fn createDyldPrivateAtom(self: *MachO) !void {
1259 const atom_index = try self.createAtom();1258 const atom_index = try self.createAtom();
1260 const atom = self.getAtomPtr(atom_index);1259 const atom = self.getAtomPtr(atom_index);
1261 atom.size = @sizeOf(u64);1260 atom.size = @sizeOf(u64);
1262 atom.alignment = @alignOf(u64);
12631261
1264 const sym = atom.getSymbolPtr(self);1262 const sym = atom.getSymbolPtr(self);
1265 sym.n_type = macho.N_SECT;1263 sym.n_type = macho.N_SECT;
...@@ -1285,7 +1283,8 @@ pub fn createStubHelperPreambleAtom(self: *MachO) !void {...@@ -1285,7 +1283,8 @@ pub fn createStubHelperPreambleAtom(self: *MachO) !void {
1285 const atom_index = try self.createAtom();1283 const atom_index = try self.createAtom();
1286 const atom = self.getAtomPtr(atom_index);1284 const atom = self.getAtomPtr(atom_index);
1287 atom.size = size;1285 atom.size = size;
1288 atom.alignment = switch (arch) {1286
1287 const required_alignment: u32 = switch (arch) {
1289 .x86_64 => 1,1288 .x86_64 => 1,
1290 .aarch64 => @alignOf(u32),1289 .aarch64 => @alignOf(u32),
1291 else => unreachable,1290 else => unreachable,
...@@ -1392,7 +1391,7 @@ pub fn createStubHelperPreambleAtom(self: *MachO) !void {...@@ -1392,7 +1391,7 @@ pub fn createStubHelperPreambleAtom(self: *MachO) !void {
1392 }1391 }
1393 self.stub_helper_preamble_atom_index = atom_index;1392 self.stub_helper_preamble_atom_index = atom_index;
13941393
1395 sym.n_value = try self.allocateAtom(atom_index, size, atom.alignment);1394 sym.n_value = try self.allocateAtom(atom_index, size, required_alignment);
1396 log.debug("allocated stub preamble atom at 0x{x}", .{sym.n_value});1395 log.debug("allocated stub preamble atom at 0x{x}", .{sym.n_value});
1397 try self.writeAtom(atom_index, code);1396 try self.writeAtom(atom_index, code);
1398}1397}
...@@ -1408,7 +1407,8 @@ pub fn createStubHelperAtom(self: *MachO) !Atom.Index {...@@ -1408,7 +1407,8 @@ pub fn createStubHelperAtom(self: *MachO) !Atom.Index {
1408 const atom_index = try self.createAtom();1407 const atom_index = try self.createAtom();
1409 const atom = self.getAtomPtr(atom_index);1408 const atom = self.getAtomPtr(atom_index);
1410 atom.size = size;1409 atom.size = size;
1411 atom.alignment = switch (arch) {1410
1411 const required_alignment: u32 = switch (arch) {
1412 .x86_64 => 1,1412 .x86_64 => 1,
1413 .aarch64 => @alignOf(u32),1413 .aarch64 => @alignOf(u32),
1414 else => unreachable,1414 else => unreachable,
...@@ -1470,7 +1470,7 @@ pub fn createStubHelperAtom(self: *MachO) !Atom.Index {...@@ -1470,7 +1470,7 @@ pub fn createStubHelperAtom(self: *MachO) !Atom.Index {
1470 else => unreachable,1470 else => unreachable,
1471 }1471 }
14721472
1473 sym.n_value = try self.allocateAtom(atom_index, size, atom.alignment);1473 sym.n_value = try self.allocateAtom(atom_index, size, required_alignment);
1474 log.debug("allocated stub helper atom at 0x{x}", .{sym.n_value});1474 log.debug("allocated stub helper atom at 0x{x}", .{sym.n_value});
1475 try self.writeAtom(atom_index, code);1475 try self.writeAtom(atom_index, code);
14761476
...@@ -1481,7 +1481,6 @@ pub fn createLazyPointerAtom(self: *MachO, stub_sym_index: u32, target: SymbolWi...@@ -1481,7 +1481,6 @@ pub fn createLazyPointerAtom(self: *MachO, stub_sym_index: u32, target: SymbolWi
1481 const atom_index = try self.createAtom();1481 const atom_index = try self.createAtom();
1482 const atom = self.getAtomPtr(atom_index);1482 const atom = self.getAtomPtr(atom_index);
1483 atom.size = @sizeOf(u64);1483 atom.size = @sizeOf(u64);
1484 atom.alignment = @alignOf(u64);
14851484
1486 const sym = atom.getSymbolPtr(self);1485 const sym = atom.getSymbolPtr(self);
1487 sym.n_type = macho.N_SECT;1486 sym.n_type = macho.N_SECT;
...@@ -1523,7 +1522,8 @@ pub fn createStubAtom(self: *MachO, laptr_sym_index: u32) !Atom.Index {...@@ -1523,7 +1522,8 @@ pub fn createStubAtom(self: *MachO, laptr_sym_index: u32) !Atom.Index {
1523 const atom_index = try self.createAtom();1522 const atom_index = try self.createAtom();
1524 const atom = self.getAtomPtr(atom_index);1523 const atom = self.getAtomPtr(atom_index);
1525 atom.size = size;1524 atom.size = size;
1526 atom.alignment = switch (arch) {1525
1526 const required_alignment: u32 = switch (arch) {
1527 .x86_64 => 1,1527 .x86_64 => 1,
1528 .aarch64 => @alignOf(u32),1528 .aarch64 => @alignOf(u32),
1529 else => unreachable, // unhandled architecture type1529 else => unreachable, // unhandled architecture type
...@@ -1587,7 +1587,7 @@ pub fn createStubAtom(self: *MachO, laptr_sym_index: u32) !Atom.Index {...@@ -1587,7 +1587,7 @@ pub fn createStubAtom(self: *MachO, laptr_sym_index: u32) !Atom.Index {
1587 else => unreachable,1587 else => unreachable,
1588 }1588 }
15891589
1590 sym.n_value = try self.allocateAtom(atom_index, size, atom.alignment);1590 sym.n_value = try self.allocateAtom(atom_index, size, required_alignment);
1591 log.debug("allocated stub atom at 0x{x}", .{sym.n_value});1591 log.debug("allocated stub atom at 0x{x}", .{sym.n_value});
1592 try self.writeAtom(atom_index, code);1592 try self.writeAtom(atom_index, code);
15931593
...@@ -2217,7 +2217,6 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl_index: Modu...@@ -2217,7 +2217,6 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl_index: Modu
2217 const required_alignment = typed_value.ty.abiAlignment(self.base.options.target);2217 const required_alignment = typed_value.ty.abiAlignment(self.base.options.target);
2218 const atom = self.getAtomPtr(atom_index);2218 const atom = self.getAtomPtr(atom_index);
2219 atom.size = code.len;2219 atom.size = code.len;
2220 atom.alignment = required_alignment;
2221 // TODO: work out logic for disambiguating functions from function pointers2220 // TODO: work out logic for disambiguating functions from function pointers
2222 // const sect_id = self.getDeclOutputSection(decl_index);2221 // const sect_id = self.getDeclOutputSection(decl_index);
2223 const sect_id = self.data_const_section_index.?;2222 const sect_id = self.data_const_section_index.?;
...@@ -2355,7 +2354,7 @@ fn updateLazySymbol(self: *MachO, lazy_sym: File.LazySymbol, lazy_metadata: Lazy...@@ -2355,7 +2354,7 @@ fn updateLazySymbol(self: *MachO, lazy_sym: File.LazySymbol, lazy_metadata: Lazy
2355 },2354 },
2356 };2355 };
23572356
2358 const required_alignment = atom.alignment;2357 const required_alignment = lazy_metadata.alignment;
2359 const symbol = atom.getSymbolPtr(self);2358 const symbol = atom.getSymbolPtr(self);
2360 symbol.n_strx = name_str_index;2359 symbol.n_strx = name_str_index;
2361 symbol.n_type = macho.N_SECT;2360 symbol.n_type = macho.N_SECT;
...@@ -2398,8 +2397,8 @@ pub fn getOrCreateAtomForLazySymbol(...@@ -2398,8 +2397,8 @@ pub fn getOrCreateAtomForLazySymbol(
2398 .code => self.text_section_index.?,2397 .code => self.text_section_index.?,
2399 .const_data => self.data_const_section_index.?,2398 .const_data => self.data_const_section_index.?,
2400 },2399 },
2400 .alignment = alignment,
2401 };2401 };
2402 self.getAtomPtr(gop.value_ptr.atom).alignment = alignment;
2403 }2402 }
2404 return gop.value_ptr.atom;2403 return gop.value_ptr.atom;
2405}2404}
...@@ -3222,7 +3221,6 @@ fn allocateAtom(self: *MachO, atom_index: Atom.Index, new_atom_size: u64, alignm...@@ -3222,7 +3221,6 @@ fn allocateAtom(self: *MachO, atom_index: Atom.Index, new_atom_size: u64, alignm
3222 {3221 {
3223 const atom_ptr = self.getAtomPtr(atom_index);3222 const atom_ptr = self.getAtomPtr(atom_index);
3224 atom_ptr.size = new_atom_size;3223 atom_ptr.size = new_atom_size;
3225 atom_ptr.alignment = @intCast(u32, alignment);
3226 }3224 }
32273225
3228 if (atom.prev_index) |prev_index| {3226 if (atom.prev_index) |prev_index| {
...@@ -4510,12 +4508,11 @@ pub fn logAtom(self: *MachO, atom_index: Atom.Index) void {...@@ -4510,12 +4508,11 @@ pub fn logAtom(self: *MachO, atom_index: Atom.Index) void {
4510 const atom = self.getAtom(atom_index);4508 const atom = self.getAtom(atom_index);
4511 const sym = atom.getSymbol(self);4509 const sym = atom.getSymbol(self);
4512 const sym_name = atom.getName(self);4510 const sym_name = atom.getName(self);
4513 log.debug(" ATOM(%{?d}, '{s}') @ {x} (sizeof({x}), alignof({x})) in object({?d}) in sect({d})", .{4511 log.debug(" ATOM(%{?d}, '{s}') @ {x} sizeof({x}) in object({?d}) in sect({d})", .{
4514 atom.getSymbolIndex(),4512 atom.getSymbolIndex(),
4515 sym_name,4513 sym_name,
4516 sym.n_value,4514 sym.n_value,
4517 atom.size,4515 atom.size,
4518 atom.alignment,
4519 atom.file,4516 atom.file,
4520 sym.n_sect,4517 sym.n_sect,
4521 });4518 });
src/link/MachO/Atom.zig-4
...@@ -33,10 +33,6 @@ file: ?u32,...@@ -33,10 +33,6 @@ file: ?u32,
33/// the atom since macho.nlist_64 lacks this information.33/// the atom since macho.nlist_64 lacks this information.
34size: u64,34size: u64,
3535
36/// Alignment of this atom as a power of 2.
37/// For instance, alignment of 0 should be read as 2^0 = 1 byte aligned.
38alignment: u32,
39
40/// Points to the previous and next neighbours36/// Points to the previous and next neighbours
41/// TODO use the same trick as with symbols: reserve index 0 as null atom37/// TODO use the same trick as with symbols: reserve index 0 as null atom
42next_index: ?Index,38next_index: ?Index,