Skip to content

Commit d40c4e7

Browse files
authored
Merge pull request #1429 from shawnl/arm64
initial arm64 support
2 parents 5b84192 + 2d27341 commit d40c4e7

16 files changed

+713
-86
lines changed

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ set(ZIG_STD_FILES
578578
"os/linux/index.zig"
579579
"os/linux/vdso.zig"
580580
"os/linux/x86_64.zig"
581+
"os/linux/arm64.zig"
581582
"os/path.zig"
582583
"os/time.zig"
583584
"os/windows/advapi32.zig"

src-self-hosted/libc_installation.zig

+2-2
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ pub const LibCInstallation = struct {
280280
switch (builtin.arch) {
281281
builtin.Arch.i386 => try stream.write("x86"),
282282
builtin.Arch.x86_64 => try stream.write("x64"),
283-
builtin.Arch.aarch64 => try stream.write("arm"),
283+
builtin.Arch.aarch64v8 => try stream.write("arm"),
284284
else => return error.UnsupportedArchitecture,
285285
}
286286
const ucrt_lib_path = try std.os.path.join(loop.allocator, result_buf.toSliceConst(), "ucrt.lib");
@@ -355,7 +355,7 @@ pub const LibCInstallation = struct {
355355
switch (builtin.arch) {
356356
builtin.Arch.i386 => try stream.write("x86\\"),
357357
builtin.Arch.x86_64 => try stream.write("x64\\"),
358-
builtin.Arch.aarch64 => try stream.write("arm\\"),
358+
builtin.Arch.aarch64v8 => try stream.write("arm\\"),
359359
else => return error.UnsupportedArchitecture,
360360
}
361361
const kernel32_path = try std.os.path.join(loop.allocator, result_buf.toSliceConst(), "kernel32.lib");

src-self-hosted/link.zig

+2-2
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
330330
switch (ctx.comp.target.getArch()) {
331331
builtin.Arch.i386 => try ctx.args.append(c"-MACHINE:X86"),
332332
builtin.Arch.x86_64 => try ctx.args.append(c"-MACHINE:X64"),
333-
builtin.Arch.aarch64 => try ctx.args.append(c"-MACHINE:ARM"),
333+
builtin.Arch.aarch64v8 => try ctx.args.append(c"-MACHINE:ARM"),
334334
else => return error.UnsupportedLinkArchitecture,
335335
}
336336

@@ -556,7 +556,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
556556
}
557557
},
558558
DarwinPlatform.Kind.IPhoneOS => {
559-
if (ctx.comp.target.getArch() == builtin.Arch.aarch64) {
559+
if (ctx.comp.target.getArch() == builtin.Arch.aarch64v8) {
560560
// iOS does not need any crt1 files for arm64
561561
} else if (platform.versionLessThan(3, 1)) {
562562
try ctx.args.append(c"-lcrt1.o");

src-self-hosted/target.zig

+39-5
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,20 @@ pub const Target = union(enum) {
250250
builtin.Arch.renderscript32,
251251
=> return 32,
252252

253-
builtin.Arch.aarch64,
254-
builtin.Arch.aarch64_be,
253+
builtin.Arch.aarch64v8_3a,
254+
builtin.Arch.aarch64v8_2a,
255+
builtin.Arch.aarch64v8_1a,
256+
builtin.Arch.aarch64v8,
257+
builtin.Arch.aarch64v8r,
258+
builtin.Arch.aarch64v8m_baseline,
259+
builtin.Arch.aarch64v8m_mainline,
260+
builtin.Arch.aarch64_bev8_3a,
261+
builtin.Arch.aarch64_bev8_2a,
262+
builtin.Arch.aarch64_bev8_1a,
263+
builtin.Arch.aarch64_bev8,
264+
builtin.Arch.aarch64_bev8r,
265+
builtin.Arch.aarch64_bev8m_baseline,
266+
builtin.Arch.aarch64_bev8m_mainline,
255267
builtin.Arch.mips64,
256268
builtin.Arch.mips64el,
257269
builtin.Arch.powerpc64,
@@ -316,8 +328,23 @@ pub const Target = union(enum) {
316328
builtin.Arch.sparcel,
317329
=> return "/lib/ld-linux.so.2",
318330

319-
builtin.Arch.aarch64 => return "/lib/ld-linux-aarch64.so.1",
320-
builtin.Arch.aarch64_be => return "/lib/ld-linux-aarch64_be.so.1",
331+
builtin.Arch.aarch64v8_3a,
332+
builtin.Arch.aarch64v8_2a,
333+
builtin.Arch.aarch64v8_1a,
334+
builtin.Arch.aarch64v8,
335+
builtin.Arch.aarch64v8r,
336+
builtin.Arch.aarch64v8m_baseline,
337+
builtin.Arch.aarch64v8m_mainline,
338+
=> return "/lib/ld-linux-aarch64.so.1",
339+
340+
builtin.Arch.aarch64_bev8_3a,
341+
builtin.Arch.aarch64_bev8_2a,
342+
builtin.Arch.aarch64_bev8_1a,
343+
builtin.Arch.aarch64_bev8,
344+
builtin.Arch.aarch64_bev8r,
345+
builtin.Arch.aarch64_bev8m_baseline,
346+
builtin.Arch.aarch64_bev8m_mainline,
347+
=> return "/lib/ld-linux-aarch64_be.so.1",
321348

322349
builtin.Arch.armv8_3a,
323350
builtin.Arch.armv8_2a,
@@ -530,7 +557,14 @@ pub const Target = union(enum) {
530557
pub fn getDarwinArchString(self: Target) []const u8 {
531558
const arch = self.getArch();
532559
switch (arch) {
533-
builtin.Arch.aarch64 => return "arm64",
560+
builtin.Arch.aarch64v8_3a,
561+
builtin.Arch.aarch64v8_2a,
562+
builtin.Arch.aarch64v8_1a,
563+
builtin.Arch.aarch64v8,
564+
builtin.Arch.aarch64v8r,
565+
builtin.Arch.aarch64v8m_baseline,
566+
builtin.Arch.aarch64v8m_mainline,
567+
=> return "arm64",
534568
builtin.Arch.thumb,
535569
builtin.Arch.armv8_3a,
536570
builtin.Arch.armv8_2a,

src/os.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ static void populate_termination(Termination *term, int status) {
9090
static void os_spawn_process_posix(const char *exe, ZigList<const char *> &args, Termination *term) {
9191
pid_t pid = fork();
9292
if (pid == -1)
93-
zig_panic("fork failed");
93+
zig_panic("fork failed: %s", strerror(errno));
9494
if (pid == 0) {
9595
// child
9696
const char **argv = allocate<const char *>(args.length + 2);
@@ -806,7 +806,7 @@ static int os_exec_process_posix(const char *exe, ZigList<const char *> &args,
806806

807807
pid_t pid = fork();
808808
if (pid == -1)
809-
zig_panic("fork failed");
809+
zig_panic("fork failed: %s", strerror(errno));
810810
if (pid == 0) {
811811
// child
812812
if (dup2(stdin_pipe[0], STDIN_FILENO) == -1)

src/target.cpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,22 @@ static const ArchType arch_list[] = {
5555
{ZigLLVM_armeb, ZigLLVM_ARMSubArch_v5te},
5656
{ZigLLVM_armeb, ZigLLVM_ARMSubArch_v4t},
5757

58-
{ZigLLVM_aarch64, ZigLLVM_NoSubArch},
59-
{ZigLLVM_aarch64_be, ZigLLVM_NoSubArch},
58+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8_3a},
59+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8_2a},
60+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8_1a},
61+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8},
62+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8r},
63+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8m_baseline},
64+
{ZigLLVM_aarch64, ZigLLVM_ARMSubArch_v8m_mainline},
65+
66+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8_3a},
67+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8_2a},
68+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8_1a},
69+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8},
70+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8r},
71+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8m_baseline},
72+
{ZigLLVM_aarch64_be, ZigLLVM_ARMSubArch_v8m_mainline},
73+
6074
{ZigLLVM_arc, ZigLLVM_NoSubArch},
6175
{ZigLLVM_avr, ZigLLVM_NoSubArch},
6276
{ZigLLVM_bpfel, ZigLLVM_NoSubArch},
@@ -943,8 +957,9 @@ const char *arch_stack_pointer_register_name(const ArchType *arch) {
943957
return "sp";
944958
case ZigLLVM_x86_64:
945959
return "rsp";
946-
947960
case ZigLLVM_aarch64:
961+
return "sp";
962+
948963
case ZigLLVM_arm:
949964
case ZigLLVM_thumb:
950965
case ZigLLVM_aarch64_be:

std/elf.zig

+5
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,11 @@ pub const Elf_MIPS_ABIFlags_v0 = extern struct {
859859
flags2: Elf32_Word,
860860
};
861861

862+
pub const Auxv = switch (@sizeOf(usize)) {
863+
4 => Elf32_auxv_t,
864+
8 => Elf64_auxv_t,
865+
else => @compileError("expected pointer size of 32 or 64"),
866+
};
862867
pub const Ehdr = switch (@sizeOf(usize)) {
863868
4 => Elf32_Ehdr,
864869
8 => Elf64_Ehdr,

std/fmt/index.zig

+3-1
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,9 @@ test "fmt.format" {
10441044
const result = try bufPrint(buf1[0..], "f64: {}\n", math.nan_f64);
10451045
assert(mem.eql(u8, result, "f64: nan\n"));
10461046
}
1047-
{
1047+
if (builtin.arch != builtin.Arch.armv8) {
1048+
// negative nan is not defined by IEE 754,
1049+
// and ARM thus normalizes it to positive nan
10481050
var buf1: [32]u8 = undefined;
10491051
const result = try bufPrint(buf1[0..], "f64: {}\n", -math.nan_f64);
10501052
assert(mem.eql(u8, result, "f64: -nan\n"));

std/math/index.zig

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pub const pi = 3.14159265358979323846264338327950288419716939937510;
88

99
// float.h details
1010
pub const f64_true_min = 4.94065645841246544177e-324;
11-
pub const f64_min = 2.22507385850720138309e-308;
11+
pub const f64_min = 2.2250738585072014e-308;
1212
pub const f64_max = 1.79769313486231570815e+308;
1313
pub const f64_epsilon = 2.22044604925031308085e-16;
1414
pub const f64_toint = 1.0 / f64_epsilon;
@@ -650,3 +650,9 @@ pub fn lossyCast(comptime T: type, value: var) T {
650650
else => @compileError("bad type"),
651651
}
652652
}
653+
654+
test "math.f64_min" {
655+
const f64_min_u64 = 0x0010000000000000;
656+
const fmin: f64 = f64_min;
657+
assert(@bitCast(u64, fmin) == f64_min_u64);
658+
}

std/os/index.zig

+11-7
Original file line numberDiff line numberDiff line change
@@ -655,16 +655,21 @@ fn posixExecveErrnoToErr(err: usize) PosixExecveError {
655655
}
656656
}
657657

658-
pub var linux_aux_raw = []usize{0} ** 38;
658+
pub var linux_elf_aux_maybe: ?[*]std.elf.Auxv = null;
659659
pub var posix_environ_raw: [][*]u8 = undefined;
660660

661661
/// See std.elf for the constants.
662662
pub fn linuxGetAuxVal(index: usize) usize {
663663
if (builtin.link_libc) {
664664
return usize(std.c.getauxval(index));
665-
} else {
666-
return linux_aux_raw[index];
665+
} else if (linux_elf_aux_maybe) |auxv| {
666+
var i: usize = 0;
667+
while (auxv[i].a_type != std.elf.AT_NULL) : (i += 1) {
668+
if (auxv[i].a_type == index)
669+
return auxv[i].a_un.a_val;
670+
}
667671
}
672+
return 0;
668673
}
669674

670675
pub fn getBaseAddress() usize {
@@ -1676,7 +1681,7 @@ pub const Dir = struct {
16761681
}
16771682

16781683
while (true) {
1679-
const result = posix.getdents(self.handle.fd, self.handle.buf.ptr, self.handle.buf.len);
1684+
const result = posix.getdents64(self.handle.fd, self.handle.buf.ptr, self.handle.buf.len);
16801685
const err = posix.getErrno(result);
16811686
if (err > 0) {
16821687
switch (err) {
@@ -1694,7 +1699,7 @@ pub const Dir = struct {
16941699
break;
16951700
}
16961701
}
1697-
const linux_entry = @ptrCast(*align(1) posix.dirent, &self.handle.buf[self.handle.index]);
1702+
const linux_entry = @ptrCast(*align(1) posix.dirent64, &self.handle.buf[self.handle.index]);
16981703
const next_index = self.handle.index + linux_entry.d_reclen;
16991704
self.handle.index = next_index;
17001705

@@ -1705,8 +1710,7 @@ pub const Dir = struct {
17051710
continue :start_over;
17061711
}
17071712

1708-
const type_char = self.handle.buf[next_index - 1];
1709-
const entry_kind = switch (type_char) {
1713+
const entry_kind = switch (linux_entry.d_type) {
17101714
posix.DT_BLK => Entry.Kind.BlockDevice,
17111715
posix.DT_CHR => Entry.Kind.CharacterDevice,
17121716
posix.DT_DIR => Entry.Kind.Directory,

0 commit comments

Comments
 (0)