Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tier 1 Support for sparc64-linux #4931

Open
andrewrk opened this issue Apr 4, 2020 · 7 comments
Open

Tier 1 Support for sparc64-linux #4931

andrewrk opened this issue Apr 4, 2020 · 7 comments
Labels
arch-sparc 32-bit and 64-bit SPARC contributor friendly This issue is limited in scope and/or knowledge of Zig internals. enhancement Solving this issue will likely involve adding new logic or components to the codebase. linking os-linux standard library This issue involves writing Zig code for the standard library.
Milestone

Comments

@andrewrk
Copy link
Member

andrewrk commented Apr 4, 2020

A little humor:

<Thalheim> andrewrk: bootstrapping zig on sparc64 using the repo you posted peaks at consuming 104GB of memory on my machine, about 40% done so far
<floatcomplex> tell me you didn't try to build gcc with make -j256
<Thalheim> that's exactly what I did https://i.imgur.com/JvGpR51.png

sparc-cpus

Trying to build zig for this target gives:

[ 99%] Built target zig0
make[2]: Entering directory '/home/z/zig-bootstrap/out/build-zig-host'
Scanning dependencies of target zig_build_libstage2
make[2]: Leaving directory '/home/z/zig-bootstrap/out/build-zig-host'
make[2]: Entering directory '/home/z/zig-bootstrap/out/build-zig-host'
./lib/std/fs/file.zig:30:24: error: container 'std.os' has no member called 'mode_t'
    pub const Mode = os.mode_t;
                       ^
./lib/std/fs.zig:1284:19: note: referenced here
        mode: File.Mode = File.default_mode,
                  ^
./lib/std/io/buffered_atomic_file.zig:29:40: note: referenced here
        self.atomic_file = try fs.cwd().atomicFile(dest_path, .{});
                                       ^
./src-self-hosted/stage2.zig:370:21: note: referenced here
        const baf = try io.BufferedAtomicFile.create(fmt.allocator, file_path);
                    ^
./lib/std/time.zig:146:23: error: container 'std.os' has no member called 'timespec'
            var ts: os.timespec = undefined;
                      ^
./lib/std/fs/file.zig:164:18: error: container 'std.os' has no member called 'ino_t'
        inode: os.ino_t,
                 ^
./lib/std/fs/file.zig:182:38: note: referenced here
    pub fn stat(self: File) StatError!Stat {
                                     ^
./lib/std/fs/file.zig:142:25: note: referenced here
        return (try self.stat()).size;
                        ^
./lib/std/event/loop.zig:1244:25: error: container 'std.os' has no member called 'mode_t'
                mode: os.mode_t,
                        ^
./lib/std/event/loop.zig:1182:13: note: while checking this field
            open: Open,
            ^
./lib/std/event/loop.zig:1165:9: note: while checking this field
        msg: Msg,
        ^
./lib/std/linked_list.zig:200:13: note: while checking this field
            data: T,
            ^
./lib/std/atomic/queue.zig:10:9: note: while checking this field
        head: ?*Node,
        ^
./lib/std/event/loop.zig:1160:9: note: while checking this field
        fs_queue: std.atomic.Queue(Request),
        ^
./lib/std/event/loop.zig:16:5: note: while checking this field
    os_data: OsData,
    ^
./lib/std/event/loop.zig:96:25: note: referenced here
    pub const instance: ?*Loop = if (@hasDecl(root, "event_loop")) root.event_loop else default_instance;
                        ^
./lib/std/os.zig:614:41: note: referenced here
            EAGAIN => if (std.event.Loop.instance) |loop| {
                                        ^
./lib/std/fs.zig:598:42: error: container 'std.os' has no member called 'O_CLOEXEC'
        const os_flags = O_LARGEFILE | os.O_CLOEXEC | if (flags.write and flags.read)
                                         ^
./lib/std/fs.zig:777:53: error: container 'std.os' has no member called 'O_DIRECTORY'
            return self.openDirFlagsZ(sub_path_c, os.O_DIRECTORY | os.O_RDONLY | os.O_CLOEXEC | O_PATH);
                                                    ^
./lib/std/reset_event.zig:252:26: error: container 'std.os.linux' has no member called 'timespec'
            var ts: linux.timespec = undefined;
                         ^
./lib/std/os/linux.zig:138:12: error: use of undeclared identifier 'syscall3'
    return syscall3(
           ^
./lib/std/time.zig:183:19: error: container 'std.os' has no member called 'timespec'
        var ts: os.timespec = undefined;
                  ^
./lib/std/os.zig:909:74: error: use of undeclared identifier 'mode_t'
pub fn openatZ(dir_fd: fd_t, file_path: [*:0]const u8, flags: u32, mode: mode_t) OpenError!fd_t {
                                                                         ^
./lib/std/fs.zig:799:15: note: referenced here
            os.openatZ(self.fd, sub_path_c, flags, 0);
              ^
make[2]: *** [CMakeFiles/zig_build_libstage2.dir/build.make:57: CMakeFiles/zig_build_libstage2] Error 1
make[2]: Leaving directory '/home/z/zig-bootstrap/out/build-zig-host'
make[1]: *** [CMakeFiles/Makefile2:119: CMakeFiles/zig_build_libstage2.dir/all] Error 2
make[1]: Leaving directory '/home/z/zig-bootstrap/out/build-zig-host'

Behavior tests:

[nix-shell:~/dev/zig/build]$ ./zig test ../test/stage1/behavior.zig -target sparcv9-linux 
TODO buf_read_value_bytes packed struct big endian
/home/andy/dev/zig/src-self-hosted/stage2.zig:37:5: 0xb66c0c in stage2_panic (zigstage2)
    @panic(ptr[0..len]);
    ^
/home/andy/dev/zig/src/util.cpp:20:17: 0xb2641b in zig_panic (/home/andy/dev/zig/src/util.cpp)
    stage2_panic("", 0);
                ^
/home/andy/dev/zig/src/ir.cpp:28432:42: 0xaea1bc in buf_read_value_bytes (/home/andy/dev/zig/src/ir.cpp)
                                zig_panic("TODO buf_read_value_bytes packed struct big endian");
                                         ^
/home/andy/dev/zig/src/ir.cpp:28525:40: 0xaea6f3 in ir_analyze_bit_cast (/home/andy/dev/zig/src/ir.cpp)
        if ((err = buf_read_value_bytes(ira, ira->codegen, source_instr->source_node, buf, result->value)))
                                       ^
/home/andy/dev/zig/src/ir.cpp:18644:54: 0xac5147 in ir_resolve_result_raw (/home/andy/dev/zig/src/ir.cpp)
                bitcasted_value = ir_analyze_bit_cast(ira, &result_loc->source_instruction->base, value, dest_type);
                                                     ^
/home/andy/dev/zig/src/ir.cpp:18712:50: 0xac565f in ir_resolve_result (/home/andy/dev/zig/src/ir.cpp)
    IrInstGen *result_loc = ir_resolve_result_raw(ira, suspend_source_instr, result_loc_pass1, value_type,
                                                 ^
/home/andy/dev/zig/src/ir.cpp:29661:46: 0xaee29f in ir_analyze_instruction_end_expr (/home/andy/dev/zig/src/ir.cpp)
    IrInstGen *result_loc = ir_resolve_result(ira, &instruction->base.base, instruction->result_loc,
                                             ^
/home/andy/dev/zig/src/ir.cpp:30176:51: 0xaefb9b in ir_analyze_instruction_base (/home/andy/dev/zig/src/ir.cpp)
            return ir_analyze_instruction_end_expr(ira, (IrInstSrcEndExpr *)instruction);
                                                  ^
/home/andy/dev/zig/src/ir.cpp:30268:65: 0xaf00d3 in ir_analyze (/home/andy/dev/zig/src/ir.cpp)
        IrInstGen *new_instruction = ir_analyze_instruction_base(ira, old_instruction);
                                                                ^
/home/andy/dev/zig/src/ir.cpp:13205:38: 0xab1aee in ir_eval_const_value (/home/andy/dev/zig/src/ir.cpp)
    ZigType *result_type = ir_analyze(codegen, ir_executable, analyzed_executable,
                                     ^
/home/andy/dev/zig/src/ir.cpp:19455:43: 0xac7ddd in ir_analyze_fn_call (/home/andy/dev/zig/src/ir.cpp)
            if ((err = ir_eval_const_value(ira->codegen, exec_scope, body_node, result_ptr,
                                          ^
/home/andy/dev/zig/src/ir.cpp:19871:43: 0xac9a88 in ir_analyze_fn_call_src (/home/andy/dev/zig/src/ir.cpp)
    IrInstGen *result = ir_analyze_fn_call(ira, &call_instruction->base.base, fn_entry, fn_type, fn_ref,
                                          ^
/home/andy/dev/zig/src/ir.cpp:20052:42: 0xaca5a0 in ir_analyze_instruction_call (/home/andy/dev/zig/src/ir.cpp)
            return ir_analyze_fn_call_src(ira, call_instruction, fn_table_entry, fn_type,
                                         ^
/home/andy/dev/zig/src/ir.cpp:29954:47: 0xaef141 in ir_analyze_instruction_base (/home/andy/dev/zig/src/ir.cpp)
            return ir_analyze_instruction_call(ira, (IrInstSrcCall *)instruction);
                                              ^
/home/andy/dev/zig/src/ir.cpp:30268:65: 0xaf00d3 in ir_analyze (/home/andy/dev/zig/src/ir.cpp)
        IrInstGen *new_instruction = ir_analyze_instruction_base(ira, old_instruction);
                                                                ^
/home/andy/dev/zig/src/analyze.cpp:4832:44: 0xb3581b in analyze_fn_ir (/home/andy/dev/zig/src/analyze.cpp)
    ZigType *block_return_type = ir_analyze(g, fn->ir_executable,
                                           ^
/home/andy/dev/zig/src/analyze.cpp:4948:18: 0xb35dcb in analyze_fn_body (/home/andy/dev/zig/src/analyze.cpp)
    analyze_fn_ir(g, fn_table_entry, return_type_node);
                 ^
/home/andy/dev/zig/src/analyze.cpp:5060:28: 0xb365cc in semantic_analyze (/home/andy/dev/zig/src/analyze.cpp)
            analyze_fn_body(g, fn_entry);
                           ^
/home/andy/dev/zig/src/codegen.cpp:9662:25: 0xa7210e in gen_root_source (/home/andy/dev/zig/src/codegen.cpp)
        semantic_analyze(g);
                        ^
/home/andy/dev/zig/src/codegen.cpp:10766:28: 0xa7631c in codegen_build_and_link (/home/andy/dev/zig/src/codegen.cpp)
            gen_root_source(g);
                           ^
/home/andy/dev/zig/src/main.cpp:1741:39: 0xa49640 in main0 (/home/andy/dev/zig/src/main.cpp)
                codegen_build_and_link(g);
                                      ^
/home/andy/dev/zig/src/main.cpp:1819:24: 0xa49aa1 in main (/home/andy/dev/zig/src/main.cpp)
    auto result = main0(argc, argv);
                       ^
Aborted (core dumped)

Hello world:

[nix-shell:~/dev/zig/build]$ ./zig build-exe hello.zig -target sparcv9-linux
/home/andy/dev/zig/lib/std/start.zig:119:17: error: unsupported arch
        else => @compileError("unsupported arch"),
                ^
/home/andy/dev/zig/lib/std/event/loop.zig:1244:25: error: container 'std.os' has no member called 'mode_t'
                mode: os.mode_t,
                        ^
/home/andy/dev/zig/lib/std/event/loop.zig:1182:13: note: while checking this field
            open: Open,
            ^
/home/andy/dev/zig/lib/std/event/loop.zig:1165:9: note: while checking this field
        msg: Msg,
        ^
/home/andy/dev/zig/lib/std/linked_list.zig:200:13: note: while checking this field
            data: T,
            ^
/home/andy/dev/zig/lib/std/atomic/queue.zig:10:9: note: while checking this field
        head: ?*Node,
        ^
/home/andy/dev/zig/lib/std/event/loop.zig:1160:9: note: while checking this field
        fs_queue: std.atomic.Queue(Request),
        ^
/home/andy/dev/zig/lib/std/event/loop.zig:16:5: note: while checking this field
    os_data: OsData,
    ^
/home/andy/dev/zig/lib/std/event/loop.zig:96:25: note: referenced here
    pub const instance: ?*Loop = if (@hasDecl(root, "event_loop")) root.event_loop else default_instance;
                        ^
/home/andy/dev/zig/lib/std/os.zig:614:41: note: referenced here
            EAGAIN => if (std.event.Loop.instance) |loop| {
                                        ^
/home/andy/dev/zig/lib/std/fs/file.zig:164:18: error: container 'std.os' has no member called 'ino_t'
        inode: os.ino_t,
                 ^
/home/andy/dev/zig/lib/std/fs/file.zig:182:38: note: referenced here
    pub fn stat(self: File) StatError!Stat {
                                     ^
/home/andy/dev/zig/lib/std/fs/file.zig:142:25: note: referenced here
        return (try self.stat()).size;
                        ^
/home/andy/dev/zig/lib/std/reset_event.zig:252:26: error: container 'std.os.linux' has no member called 'timespec'
            var ts: linux.timespec = undefined;
                         ^
/home/andy/dev/zig/lib/std/os/linux.zig:785:60: error: use of undeclared identifier 'restore_rt'
    const restorer_fn = if ((act.flags & SA_SIGINFO) != 0) restore_rt else restore;
                                                           ^
/home/andy/dev/zig/lib/std/os/linux.zig:390:12: error: use of undeclared identifier 'syscall3'
    return syscall3(.write, @bitCast(usize, @as(isize, fd)), @ptrToInt(buf), count);
           ^
/home/andy/dev/zig/lib/std/os/linux.zig:777:12: error: use of undeclared identifier 'syscall4'
    return syscall4(.rt_sigprocmask, flags, @ptrToInt(set), @ptrToInt(oldset), NSIG / 8);
           ^
/home/andy/dev/zig/lib/std/os/linux.zig:773:43: error: use of undeclared identifier 'syscall0'
    return @bitCast(pid_t, @truncate(u32, syscall0(.gettid)));
                                          ^
/home/andy/dev/zig/lib/std/os/linux.zig:568:12: error: use of undeclared identifier 'syscall2'
    return syscall2(.tkill, @bitCast(usize, @as(isize, tid)), @bitCast(usize, @as(isize, sig)));
           ^
/home/andy/dev/zig/lib/std/os/linux.zig:555:9: error: use of undeclared identifier 'syscall1'
    _ = syscall1(.exit_group, @bitCast(usize, @as(isize, status)));
        ^
/home/andy/dev/zig/lib/std/fs.zig:598:42: error: container 'std.os' has no member called 'O_CLOEXEC'
        const os_flags = O_LARGEFILE | os.O_CLOEXEC | if (flags.write and flags.read)
                                         ^
/home/andy/dev/zig/lib/std/os/linux.zig:195:19: error: use of undeclared identifier 'SYS'
    if (@hasField(SYS, "mmap2")) {
                  ^

Building C hello world:

[nix-shell:~/dev/zig/build]$ ./zig build-exe --c-source hello.c -lc -target sparcv9-linux-gnu
error: unknown target CPU 'generic'
note: valid target CPU values are: v9, ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4

The following command failed:
/home/andy/dev/zig/build/zig clang -c -nostdinc -fno-spell-checking -target sparcv9-unknown-linux-gnu -isystem /home/andy/dev/zig/lib/include -isystem /home/andy/dev/zig/lib/libc/include/sparcv9-linux-gnu -isystem /home/andy/dev/zig/lib/libc/include/generic-glibc -isystem /home/andy/dev/zig/lib/libc/include/sparcv9-linux-any -isystem /home/andy/dev/zig/lib/libc/include/any-linux-any -Xclang -target-cpu -Xclang generic -Xclang -target-feature -Xclang -deprecated-v8,-detectroundchange,-fixallfdivsqrt,-hard-quad-float,-hasleoncasa,-hasumacsmac,-insertnopload,-leon,-leoncyclecounter,-leonpwrpsr,-no-fmuls,-no-fsmuld,-popc,-soft-float,-soft-mul-div,-v9,-vis,-vis2,-vis3 -MD -MV -MF zig-cache/tmp/JFSP-RvBOg9S-hello.o.d -g -fno-omit-frame-pointer -fsanitize=undefined -fsanitize-trap=undefined -D_DEBUG -Og -fstack-protector-strong --param ssp-buffer-size=4 -fPIC -o zig-cache/tmp/JFSP-RvBOg9S-hello.o hello.c
@andrewrk andrewrk added enhancement Solving this issue will likely involve adding new logic or components to the codebase. contributor friendly This issue is limited in scope and/or knowledge of Zig internals. standard library This issue involves writing Zig code for the standard library. os-linux arch-sparc 32-bit and 64-bit SPARC labels Apr 4, 2020
@andrewrk andrewrk added this to the 0.7.0 milestone Apr 4, 2020
@zv-io
Copy link

zv-io commented Apr 4, 2020

If anyone needs SPARC hardware for testing, I can make some available. Andrew will put you in touch with me if necessary.

@andrewrk andrewrk modified the milestones: 0.7.0, 0.8.0 Oct 13, 2020
@andrewrk andrewrk modified the milestones: 0.8.0, 0.9.0 Nov 6, 2020
@andrewrk andrewrk modified the milestones: 0.9.0, 0.10.0 May 19, 2021
@andrewrk andrewrk changed the title sparc64-linux support in the standard library Tier 1 Support for sparc64-linux Jun 1, 2021
@koachan
Copy link
Contributor

koachan commented Sep 19, 2021

Pardon me for bumping this old thread, but is there any chance for a SPARC CI runner to happen?

@zv-io
Copy link

zv-io commented Sep 20, 2021

The machine referenced above is gcc102.fsffrance.org at the GCC Compile Farm: https://cfarm.tetaneutral.net/machines/list/.

Please let me know what (if anything) on the server side is needed to facilitate this.

@Richard-Rogalski
Copy link

I'm very interested in helping make this reality: Feel free to ping me for any help.

In the meantime, I'm going to play around and see what I can get working :)

@Beyley
Copy link

Beyley commented Jul 30, 2023

Theres a duplicate field here causing compile errors targetting sparc64 linux

Build Summary: 0/3 steps succeeded; 1 failed (disable with --summary none)
install transitive failure
└─ install zosu2011 transitive failure
   └─ zig build-exe zosu2011 Debug sparc64-linux 1 errors
C:\Users\ep1cm\Downloads\zig\lib\std\os\linux\sparc64.zig:448:5: error: duplicate struct field: 'sigmask'
    sigmask: sigset_t,
    ^~~~~~~
C:\Users\ep1cm\Downloads\zig\lib\std\os\linux\sparc64.zig:445:5: note: other field here
    sigmask: u64,
    ^~~~~~~
C:\Users\ep1cm\Downloads\zig\lib\std\os\linux\sparc64.zig:442:31: note: struct declared here
pub const ucontext_t = extern struct {
                       ~~~~~~~^~~~~~
referenced by:
    ucontext_t: C:\Users\ep1cm\Downloads\zig\lib\std\os\linux\sparc64.zig:442:31
    ucontext_t: C:\Users\ep1cm\Downloads\zig\lib\std\os\linux.zig:87:33
    remaining reference traces hidden; use '-freference-trace' to see all reference traces

should i open a separate issue for this?

@nektro
Copy link
Contributor

nektro commented Jul 30, 2023

no, open the pr directly and reference back to this. include the test program you got to pass and command you ran to test in the pr description

@alexrp
Copy link
Member

alexrp commented Oct 9, 2024

The main blocker now is linking support. LLD seems to only have partial support for sparc64 (and none for sparc32).

@alexrp alexrp added the linking label Oct 9, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
arch-sparc 32-bit and 64-bit SPARC contributor friendly This issue is limited in scope and/or knowledge of Zig internals. enhancement Solving this issue will likely involve adding new logic or components to the codebase. linking os-linux standard library This issue involves writing Zig code for the standard library.
Projects
None yet
Development

No branches or pull requests

7 participants