| ... | ... | @@ -845,12 +845,8 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi |
| 845 | 845 | stubs_asm.shrinkRetainingCapacity(0); |
| 846 | 846 | try stubs_asm.appendSlice(".text\n"); |
| 847 | 847 | |
| 848 | | var inc_i: usize = 0; |
| 849 | | |
| 850 | | const fn_inclusions_len = mem.readInt(u16, metadata.inclusions[inc_i..][0..2], .little); |
| 851 | | inc_i += 2; |
| 852 | | |
| 853 | 848 | var sym_i: usize = 0; |
| 849 | var sym_name_buf = std.ArrayList(u8).init(arena); |
| 854 | 850 | var opt_symbol_name: ?[]const u8 = null; |
| 855 | 851 | var versions_buffer: [32]u8 = undefined; |
| 856 | 852 | var versions_len: usize = undefined; |
| ... | ... | @@ -871,32 +867,38 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi |
| 871 | 867 | // twice, which causes a "duplicate symbol" assembler error. |
| 872 | 868 | var versions_written = std.AutoArrayHashMap(Version, void).init(arena); |
| 873 | 869 | |
| 870 | var inc_fbs = std.io.fixedBufferStream(metadata.inclusions); |
| 871 | var inc_reader = inc_fbs.reader(); |
| 872 | |
| 873 | const fn_inclusions_len = try inc_reader.readInt(u16, .little); |
| 874 | |
| 874 | 875 | while (sym_i < fn_inclusions_len) : (sym_i += 1) { |
| 875 | 876 | const sym_name = opt_symbol_name orelse n: { |
| 876 | | const name = mem.sliceTo(metadata.inclusions[inc_i..], 0); |
| 877 | | inc_i += name.len + 1; |
| 877 | sym_name_buf.clearRetainingCapacity(); |
| 878 | try inc_reader.streamUntilDelimiter(sym_name_buf.writer(), 0, null); |
| 878 | 879 | |
| 879 | | opt_symbol_name = name; |
| 880 | opt_symbol_name = sym_name_buf.items; |
| 880 | 881 | versions_buffer = undefined; |
| 881 | 882 | versions_len = 0; |
| 882 | | break :n name; |
| 883 | |
| 884 | break :n sym_name_buf.items; |
| 883 | 885 | }; |
| 884 | | const targets = mem.readInt(u32, metadata.inclusions[inc_i..][0..4], .little); |
| 885 | | inc_i += 4; |
| 886 | const targets = try std.leb.readUleb128(u64, inc_reader); |
| 887 | var lib_index = try inc_reader.readByte(); |
| 886 | 888 | |
| 887 | | const lib_index = metadata.inclusions[inc_i]; |
| 888 | | inc_i += 1; |
| 889 | | const is_terminal = (targets & (1 << 31)) != 0; |
| 890 | | if (is_terminal) opt_symbol_name = null; |
| 889 | const is_terminal = (lib_index & (1 << 7)) != 0; |
| 890 | if (is_terminal) { |
| 891 | lib_index &= ~@as(u8, 1 << 7); |
| 892 | opt_symbol_name = null; |
| 893 | } |
| 891 | 894 | |
| 892 | 895 | // Test whether the inclusion applies to our current library and target. |
| 893 | 896 | const ok_lib_and_target = |
| 894 | 897 | (lib_index == lib_i) and |
| 895 | | ((targets & (@as(u32, 1) << @as(u5, @intCast(target_targ_index)))) != 0); |
| 898 | ((targets & (@as(u64, 1) << @as(u6, @intCast(target_targ_index)))) != 0); |
| 896 | 899 | |
| 897 | 900 | while (true) { |
| 898 | | const byte = metadata.inclusions[inc_i]; |
| 899 | | inc_i += 1; |
| 901 | const byte = try inc_reader.readByte(); |
| 900 | 902 | const last = (byte & 0b1000_0000) != 0; |
| 901 | 903 | const ver_i = @as(u7, @truncate(byte)); |
| 902 | 904 | if (ok_lib_and_target and ver_i <= target_ver_index) { |
| ... | ... | @@ -1027,8 +1029,7 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi |
| 1027 | 1029 | , .{wordDirective(target)}); |
| 1028 | 1030 | } |
| 1029 | 1031 | |
| 1030 | | const obj_inclusions_len = mem.readInt(u16, metadata.inclusions[inc_i..][0..2], .little); |
| 1031 | | inc_i += 2; |
| 1032 | const obj_inclusions_len = try inc_reader.readInt(u16, .little); |
| 1032 | 1033 | |
| 1033 | 1034 | sym_i = 0; |
| 1034 | 1035 | opt_symbol_name = null; |
| ... | ... | @@ -1036,33 +1037,32 @@ pub fn buildSharedObjects(comp: *Compilation, prog_node: std.Progress.Node) !voi |
| 1036 | 1037 | versions_len = undefined; |
| 1037 | 1038 | while (sym_i < obj_inclusions_len) : (sym_i += 1) { |
| 1038 | 1039 | const sym_name = opt_symbol_name orelse n: { |
| 1039 | | const name = mem.sliceTo(metadata.inclusions[inc_i..], 0); |
| 1040 | | inc_i += name.len + 1; |
| 1040 | sym_name_buf.clearRetainingCapacity(); |
| 1041 | try inc_reader.streamUntilDelimiter(sym_name_buf.writer(), 0, null); |
| 1041 | 1042 | |
| 1042 | | opt_symbol_name = name; |
| 1043 | opt_symbol_name = sym_name_buf.items; |
| 1043 | 1044 | versions_buffer = undefined; |
| 1044 | 1045 | versions_len = 0; |
| 1045 | | break :n name; |
| 1046 | | }; |
| 1047 | | const targets = mem.readInt(u32, metadata.inclusions[inc_i..][0..4], .little); |
| 1048 | | inc_i += 4; |
| 1049 | | |
| 1050 | | const size = mem.readInt(u16, metadata.inclusions[inc_i..][0..2], .little); |
| 1051 | | inc_i += 2; |
| 1052 | 1046 | |
| 1053 | | const lib_index = metadata.inclusions[inc_i]; |
| 1054 | | inc_i += 1; |
| 1055 | | const is_terminal = (targets & (1 << 31)) != 0; |
| 1056 | | if (is_terminal) opt_symbol_name = null; |
| 1047 | break :n sym_name_buf.items; |
| 1048 | }; |
| 1049 | const targets = try std.leb.readUleb128(u64, inc_reader); |
| 1050 | const size = try std.leb.readUleb128(u16, inc_reader); |
| 1051 | var lib_index = try inc_reader.readByte(); |
| 1052 | |
| 1053 | const is_terminal = (lib_index & (1 << 7)) != 0; |
| 1054 | if (is_terminal) { |
| 1055 | lib_index &= ~@as(u8, 1 << 7); |
| 1056 | opt_symbol_name = null; |
| 1057 | } |
| 1057 | 1058 | |
| 1058 | 1059 | // Test whether the inclusion applies to our current library and target. |
| 1059 | 1060 | const ok_lib_and_target = |
| 1060 | 1061 | (lib_index == lib_i) and |
| 1061 | | ((targets & (@as(u32, 1) << @as(u5, @intCast(target_targ_index)))) != 0); |
| 1062 | ((targets & (@as(u64, 1) << @as(u6, @intCast(target_targ_index)))) != 0); |
| 1062 | 1063 | |
| 1063 | 1064 | while (true) { |
| 1064 | | const byte = metadata.inclusions[inc_i]; |
| 1065 | | inc_i += 1; |
| 1065 | const byte = try inc_reader.readByte(); |
| 1066 | 1066 | const last = (byte & 0b1000_0000) != 0; |
| 1067 | 1067 | const ver_i = @as(u7, @truncate(byte)); |
| 1068 | 1068 | if (ok_lib_and_target and ver_i <= target_ver_index) { |