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 {...@@ -622,9 +622,10 @@ pub const NativeTargetInfo = struct {
622 const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset);622 const p_offset = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset);
623 const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz);623 const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz);
624 if (p_filesz > result.dynamic_linker.buffer.len) return error.NameTooLong;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);625 const filesz = @intCast(usize, p_filesz);
626 // PT_INTERP includes a null byte in p_filesz.626 _ = try preadMin(file, result.dynamic_linker.buffer[0..filesz], p_offset, filesz);
627 const len = p_filesz - 1;627 // PT_INTERP includes a null byte in filesz.
628 const len = filesz - 1;
628 // dynamic_linker.max_byte is "max", not "len".629 // dynamic_linker.max_byte is "max", not "len".
629 // We know it will fit in u8 because we check against dynamic_linker.buffer.len above.630 // We know it will fit in u8 because we check against dynamic_linker.buffer.len above.
630 result.dynamic_linker.max_byte = @intCast(u8, len - 1);631 result.dynamic_linker.max_byte = @intCast(u8, len - 1);
...@@ -645,7 +646,7 @@ pub const NativeTargetInfo = struct {...@@ -645,7 +646,7 @@ pub const NativeTargetInfo = struct {
645 {646 {
646 var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset);647 var dyn_off = elfInt(is_64, need_bswap, ph32.p_offset, ph64.p_offset);
647 const p_filesz = elfInt(is_64, need_bswap, ph32.p_filesz, ph64.p_filesz);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 const dyn_num = p_filesz / dyn_size;650 const dyn_num = p_filesz / dyn_size;
650 var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined;651 var dyn_buf: [16 * @sizeOf(elf.Elf64_Dyn)]u8 align(@alignOf(elf.Elf64_Dyn)) = undefined;
651 var dyn_i: usize = 0;652 var dyn_i: usize = 0;
...@@ -751,7 +752,10 @@ pub const NativeTargetInfo = struct {...@@ -751,7 +752,10 @@ pub const NativeTargetInfo = struct {
751 const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len);752 const strtab_read_len = try preadMin(file, &strtab_buf, ds.offset, shstrtab_len);
752 const strtab = strtab_buf[0..strtab_read_len];753 const strtab = strtab_buf[0..strtab_read_len];
753 // TODO this pointer cast should not be necessary754 // 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 var it = mem.tokenize(rpath_list, ":");759 var it = mem.tokenize(rpath_list, ":");
756 while (it.next()) |rpath| {760 while (it.next()) |rpath| {
757 var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) {761 var dir = fs.cwd().openDir(rpath, .{}) catch |err| switch (err) {
...@@ -811,7 +815,7 @@ pub const NativeTargetInfo = struct {...@@ -811,7 +815,7 @@ pub const NativeTargetInfo = struct {
811 }815 }
812816
813 fn preadMin(file: fs.File, buf: []u8, offset: u64, min_read_len: usize) !usize {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 while (i < min_read_len) {819 while (i < min_read_len) {
816 const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) {820 const len = file.pread(buf[i .. buf.len - i], offset + i) catch |err| switch (err) {
817 error.OperationAborted => unreachable, // Windows-only821 error.OperationAborted => unreachable, // Windows-only
src-self-hosted/translate_c.zig+23-3
...@@ -3845,7 +3845,9 @@ fn transCreateNodePtrType(...@@ -3845,7 +3845,9 @@ fn transCreateNodePtrType(
3845}3845}
38463846
3847fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {3847fn 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 var aps_int = int;3851 var aps_int = int;
3850 const is_negative = ZigClangAPSInt_isSigned(int) and ZigClangAPSInt_isNegative(int);3852 const is_negative = ZigClangAPSInt_isSigned(int) and ZigClangAPSInt_isNegative(int);
3851 if (is_negative)3853 if (is_negative)
...@@ -3855,8 +3857,26 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {...@@ -3855,8 +3857,26 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {
3855 big.negate();3857 big.negate();
3856 defer big.deinit();3858 defer big.deinit();
3857 const data = ZigClangAPSInt_getRawData(aps_int);3859 const data = ZigClangAPSInt_getRawData(aps_int);
3858 var i: @TypeOf(num_limbs) = 0;3860 switch (@sizeOf(std.math.big.Limb)) {
3859 while (i < num_limbs) : (i += 1) big.limbs[i] = data[i];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 const str = big.toString(c.a(), 10) catch |err| switch (err) {3880 const str = big.toString(c.a(), 10) catch |err| switch (err) {
3861 error.OutOfMemory => return error.OutOfMemory,3881 error.OutOfMemory => return error.OutOfMemory,
3862 else => unreachable,3882 else => unreachable,
src/link.cpp+1
...@@ -651,6 +651,7 @@ static const char *build_libunwind(CodeGen *parent, Stage2ProgressNode *progress...@@ -651,6 +651,7 @@ static const char *build_libunwind(CodeGen *parent, Stage2ProgressNode *progress
651 if (parent->is_single_threaded) {651 if (parent->is_single_threaded) {
652 c_file->args.append("-D_LIBUNWIND_HAS_NO_THREADS");652 c_file->args.append("-D_LIBUNWIND_HAS_NO_THREADS");
653 }653 }
654 c_file->args.append("-Wno-bitwise-conditional-parentheses");
654 c_source_files.append(c_file);655 c_source_files.append(c_file);
655 }656 }
656 child_gen->c_source_files = c_source_files;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,8 +1097,8 @@ static Error set_file_times(OsFile file, OsTimeStamp ts) {
1097 return ErrorNone;1097 return ErrorNone;
1098#else1098#else
1099 struct timespec times[2] = {1099 struct timespec times[2] = {
1100 { (time_t)ts.sec, (time_t)ts.nsec },1100 { (time_t)ts.sec, (long)ts.nsec },
1101 { (time_t)ts.sec, (time_t)ts.nsec },1101 { (time_t)ts.sec, (long)ts.nsec },
1102 };1102 };
1103 if (futimens(file, times) == -1) {1103 if (futimens(file, times) == -1) {
1104 switch (errno) {1104 switch (errno) {