authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-05-23 13:54:35+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-05-23 13:54:35+02:00
logd591145f5dcab5aba1ab6aa65e7a57663f3a0f19
tree21ee8cc8028f32635d69c7a9771d8743bbabd902
parenta06f23c8ea132a4e45dcc396a35826aa1b0e0aea
parent952642dd6085744761f02a5410aa108c36b3323c

Merge pull request 'add `m88k-openbsd` target info and stack tracing + some bonus commits' (#35429) from alexrp/zig:m88k into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35429

13 files changed, 239 insertions(+), 14 deletions(-)

lib/std/Target.zig+21-8
......@@ -751,6 +751,7 @@ pub const kvx = @import("Target/kvx.zig");
751751pub const lanai = @import("Target/lanai.zig");
752752pub const loongarch = @import("Target/loongarch.zig");
753753pub const m68k = @import("Target/m68k.zig");
754pub const m88k = @import("Target/generic.zig");
754755pub const microblaze = @import("Target/generic.zig");
755756pub const mips = @import("Target/mips.zig");
756757pub const msp430 = @import("Target/msp430.zig");
......@@ -1091,6 +1092,7 @@ pub fn toElfMachine(target: *const Target) std.elf.EM {
10911092 .kvx => .KVX,
10921093 .lanai => .LANAI,
10931094 .loongarch32, .loongarch64 => .LOONGARCH,
1095 .m88k => .@"88K",
10941096 .m68k => .@"68K",
10951097 .microblaze, .microblazeel => .MICROBLAZE,
10961098 .mips, .mips64, .mipsel, .mips64el => .MIPS,
......@@ -1154,6 +1156,7 @@ pub fn toCoffMachine(target: *const Target) std.coff.IMAGE.FILE.MACHINE {
11541156 .kalimba,
11551157 .kvx,
11561158 .lanai,
1159 .m88k,
11571160 .m68k,
11581161 .microblaze,
11591162 .microblazeel,
......@@ -1364,6 +1367,7 @@ pub const Cpu = struct {
13641367 loongarch32,
13651368 loongarch64,
13661369 m68k,
1370 m88k,
13671371 microblaze,
13681372 microblazeel,
13691373 mips,
......@@ -1439,6 +1443,7 @@ pub const Cpu = struct {
14391443 lanai,
14401444 loongarch,
14411445 m68k,
1446 m88k,
14421447 microblaze,
14431448 mips,
14441449 msp430,
......@@ -1477,6 +1482,7 @@ pub const Cpu = struct {
14771482 .lanai => .lanai,
14781483 .loongarch32, .loongarch64 => .loongarch,
14791484 .m68k => .m68k,
1485 .m88k => .m88k,
14801486 .microblaze, .microblazeel => .microblaze,
14811487 .mips, .mipsel, .mips64, .mips64el => .mips,
14821488 .msp430 => .msp430,
......@@ -1710,6 +1716,7 @@ pub const Cpu = struct {
17101716 .hppa64,
17111717 .lanai,
17121718 .m68k,
1719 .m88k,
17131720 .microblaze,
17141721 .mips,
17151722 .mips64,
......@@ -1922,6 +1929,9 @@ pub const Cpu = struct {
19221929 .m68k_interrupt,
19231930 => &.{.m68k},
19241931
1932 .m88k_sysv,
1933 => &.{.m88k},
1934
19251935 .microblaze_std,
19261936 .microblaze_interrupt,
19271937 => &.{ .microblaze, .microblazeel },
......@@ -2554,6 +2564,7 @@ pub const DynamicLinker = struct {
25542564 .m68k,
25552565 .microblaze,
25562566 .microblazeel,
2567 .or1k,
25572568 .powerpc64,
25582569 .powerpc64le,
25592570 .s390x,
......@@ -2631,8 +2642,6 @@ pub const DynamicLinker = struct {
26312642
26322643 .arm,
26332644 .armeb,
2634 .thumb,
2635 .thumbeb,
26362645 => initFmt("/lib/ld-linux{s}.so.3", .{switch (abi) {
26372646 .gnueabi => "",
26382647 .gnueabihf => "-armhf",
......@@ -2641,6 +2650,7 @@ pub const DynamicLinker = struct {
26412650
26422651 .aarch64,
26432652 .aarch64_be,
2653 .or1k,
26442654 => |arch| if (abi == .gnu) initFmt("/lib/ld-linux-{s}.so.1", .{@tagName(arch)}) else none,
26452655
26462656 // TODO: `-be` architecture support.
......@@ -2803,6 +2813,7 @@ pub const DynamicLinker = struct {
28032813 .arm,
28042814 .aarch64,
28052815 .hppa,
2816 .m88k,
28062817 .mips64,
28072818 .mips64el,
28082819 .powerpc,
......@@ -2910,6 +2921,7 @@ pub fn ptrBitWidth_arch_abi(cpu_arch: Cpu.Arch, abi: Abi) u16 {
29102921 .lanai,
29112922 .loongarch32,
29122923 .m68k,
2924 .m88k,
29132925 .microblaze,
29142926 .microblazeel,
29152927 .mips,
......@@ -3495,6 +3507,7 @@ pub fn cTypeAlignment(target: *const Target, c_type: CType) u16 {
34953507 .hppa,
34963508 .lanai,
34973509 .m68k,
3510 .m88k,
34983511 .mips,
34993512 .mipsel,
35003513 .nvptx,
......@@ -3604,6 +3617,7 @@ pub fn cTypePreferredAlignment(target: *const Target, c_type: CType) u16 {
36043617 .hppa,
36053618 .lanai,
36063619 .m68k,
3620 .m88k,
36073621 .mips,
36083622 .mipsel,
36093623 .nvptx,
......@@ -3675,6 +3689,7 @@ pub fn cMaxIntAlignment(target: *const Target) u16 {
36753689 .lanai,
36763690 .loongarch32,
36773691 .m68k,
3692 .m88k,
36783693 .mips,
36793694 .mipsel,
36803695 .powerpc,
......@@ -3723,7 +3738,7 @@ pub fn cCallingConvention(target: *const Target) ?std.builtin.CallingConvention
37233738 .x86_64 => switch (target.os.tag) {
37243739 .windows, .uefi => .{ .x86_64_win = .{} },
37253740 else => switch (target.abi) {
3726 .gnuabin32, .muslabin32 => .{ .x86_64_x32 = .{} },
3741 .gnux32, .muslx32 => .{ .x86_64_x32 = .{} },
37273742 else => .{ .x86_64_sysv = .{} },
37283743 },
37293744 },
......@@ -3752,7 +3767,7 @@ pub fn cCallingConvention(target: *const Target) ?std.builtin.CallingConvention
37523767 .riscv32, .riscv32be => .{ .riscv32_ilp32 = .{} },
37533768 .sparc64 => .{ .sparc64_sysv = .{} },
37543769 .sparc => .{ .sparc_sysv = .{} },
3755 .powerpc64 => if (target.abi.isGnu())
3770 .powerpc64 => if (target.os.tag == .ps3 or target.abi.isGnu())
37563771 .{ .powerpc64_elf = .{} }
37573772 else
37583773 .{ .powerpc64_elf_v2 = .{} },
......@@ -3774,10 +3789,8 @@ pub fn cCallingConvention(target: *const Target) ?std.builtin.CallingConvention
37743789 .lanai => .{ .lanai_sysv = .{} },
37753790 .loongarch64 => .{ .loongarch64_lp64 = .{} },
37763791 .loongarch32 => .{ .loongarch32_ilp32 = .{} },
3777 .m68k => if (target.abi.isGnu() or target.abi.isMusl())
3778 .{ .m68k_gnu = .{} }
3779 else
3780 .{ .m68k_sysv = .{} },
3792 .m68k => .{ .m68k_gnu = .{} },
3793 .m88k => .{ .m88k_sysv = .{} },
37813794 .microblaze, .microblazeel => .{ .microblaze_std = .{} },
37823795 .msp430 => .{ .msp430_eabi = .{} },
37833796 .or1k => .{ .or1k_sysv = .{} },
lib/std/atomic.zig+2
......@@ -442,10 +442,12 @@ pub fn cacheLineForCpu(cpu: std.Target.Cpu) u16 {
442442 // - https://github.com/torvalds/linux/blob/3a7e02c040b130b5545e4b115aada7bacd80a2b6/arch/sparc/include/asm/cache.h#L14
443443 // - https://github.com/torvalds/linux/blob/3a7e02c040b130b5545e4b115aada7bacd80a2b6/arch/microblaze/include/asm/cache.h#L15
444444 // - https://github.com/torvalds/linux/blob/3a7e02c040b130b5545e4b115aada7bacd80a2b6/arch/sh/include/cpu-sh4/cpu/cache.h#L10
445 // - https://github.com/openbsd/src/blob/1957873d2063db11dab780eca75b5e629d1e838d/sys/arch/m88k/m88k/atomic.S#L22
445446 .arm,
446447 .armeb,
447448 .thumb,
448449 .thumbeb,
450 .m88k,
449451 .microblaze,
450452 .microblazeel,
451453 .mips,
lib/std/debug/Dwarf.zig+3
......@@ -1445,6 +1445,7 @@ pub fn ipRegNum(arch: std.Target.Cpu.Arch) ?u16 {
14451445 .lanai => 2,
14461446 .loongarch32, .loongarch64 => 64,
14471447 .m68k => 26,
1448 .m88k => 64,
14481449 .mips, .mipsel, .mips64, .mips64el => 66,
14491450 .or1k => 35,
14501451 .powerpc, .powerpcle, .powerpc64, .powerpc64le => 67,
......@@ -1470,6 +1471,7 @@ pub fn fpRegNum(arch: std.Target.Cpu.Arch) u16 {
14701471 .lanai => 5,
14711472 .loongarch32, .loongarch64 => 22,
14721473 .m68k => 14,
1474 .m88k => 30,
14731475 .mips, .mipsel, .mips64, .mips64el => 30,
14741476 .or1k => 2,
14751477 .powerpc, .powerpcle, .powerpc64, .powerpc64le => 1,
......@@ -1495,6 +1497,7 @@ pub fn spRegNum(arch: std.Target.Cpu.Arch) u16 {
14951497 .lanai => 4,
14961498 .loongarch32, .loongarch64 => 3,
14971499 .m68k => 15,
1500 .m88k => 31,
14981501 .mips, .mipsel, .mips64, .mips64el => 29,
14991502 .or1k => 1,
15001503 .powerpc, .powerpcle, .powerpc64, .powerpc64le => 1,
lib/std/debug/SelfInfo/Elf.zig+1
......@@ -161,6 +161,7 @@ pub const can_unwind: bool = s: {
161161 // Not supported yet: arm
162162 .openbsd => &.{
163163 .aarch64,
164 .m88k,
164165 .mips64,
165166 .mips64el,
166167 .riscv64,
lib/std/debug/cpu_context.zig+94-3
......@@ -14,6 +14,7 @@ else switch (native_arch) {
1414 .lanai => Lanai,
1515 .loongarch32, .loongarch64 => LoongArch,
1616 .m68k => M68k,
17 .m88k => M88k,
1718 .mips, .mipsel, .mips64, .mips64el => Mips,
1819 .or1k => Or1k,
1920 .powerpc, .powerpcle, .powerpc64, .powerpc64le => Powerpc,
......@@ -62,6 +63,13 @@ pub fn fromPosixSignalContext(ctx_ptr: ?*const anyopaque) ?Native {
6263 },
6364 .pc = @truncate(uc.mcontext.pc),
6465 };
66 } else if (native_arch == .m88k and native_os == .openbsd) {
67 // OpenBSD makes no effort to clear the V and E bits of the SXIP register when presenting it
68 // to user space, so we need to do that here.
69 return .{
70 .r = uc.mcontext.r,
71 .xip = uc.mcontext.xip & ~@as(u32, 0b11),
72 };
6573 } else if (native_arch.isMIPS32() and native_os == .linux) {
6674 // The O32 kABI uses 64-bit fields for some reason.
6775 return .{
......@@ -894,6 +902,75 @@ const M68k = extern struct {
894902 }
895903};
896904
905/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
906const M88k = extern struct {
907 /// The numbered general-purpose registers r0 - r31.
908 r: [32]u32,
909 xip: u32,
910
911 pub inline fn current() M88k {
912 var ctx: M88k = undefined;
913 asm volatile (
914 \\ st %%r0, %%r2, 0
915 \\ st %%r1, %%r2, 4
916 \\ st %%r2, %%r2, 8
917 \\ st %%r3, %%r2, 12
918 \\ st %%r4, %%r2, 16
919 \\ st %%r5, %%r2, 20
920 \\ st %%r6, %%r2, 24
921 \\ st %%r7, %%r2, 28
922 \\ st %%r8, %%r2, 32
923 \\ st %%r9, %%r2, 36
924 \\ st %%r10, %%r2, 40
925 \\ st %%r11, %%r2, 44
926 \\ st %%r12, %%r2, 48
927 \\ st %%r13, %%r2, 52
928 \\ st %%r14, %%r2, 56
929 \\ st %%r15, %%r2, 60
930 \\ st %%r16, %%r2, 64
931 \\ st %%r17, %%r2, 68
932 \\ st %%r18, %%r2, 72
933 \\ st %%r19, %%r2, 76
934 \\ st %%r20, %%r2, 80
935 \\ st %%r21, %%r2, 84
936 \\ st %%r22, %%r2, 88
937 \\ st %%r23, %%r2, 92
938 \\ st %%r24, %%r2, 96
939 \\ st %%r25, %%r2, 100
940 \\ st %%r26, %%r2, 104
941 \\ st %%r27, %%r2, 108
942 \\ st %%r28, %%r2, 112
943 \\ st %%r29, %%r2, 116
944 \\ st %%r30, %%r2, 120
945 \\ st %%r31, %%r2, 124
946 \\ bsr.n 1f
947 \\1:
948 \\ st %%r1, %%r2, 128
949 :
950 : [ctx] "{r2}" (&ctx),
951 : .{ .r1 = true, .memory = true });
952 return ctx;
953 }
954
955 pub fn getFp(ctx: *const M88k) u32 {
956 return ctx.r[30];
957 }
958 pub fn getPc(ctx: *const M88k) u32 {
959 return ctx.xip;
960 }
961
962 pub fn dwarfRegisterBytes(ctx: *M88k, register_num: u16) DwarfRegisterError![]u8 {
963 switch (register_num) {
964 0...31 => return @ptrCast(&ctx.r[register_num]),
965 64 => return @ptrCast(&ctx.xip),
966
967 32...63 => return error.UnsupportedRegister, // x0 - x31
968
969 else => return error.InvalidRegister,
970 }
971 }
972};
973
897974/// This is an `extern struct` so that inline assembly in `current` can use field offsets.
898975const Mips = extern struct {
899976 /// The numbered general-purpose registers r0 - r31. r0 must be zero.
......@@ -2330,9 +2407,11 @@ const signal_ucontext_t = switch (native_os) {
23302407 .alpha => extern struct {
23312408 _cookie: i64,
23322409 _mask: i64,
2333 pc: u64,
2334 _ps: i64,
2335 r: [32]u64,
2410 mcontext: extern struct {
2411 pc: u64,
2412 _ps: i64,
2413 r: [32]u64,
2414 },
23362415 },
23372416 // https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/arm/include/signal.h
23382417 .arm => extern struct {
......@@ -2361,6 +2440,18 @@ const signal_ucontext_t = switch (native_os) {
23612440 r23_29: [7]u32,
23622441 r31: u32,
23632442 },
2443 // https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/m88k/include/signal.h
2444 .m88k => extern struct {
2445 _cookie: i32,
2446 _mask: i32,
2447 mcontext: extern struct {
2448 r: [32]u32,
2449 _epsr: u32,
2450 _fpsr: u32,
2451 _fpcr: u32,
2452 xip: u32,
2453 },
2454 },
23642455 // https://github.com/openbsd/src/blob/42468faed8369d07ae49ae02dd71ec34f59b66cd/sys/arch/mips64/include/signal.h
23652456 .mips64, .mips64el => extern struct {
23662457 _cookie: i64,
lib/std/heap.zig+2
......@@ -608,6 +608,7 @@ const page_size_min_default: ?usize = switch (builtin.os.tag) {
608608 .hppa => 4 << 10,
609609 .x86, .x86_64 => 4 << 10,
610610 .thumb, .thumbeb, .arm, .armeb, .aarch64, .aarch64_be => 4 << 10,
611 .m88k => 4 << 10,
611612 .mips64, .mips64el => 4 << 10,
612613 .powerpc, .powerpc64, .powerpc64le, .powerpcle => 4 << 10,
613614 .riscv64 => 4 << 10,
......@@ -771,6 +772,7 @@ const page_size_max_default: ?usize = switch (builtin.os.tag) {
771772 .hppa => 4 << 10,
772773 .x86, .x86_64 => 4 << 10,
773774 .thumb, .thumbeb, .arm, .armeb, .aarch64, .aarch64_be => 4 << 10,
775 .m88k => 4 << 10,
774776 .mips64, .mips64el => 16 << 10,
775777 .powerpc, .powerpc64, .powerpc64le, .powerpcle => 4 << 10,
776778 .riscv64 => 4 << 10,
lib/std/lang.zig+2
......@@ -292,6 +292,8 @@ pub const CallingConvention = union(enum(u8)) {
292292 m68k_rtd: CommonOptions,
293293 m68k_interrupt: CommonOptions,
294294
295 m88k_sysv: CommonOptions,
296
295297 /// The standard `microblaze`/`microblazeel` calling convention.
296298 microblaze_std: CommonOptions,
297299 microblaze_interrupt: MicroblazeInterruptOptions,
lib/std/lang/assembly.zig+71
......@@ -1553,6 +1553,77 @@ pub const Clobbers = switch (@import("builtin").cpu.arch) {
15531553 r14: bool = false,
15541554 r15: bool = false,
15551555 },
1556 .m88k => packed struct {
1557 /// Whether the inline assembly code may perform stores to memory
1558 /// addresses other than those derived from input pointer provenance.
1559 memory: bool = false,
1560
1561 r0: bool = false,
1562 r1: bool = false,
1563 r2: bool = false,
1564 r3: bool = false,
1565 r4: bool = false,
1566 r5: bool = false,
1567 r6: bool = false,
1568 r7: bool = false,
1569 r8: bool = false,
1570 r9: bool = false,
1571 r10: bool = false,
1572 r11: bool = false,
1573 r12: bool = false,
1574 r13: bool = false,
1575 r14: bool = false,
1576 r15: bool = false,
1577 r16: bool = false,
1578 r17: bool = false,
1579 r18: bool = false,
1580 r19: bool = false,
1581 r20: bool = false,
1582 r21: bool = false,
1583 r22: bool = false,
1584 r23: bool = false,
1585 r24: bool = false,
1586 r25: bool = false,
1587 r26: bool = false,
1588 r27: bool = false,
1589 r28: bool = false,
1590 r29: bool = false,
1591 r30: bool = false,
1592 r31: bool = false,
1593
1594 x0: bool = false,
1595 x1: bool = false,
1596 x2: bool = false,
1597 x3: bool = false,
1598 x4: bool = false,
1599 x5: bool = false,
1600 x6: bool = false,
1601 x7: bool = false,
1602 x8: bool = false,
1603 x9: bool = false,
1604 x10: bool = false,
1605 x11: bool = false,
1606 x12: bool = false,
1607 x13: bool = false,
1608 x14: bool = false,
1609 x15: bool = false,
1610 x16: bool = false,
1611 x17: bool = false,
1612 x18: bool = false,
1613 x19: bool = false,
1614 x20: bool = false,
1615 x21: bool = false,
1616 x22: bool = false,
1617 x23: bool = false,
1618 x24: bool = false,
1619 x25: bool = false,
1620 x26: bool = false,
1621 x27: bool = false,
1622 x28: bool = false,
1623 x29: bool = false,
1624 x30: bool = false,
1625 x31: bool = false,
1626 },
15561627 .m68k => packed struct {
15571628 /// Whether the inline assembly code may perform stores to memory
15581629 /// addresses other than those derived from input pointer provenance.
lib/std/start.zig+11
......@@ -169,6 +169,7 @@ fn _start() callconv(.naked) noreturn {
169169 .kvx => ".cfi_undefined r14",
170170 .loongarch32, .loongarch64 => ".cfi_undefined 1",
171171 .m68k => ".cfi_undefined %%pc",
172 .m88k => ".cfi_undefined %%r1",
172173 .microblaze, .microblazeel => ".cfi_undefined r15",
173174 .mips, .mipsel, .mips64, .mips64el => ".cfi_undefined $ra",
174175 .or1k => ".cfi_undefined r9",
......@@ -331,6 +332,16 @@ fn _start() callconv(.naked) noreturn {
331332 \\ lea %[posixCallMainAndExit] - . - 8, %%a0
332333 \\ jsr (%%pc, %%a0)
333334 ,
335 .m88k =>
336 // r1 = LR, r30 = FP, r31 = SP
337 \\ or %%r0, %%r0, %%r0
338 \\ or %%r0, %%r0, %%r0
339 \\ or %%30, %%r0, %%r0
340 \\ or %%r1, %%r0, %%r0
341 \\ or %%r2, %%r31, %%r0
342 \\ clr %%r31, %%r31, 4<0>
343 \\ br.n %[posixCallMainAndExit]
344 ,
334345 .microblaze, .microblazeel =>
335346 // r1 = SP, r15 = LR, r19 = FP, r20 = GP
336347 \\ ori r15, r0, r0
lib/zig.h+24-2
......@@ -21,6 +21,8 @@
2121
2222#if defined(__aarch64__) || (defined(zig_msvc) && defined(_M_ARM64))
2323#define zig_aarch64
24#elif defined(__alpha__)
25#define zig_alpha
2426#elif defined(__thumb__) || (defined(zig_msvc) && defined(_M_ARM))
2527#define zig_thumb
2628#define zig_arm
......@@ -36,6 +38,10 @@
3638#elif defined(__loongarch64)
3739#define zig_loongarch64
3840#define zig_loongarch
41#elif defined(__m68k__)
42#define zig_m68k
43#elif defined(__m88k__)
44#define zig_m88k
3945#elif defined(__mips64)
4046#define zig_mips64
4147#define zig_mips
......@@ -79,6 +85,8 @@
7985#elif defined(__I86__)
8086#define zig_x86_16
8187#define zig_x86
88#elif defined(__xtensa__)
89#define zig_xtensa
8290#elif defined (__ez80)
8391#define zig_ez80
8492#define zig_z80
......@@ -390,7 +398,9 @@
390398
391399#elif defined(zig_gnuc_asm)
392400
393#if defined(zig_thumb)
401#if defined(zig_alpha)
402#define zig_trap() __asm__ volatile("call_pal 0x000000")
403#elif defined(zig_thumb)
394404#define zig_trap() __asm__ volatile("udf #0xfe")
395405#elif defined(zig_arm) || defined(zig_aarch64)
396406#define zig_trap() __asm__ volatile("udf #0xfdee")
......@@ -398,6 +408,10 @@
398408#define zig_trap() __asm__ volatile("r27:26 = memd(#0xbadc0fee)")
399409#elif defined(zig_kvx) || defined(zig_loongarch) || defined(zig_powerpc)
400410#define zig_trap() __asm__ volatile(".word 0x0")
411#elif defined(zig_m68k)
412#define zig_trap() __asm__ volatile("illegal")
413#elif defined(zig_m88k)
414#define zig_trap() __asm__ volatile("tb0 0, %%r0, 511")
401415#elif defined(zig_mips)
402416#define zig_trap() __asm__ volatile(".word 0x3d")
403417#elif defined(zig_or1k)
......@@ -412,6 +426,8 @@
412426#define zig_trap() __asm__ volatile("int $0x3")
413427#elif defined(zig_x86)
414428#define zig_trap() __asm__ volatile("ud2")
429#elif defined(zig_xtensa)
430#define zig_trap() __asm__ volatile("ill")
415431#elif defined(zig_z80)
416432#define zig_trap() __asm__ volatile("rst 00h")
417433#else
......@@ -428,7 +444,9 @@
428444#define zig_breakpoint() __debugbreak()
429445#elif defined(zig_gnuc_asm)
430446
431#if defined(zig_arm)
447#if defined(zig_alpha)
448#define zig_breakpoint() __asm__ volatile("call_pal 0x000080")
449#elif defined(zig_arm)
432450#define zig_breakpoint() __asm__ volatile("bkpt #0x0")
433451#elif defined(zig_aarch64)
434452#define zig_breakpoint() __asm__ volatile("brk #0xf000")
......@@ -436,6 +454,8 @@
436454#define zig_breakpoint() __asm__ volatile("brkpt")
437455#elif defined(zig_kvx) || defined(zig_loongarch)
438456#define zig_breakpoint() __asm__ volatile("break 0x0")
457#elif defined(zig_m88k)
458#define zig_breakpoint() __asm__ volatile("illop1")
439459#elif defined(zig_mips)
440460#define zig_breakpoint() __asm__ volatile("break")
441461#elif defined(zig_or1k)
......@@ -450,6 +470,8 @@
450470#define zig_breakpoint() __asm__ volatile("ta 0x1")
451471#elif defined(zig_x86)
452472#define zig_breakpoint() __asm__ volatile("int $0x3")
473#elif defined(zig_xtensa)
474#define zig_breakpoint() __asm__ volatile("break 1, 1")
453475#else
454476#define zig_breakpoint() zig_breakpoint_unavailable
455477#endif
src/Sema.zig+1
......@@ -8558,6 +8558,7 @@ const calling_conventions_supporting_var_args = [_]std.lang.CallingConvention.Ta
85588558 .m68k_sysv,
85598559 .m68k_gnu,
85608560 .m68k_rtd,
8561 .m88k_sysv,
85618562 .msp430_eabi,
85628563 .or1k_sysv,
85638564 .s390x_sysv,
src/codegen/llvm.zig+4
......@@ -112,6 +112,7 @@ pub fn targetTriple(allocator: Allocator, target: *const std.Target) ![]const u8
112112 .hppa64,
113113 .kalimba,
114114 .kvx,
115 .m88k,
115116 .microblaze,
116117 .microblazeel,
117118 .or1k,
......@@ -478,6 +479,7 @@ pub fn dataLayout(target: *const std.Target) []const u8 {
478479 .hppa64,
479480 .kalimba,
480481 .kvx,
482 .m88k,
481483 .microblaze,
482484 .microblazeel,
483485 .or1k,
......@@ -4531,6 +4533,7 @@ pub fn toLlvmCallConvTag(cc_tag: std.lang.CallingConvention.Tag, target: *const
45314533 .loongarch32_ilp32,
45324534 .m68k_sysv,
45334535 .m68k_gnu,
4536 .m88k_sysv,
45344537 .msp430_eabi,
45354538 .or1k_sysv,
45364539 .propeller_sysv,
......@@ -4903,6 +4906,7 @@ pub fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void {
49034906 .hppa64,
49044907 .kalimba,
49054908 .kvx,
4909 .m88k,
49064910 .microblaze,
49074911 .microblazeel,
49084912 .or1k,
src/target.zig+3-1
......@@ -245,6 +245,7 @@ pub fn hasLlvmSupport(target: *const std.Target, ofmt: std.Target.ObjectFormat)
245245 .hppa64,
246246 .kalimba,
247247 .kvx,
248 .m88k,
248249 .microblaze,
249250 .microblazeel,
250251 .or1k,
......@@ -695,7 +696,8 @@ pub fn llvmMachineAbi(target: *const std.Target) ?[:0]const u8 {
695696 .gnuabin32, .muslabin32 => "n32",
696697 else => "n64",
697698 },
698 .powerpc64, .powerpc64le => if (target.os.tag == .ps3) "elfv1" else "elfv2",
699 .powerpc64 => if (target.os.tag == .ps3) "elfv1" else "elfv2",
700 .powerpc64le => "elfv2",
699701 .riscv64, .riscv64be => if (target.cpu.has(.riscv, .e))
700702 "lp64e"
701703 else if (target.cpu.has(.riscv, .d))