authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-04 04:58:42-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-04 08:13:13-04:00
log6553359f398ccc3be10a4975d99cb325a5b7c1fd
treefac80e7f0a7684fb5cf1e1cf2b72417595b5c001
parent7b1a644d6ee50740196328bd8f7b1a46ac46b4d2

x86_64: fix ub that the llvm backend was hiding


1 files changed, 3 insertions(+), 9 deletions(-)

src/arch/x86_64/Encoding.zig+3-9
...@@ -62,8 +62,7 @@ pub fn findByMnemonic(...@@ -62,8 +62,7 @@ pub fn findByMnemonic(
62 .rex, .rex_short => if (!rex_required) continue,62 .rex, .rex_short => if (!rex_required) continue,
63 else => {},63 else => {},
64 }64 }
65 for (input_ops, data.ops) |input_op, data_op|65 for (input_ops, data.ops) |input_op, data_op| if (!input_op.isSubset(data_op)) continue :next;
66 if (!input_op.isSubset(data_op)) continue :next;
6766
68 const enc = Encoding{ .mnemonic = mnemonic, .data = data };67 const enc = Encoding{ .mnemonic = mnemonic, .data = data };
69 if (shortest_enc) |previous_shortest_enc| {68 if (shortest_enc) |previous_shortest_enc| {
...@@ -828,18 +827,13 @@ const mnemonic_to_encodings_map = init: {...@@ -828,18 +827,13 @@ const mnemonic_to_encodings_map = init: {
828 for (&data_storage, entries, 0..) |*data, entry, data_index| {827 for (&data_storage, entries, 0..) |*data, entry, data_index| {
829 data.* = .{828 data.* = .{
830 .op_en = entry[1],829 .op_en = entry[1],
831 .ops = undefined,830 .ops = (entry[2] ++ .{.none} ** (data.ops.len - entry[2].len)).*,
832 .opc_len = entry[3].len,831 .opc_len = entry[3].len,
833 .opc = undefined,832 .opc = (entry[3] ++ .{undefined} ** (data.opc.len - entry[3].len)).*,
834 .modrm_ext = entry[4],833 .modrm_ext = entry[4],
835 .mode = entry[5],834 .mode = entry[5],
836 .feature = entry[6],835 .feature = entry[6],
837 };836 };
838 // TODO: use `@memcpy` for these. When I did that, I got a false positive
839 // compile error for this copy happening at compile time.
840 std.mem.copyForwards(Op, &data.ops, entry[2]);
841 std.mem.copyForwards(u8, &data.opc, entry[3]);
842
843 while (mnemonic_int < @intFromEnum(entry[0])) : (mnemonic_int += 1) {837 while (mnemonic_int < @intFromEnum(entry[0])) : (mnemonic_int += 1) {
844 mnemonic_map[mnemonic_int] = data_storage[mnemonic_start..data_index];838 mnemonic_map[mnemonic_int] = data_storage[mnemonic_start..data_index];
845 mnemonic_start = data_index;839 mnemonic_start = data_index;