authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-30 21:41:54-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-31 10:10:31-04:00
log839d85e4405aef4856d1a35a6580226e997cc369
tree2c9456f935e132b5faaab84104e6af3aea9a1b92
parent45dc2587a395c02afb12f1781f3539d4bc77c225

fixes to 32-bit handling, to support 32-bit arm


4 files changed, 36 insertions(+), 11 deletions(-)

lib/std/zig/system.zig+10-6
......@@ -622,9 +622,10 @@ pub const NativeTargetInfo = struct {
622622 const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset);
623623 const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz);
624624 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;
628629 // dynamic_linker.max_byte is "max", not "len".
629630 // We know it will fit in u8 because we check against dynamic_linker.buffer.len above.
630631 result.dynamic_linker.max_byte = @intCast(u8, len - 1);
......@@ -645,7 +646,7 @@ pub const NativeTargetInfo = struct {
645646 {
646647 var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset);
647648 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);
649650 const dyn_num = p_filesz / dyn_size;
650651 var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined;
651652 var dyn_i: usize = 0;
......@@ -751,7 +752,10 @@ pub const NativeTargetInfo = struct {
751752 const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len);
752753 const strtab = strtab_buf[0..strtab_read_len];
753754 // 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));
755759 var it = mem.tokenize(rpath_list, ":");
756760 while (it.next()) |rpath| {
757761 var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) {
......@@ -811,7 +815,7 @@ pub const NativeTargetInfo = struct {
811815 }
812816
813817 fn preadMin(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usize {
814 var i: u64 = 0;
818 var i: usize = 0;
815819 while (i < min_read_len) {
816820 const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) {
817821 error.OperationAborted => unreachable, // Windows-only
src-self-hosted/translate_c.zig+23-3
......@@ -3845,7 +3845,9 @@ fn transCreateNodePtrType(
38453845}
38463846
38473847fn 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 };
38493851 var aps_int = int;
38503852 const is_negative = ZigClangAPSInt_isSigned(int) and ZigClangAPSInt_isNegative(int);
38513853 if (is_negative)
......@@ -3855,8 +3857,26 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {
38553857 big.negate();
38563858 defer big.deinit();
38573859 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 }
38603880 const str = big.toString(c.a(), 10) catch |err| switch (err) {
38613881 error.OutOfMemory => return error.OutOfMemory,
38623882 else => unreachable,
src/link.cpp+1
......@@ -651,6 +651,7 @@ static const char *build_libunwind(CodeGen *parent, Stage2ProgressNode *progress
651651 if (parent->is_single_threaded) {
652652 c_file->args.append("-D_LIBUNWIND_HAS_NO_THREADS");
653653 }
654 c_file->args.append("-Wno-bitwise-conditional-parentheses");
654655 c_source_files.append(c_file);
655656 }
656657 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) {
10971097 return ErrorNone;
10981098#else
10991099 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 },
11021102 };
11031103 if (futimens(file, times) == -1) {
11041104 switch (errno) {