| author | |
| committer | |
| log | 839d85e4405aef4856d1a35a6580226e997cc369 |
| tree | 2c9456f935e132b5faaab84104e6af3aea9a1b92 |
| parent | 45dc2587a395c02afb12f1781f3539d4bc77c225 |
4 files changed, 36 insertions(+), 11 deletions(-)
lib/std/zig/system.zig+10-6| ... | ... | @@ -622,9 +622,10 @@ pub const NativeTargetInfo = struct { |
| 622 | 622 | const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); |
| 623 | 623 | const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); |
| 624 | 624 | if (p_filesz > result.dynamic_linker.buffer.len) return error.NameTooLong; |
| 625 | _ = try preadMin(file, result.dynamic_linker.buffer[0..p_filesz], p_offset, p_filesz); | |
| 626 | // PT_INTERP includes a null byte in p_filesz. | |
| 627 | const len = p_filesz - 1; | |
| 625 | const filesz = @intCast(usize, p_filesz); | |
| 626 | _ = try preadMin(file, result.dynamic_linker.buffer[0..filesz], p_offset, filesz); | |
| 627 | // PT_INTERP includes a null byte in filesz. | |
| 628 | const len = filesz - 1; | |
| 628 | 629 | // dynamic_linker.max_byte is "max", not "len". |
| 629 | 630 | // We know it will fit in u8 because we check against dynamic_linker.buffer.len above. |
| 630 | 631 | result.dynamic_linker.max_byte = @intCast(u8, len - 1); |
| ... | ... | @@ -645,7 +646,7 @@ pub const NativeTargetInfo = struct { |
| 645 | 646 | { |
| 646 | 647 | var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset); |
| 647 | 648 | const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz); |
| 648 | const dyn_size: u64 = if (is_64) @sizeOf(elf.Elf64_Dyn) else @sizeOf(elf.Elf32_Dyn); | |
| 649 | const dyn_size: usize = if (is_64) @sizeOf(elf.Elf64_Dyn) else @sizeOf(elf.Elf32_Dyn); | |
| 649 | 650 | const dyn_num = p_filesz / dyn_size; |
| 650 | 651 | var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined; |
| 651 | 652 | var dyn_i: usize = 0; |
| ... | ... | @@ -751,7 +752,10 @@ pub const NativeTargetInfo = struct { |
| 751 | 752 | const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len); |
| 752 | 753 | const strtab = strtab_buf[0..strtab_read_len]; |
| 753 | 754 | // TODO this pointer cast should not be necessary |
| 754 | const rpath_list = mem.spanZ(@ptrCast([*:0]u8, strtab[rpoff..].ptr)); | |
| 755 | const rpoff_usize = std.math.cast(usize, rpoff) catch |err| switch (err) { | |
| 756 | error.Overflow => return error.InvalidElfFile, | |
| 757 | }; | |
| 758 | const rpath_list = mem.spanZ(@ptrCast([*:0]u8, strtab[rpoff_usize..].ptr)); | |
| 755 | 759 | var it = mem.tokenize(rpath_list, ":"); |
| 756 | 760 | while (it.next()) |rpath| { |
| 757 | 761 | var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) { |
| ... | ... | @@ -811,7 +815,7 @@ pub const NativeTargetInfo = struct { |
| 811 | 815 | } |
| 812 | 816 | |
| 813 | 817 | fn preadMin(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usize { |
| 814 | var i: u64 = 0; | |
| 818 | var i: usize = 0; | |
| 815 | 819 | while (i < min_read_len) { |
| 816 | 820 | const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) { |
| 817 | 821 | error.OperationAborted => unreachable, // Windows-only |
src-self-hosted/translate_c.zig+23-3| ... | ... | @@ -3845,7 +3845,9 @@ fn transCreateNodePtrType( |
| 3845 | 3845 | } |
| 3846 | 3846 | |
| 3847 | 3847 | fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node { |
| 3848 | const num_limbs = ZigClangAPSInt_getNumWords(int); | |
| 3848 | const num_limbs = math.cast(usize, ZigClangAPSInt_getNumWords(int)) catch |err| switch (err) { | |
| 3849 | error.Overflow => return error.OutOfMemory, | |
| 3850 | }; | |
| 3849 | 3851 | var aps_int = int; |
| 3850 | 3852 | const is_negative = ZigClangAPSInt_isSigned(int) and ZigClangAPSInt_isNegative(int); |
| 3851 | 3853 | if (is_negative) |
| ... | ... | @@ -3855,8 +3857,26 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node { |
| 3855 | 3857 | big.negate(); |
| 3856 | 3858 | defer big.deinit(); |
| 3857 | 3859 | const data = ZigClangAPSInt_getRawData(aps_int); |
| 3858 | var i: @TypeOf(num_limbs) = 0; | |
| 3859 | while (i < num_limbs) : (i += 1) big.limbs[i] = data[i]; | |
| 3860 | switch (@sizeOf(std.math.big.Limb)) { | |
| 3861 | 8 => { | |
| 3862 | var i: usize = 0; | |
| 3863 | while (i < num_limbs) : (i += 1) { | |
| 3864 | big.limbs[i] = data[i]; | |
| 3865 | } | |
| 3866 | }, | |
| 3867 | 4 => { | |
| 3868 | var limb_i: usize = 0; | |
| 3869 | var data_i: usize = 0; | |
| 3870 | while (limb_i < num_limbs) : ({ | |
| 3871 | limb_i += 2; | |
| 3872 | data_i += 1; | |
| 3873 | }) { | |
| 3874 | big.limbs[limb_i] = @truncate(u32, data[data_i]); | |
| 3875 | big.limbs[limb_i + 1] = @truncate(u32, data[data_i] >> 32); | |
| 3876 | } | |
| 3877 | }, | |
| 3878 | else => @compileError("unimplemented"), | |
| 3879 | } | |
| 3860 | 3880 | const str = big.toString(c.a(), 10) catch |err| switch (err) { |
| 3861 | 3881 | error.OutOfMemory => return error.OutOfMemory, |
| 3862 | 3882 | else => unreachable, |
src/link.cpp+1| ... | ... | @@ -651,6 +651,7 @@ static const char *build_libunwind(CodeGen *parent, Stage2ProgressNode *progress |
| 651 | 651 | if (parent->is_single_threaded) { |
| 652 | 652 | c_file->args.append("-D_LIBUNWIND_HAS_NO_THREADS"); |
| 653 | 653 | } |
| 654 | c_file->args.append("-Wno-bitwise-conditional-parentheses"); | |
| 654 | 655 | c_source_files.append(c_file); |
| 655 | 656 | } |
| 656 | 657 | child_gen->c_source_files = c_source_files; |
src/os.cpp+2-2| ... | ... | @@ -1097,8 +1097,8 @@ static Error set_file_times(OsFile file, OsTimeStamp ts) { |
| 1097 | 1097 | return ErrorNone; |
| 1098 | 1098 | #else |
| 1099 | 1099 | struct timespec times[2] = { |
| 1100 | { (time_t)ts.sec, (time_t)ts.nsec }, | |
| 1101 | { (time_t)ts.sec, (time_t)ts.nsec }, | |
| 1100 | { (time_t)ts.sec, (long)ts.nsec }, | |
| 1101 | { (time_t)ts.sec, (long)ts.nsec }, | |
| 1102 | 1102 | }; |
| 1103 | 1103 | if (futimens(file, times) == -1) { |
| 1104 | 1104 | switch (errno) { |