authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-08-12 22:58:52+01:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2025-08-13 11:36:16+01:00
log38ba425b26312ea073c7082e576e8583913139d7
tree40fb6ec72a7482dd77ec7f55aa9c70a73c4d6981
parentb8124d9c0b01e8ac7cd0daf93a0ed018da5f2352
signaturelock-open Commit is signed but in an unrecognized format.

llvm: support small error limits

Resolves: #23533

1 files changed, 4 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+4-1
...@@ -10475,11 +10475,14 @@ pub const FuncGen = struct {...@@ -10475,11 +10475,14 @@ pub const FuncGen = struct {
10475 const slice_ty = self.typeOfIndex(inst);10475 const slice_ty = self.typeOfIndex(inst);
10476 const slice_llvm_ty = try o.lowerType(pt, slice_ty);10476 const slice_llvm_ty = try o.lowerType(pt, slice_ty);
1047710477
10478 // If operand is small (e.g. `u8`), then signedness becomes a problem -- GEP always treats the index as signed.
10479 const extended_operand = try self.wip.conv(.unsigned, operand, try o.lowerType(pt, .usize), "");
10480
10478 const error_name_table_ptr = try self.getErrorNameTable();10481 const error_name_table_ptr = try self.getErrorNameTable();
10479 const error_name_table =10482 const error_name_table =
10480 try self.wip.load(.normal, .ptr, error_name_table_ptr.toValue(&o.builder), .default, "");10483 try self.wip.load(.normal, .ptr, error_name_table_ptr.toValue(&o.builder), .default, "");
10481 const error_name_ptr =10484 const error_name_ptr =
10482 try self.wip.gep(.inbounds, slice_llvm_ty, error_name_table, &.{operand}, "");10485 try self.wip.gep(.inbounds, slice_llvm_ty, error_name_table, &.{extended_operand}, "");
10483 return self.wip.load(.normal, slice_llvm_ty, error_name_ptr, .default, "");10486 return self.wip.load(.normal, slice_llvm_ty, error_name_ptr, .default, "");
10484 }10487 }
1048510488