diff --git a/lib/compiler/test_runner.zig b/lib/compiler/test_runner.zig index 0fd5afad694b6aa417fb7cdfcf7305614574d883..9ecfa4d03951427c9b091f6e59d50c120d4ee7f1 100644 --- a/lib/compiler/test_runner.zig +++ b/lib/compiler/test_runner.zig @@ -26,6 +26,7 @@ const runner_threaded_io: Io = Io.Threaded.global_single_threaded.io(); /// the test runner will communicate with the build runner via `std.zig.Server`. const need_simple = switch (builtin.zig_backend) { .stage2_aarch64, + .stage2_loongarch, .stage2_powerpc, .stage2_riscv64, => true, diff --git a/lib/std/debug.zig b/lib/std/debug.zig index 59a8dcd9eae1cf7ba40a1e5e9c50a683186c322c..ca1bf3f6edf8a79fb2459fe481f311ec7f50c4b1 100644 --- a/lib/std/debug.zig +++ b/lib/std/debug.zig @@ -498,6 +498,7 @@ threadlocal var panic_stage: usize = 0; const use_trap_panic = switch (builtin.zig_backend) { .stage2_aarch64, .stage2_arm, + .stage2_loongarch, .stage2_powerpc, .stage2_riscv64, .stage2_spirv, diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 55b9019c4f4d95cfce0f271de52d12a856f9aea8..552dfce320311fb7f672611443de0440a415340b 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -735,6 +735,7 @@ test lessThan { const use_vectors = switch (builtin.zig_backend) { // These backends don't support vectors yet. .stage2_aarch64, + .stage2_loongarch, .stage2_powerpc, .stage2_riscv64, => false, diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 8fd3fca48e788610aa574ced6d7c7c56a90c0568..835da881ff859006def9b02fe004fa32df3d2215 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -681,6 +681,7 @@ pub var elf_aux_maybe: ?[*]std.elf.Auxv = null; const extern_getauxval = switch (builtin.zig_backend) { // Calling extern functions is not yet supported with these backends .stage2_arm, + .stage2_loongarch, .stage2_powerpc, .stage2_riscv64, .stage2_sparc64, diff --git a/lib/std/start.zig b/lib/std/start.zig index 6021da10325aa38a6be00d59ecc1d58634deba77..20cd8548f711901aa61d64d6799d685512df9521 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -180,7 +180,10 @@ fn _start() callconv(.naked) noreturn { .csky => ".cfi_undefined lr", .hexagon => ".cfi_undefined r31", .kvx => ".cfi_undefined r14", - .loongarch32, .loongarch64 => ".cfi_undefined 1", + .loongarch32, .loongarch64 => if (builtin.zig_backend == .stage2_loongarch) + "" + else + ".cfi_undefined 1", .m68k => ".cfi_undefined %%pc", .m88k => ".cfi_undefined %%r1", .microblaze, .microblazeel => "", // No CFI support. @@ -215,6 +218,32 @@ fn _start() callconv(.naked) noreturn { // kernel is usually good about upholding the ABI guarantees, the same cannot be said of dynamic // linkers; musl's ldso, for example, opts to not align the stack when invoking the dynamic // linker explicitly. + if (builtin.zig_backend == .stage2_loongarch) { + // TODO: need "X" constraint support + asm volatile (switch (native_arch) { + .loongarch32 => + \\ move $fp, $zero + \\ move $ra, $zero + \\ move $a0, $sp + \\ srli.w $sp, $sp, 4 + \\ slli.w $sp, $sp, 4 + \\ jirl $ra, %[posixCallMainAndExit], 0 + , + .loongarch64 => + \\ move $fp, $zero + \\ move $ra, $zero + \\ move $a0, $sp + \\ bstrins.d $sp, $zero, 3, 0 + \\ jirl $ra, %[posixCallMainAndExit], 0 + , + else => unreachable, + } + : + : [posixCallMainAndExit] "r" (&posixCallMainAndExit), + : .{ .r1 = true, .r4 = true, .r22 = true }); + unreachable; + } + asm volatile (switch (native_arch) { .x86_64 => \\ xorl %%ebp, %%ebp diff --git a/lib/std/testing.zig b/lib/std/testing.zig index eebf3a5195c0d2407c7c51d3b67ef794011f6736..6bef15e8a196bfaf19da01b4eaccff86ee561b15 100644 --- a/lib/std/testing.zig +++ b/lib/std/testing.zig @@ -34,6 +34,7 @@ pub var log_level = std.log.Level.warn; // Disable printing in tests for simple backends. pub const backend_can_print = switch (builtin.zig_backend) { .stage2_aarch64, + .stage2_loongarch, .stage2_powerpc, .stage2_riscv64, .stage2_spirv, diff --git a/lib/ubsan_rt.zig b/lib/ubsan_rt.zig index b6fdc5f5aeedc901213ed96c14710904e6ee6336..8fce8a932bc6843c217dd951938a24f4184ccd4c 100644 --- a/lib/ubsan_rt.zig +++ b/lib/ubsan_rt.zig @@ -647,6 +647,7 @@ fn exportHandlerWithAbort( } const can_build_ubsan = switch (builtin.zig_backend) { + .stage2_loongarch, .stage2_powerpc, .stage2_riscv64, => false,