Commit bd7eab573a

Timon Kruiper <timonkruiper@gmail.com>
2020-10-06 12:08:12
Fix building the zig compiler for 32-bit targets
1 parent fb63a2c
Changed files (5)
lib/std/fs/file.zig
@@ -615,7 +615,7 @@ pub const File = struct {
         }
     }
 
-    pub fn pwritev(self: File, iovecs: []os.iovec_const, offset: usize) PWriteError!usize {
+    pub fn pwritev(self: File, iovecs: []os.iovec_const, offset: u64) PWriteError!usize {
         if (is_windows) {
             // TODO improve this to use WriteFileScatter
             if (iovecs.len == 0) return @as(usize, 0);
@@ -632,11 +632,11 @@ pub const File = struct {
 
     /// The `iovecs` parameter is mutable because this function needs to mutate the fields in
     /// order to handle partial writes from the underlying OS layer.
-    pub fn pwritevAll(self: File, iovecs: []os.iovec_const, offset: usize) PWriteError!void {
+    pub fn pwritevAll(self: File, iovecs: []os.iovec_const, offset: u64) PWriteError!void {
         if (iovecs.len == 0) return;
 
         var i: usize = 0;
-        var off: usize = 0;
+        var off: u64 = 0;
         while (true) {
             var amt = try self.pwritev(iovecs[i..], offset + off);
             off += amt;
@@ -652,24 +652,25 @@ pub const File = struct {
 
     pub const CopyRangeError = os.CopyFileRangeError;
 
-    pub fn copyRange(in: File, in_offset: u64, out: File, out_offset: u64, len: usize) CopyRangeError!usize {
-        return os.copy_file_range(in.handle, in_offset, out.handle, out_offset, len, 0);
+    pub fn copyRange(in: File, in_offset: u64, out: File, out_offset: u64, len: u64) CopyRangeError!usize {
+        const adjusted_len = math.cast(usize, len) catch math.maxInt(usize);
+        return os.copy_file_range(in.handle, in_offset, out.handle, out_offset, adjusted_len, 0);
     }
 
     /// Returns the number of bytes copied. If the number read is smaller than `buffer.len`, it
     /// means the in file reached the end. Reaching the end of a file is not an error condition.
-    pub fn copyRangeAll(in: File, in_offset: u64, out: File, out_offset: u64, len: usize) CopyRangeError!usize {
-        var total_bytes_copied: usize = 0;
+    pub fn copyRangeAll(in: File, in_offset: u64, out: File, out_offset: u64, len: u64) CopyRangeError!usize {
+        var total_bytes_copied: u64 = 0;
         var in_off = in_offset;
         var out_off = out_offset;
         while (total_bytes_copied < len) {
-            const amt_copied = try copyRange(in, in_off, out, out_off, len - total_bytes_copied);
-            if (amt_copied == 0) return total_bytes_copied;
+            const amt_copied = try copyRange(in, in_off, out, out_off, len);
+            if (amt_copied == 0) return @intCast(usize, total_bytes_copied);
             total_bytes_copied += amt_copied;
             in_off += amt_copied;
             out_off += amt_copied;
         }
-        return total_bytes_copied;
+        return @intCast(usize, total_bytes_copied);
     }
 
     pub const WriteFileOptions = struct {
src/link/Elf.zig
@@ -2757,7 +2757,7 @@ fn writeSymbol(self: *Elf, index: usize) !void {
         if (needed_size > self.allocatedSize(syms_sect.sh_offset)) {
             // Move all the symbols to a new file location.
             const new_offset = self.findFreeSpace(needed_size, sym_align);
-            const existing_size = @as(u64, syms_sect.sh_info) * sym_size;
+            const existing_size = syms_sect.sh_info * sym_size;
             const amt = try self.base.file.?.copyRangeAll(syms_sect.sh_offset, self.base.file.?, new_offset, existing_size);
             if (amt != existing_size) return error.InputOutput;
             syms_sect.sh_offset = new_offset;
@@ -2911,7 +2911,7 @@ fn pwriteDbgLineNops(
     prev_padding_size: usize,
     buf: []const u8,
     next_padding_size: usize,
-    offset: usize,
+    offset: u64,
 ) !void {
     const tracy = trace(@src());
     defer tracy.end();
src/link/MachO.zig
@@ -1267,7 +1267,7 @@ fn updateString(self: *MachO, old_str_off: u32, new_name: []const u8) !u32 {
 fn addPadding(self: *MachO, size: u64, file_offset: u64) !void {
     if (size == 0) return;
 
-    const buf = try self.base.allocator.alloc(u8, size);
+    const buf = try self.base.allocator.alloc(u8, @intCast(usize, size));
     defer self.base.allocator.free(buf);
 
     mem.set(u8, buf[0..], 0);
src/main.zig
@@ -2541,7 +2541,7 @@ fn fmtPathFile(
     check_mode: bool,
     dir: fs.Dir,
     sub_path: []const u8,
-) FmtError!void {
+) (FmtError || error{Overflow})!void {
     const source_file = try dir.openFile(sub_path, .{});
     var file_closed = false;
     errdefer if (!file_closed) source_file.close();
@@ -2554,7 +2554,7 @@ fn fmtPathFile(
     const source_code = source_file.readToEndAllocOptions(
         fmt.gpa,
         max_src_size,
-        stat.size,
+        try std.math.cast(usize, stat.size),
         @alignOf(u8),
         null,
     ) catch |err| switch (err) {
src/value.zig
@@ -842,7 +842,7 @@ pub const Value = extern union {
             .int_u64 => {
                 const x = self.cast(Payload.Int_u64).?.int;
                 if (x == 0) return 0;
-                return std.math.log2(x) + 1;
+                return @intCast(usize, std.math.log2(x) + 1);
             },
             .int_i64 => {
                 @panic("TODO implement i64 intBitCountTwosComp");