From e7b46363aea6e42c206cb7b1bd8c9b47a83d9045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sun, 27 Apr 2025 01:20:19 +0200 Subject: [PATCH] std.Target: Remove Os.Tag.elfiamcu. The last Intel Quark MCU was released in 2015. Quark was announced to be EOL in 2019, and stopped shipping entirely in 2022. The OS tag was only meaningful for Intel's weird fork of Linux 3.8.7 with a special ABI that differs from the regular i386 System V ABI; beyond that, the CPU itself is just a plain old P54C (i586). We of course keep support for the CPU itself, just not Intel's Linux fork. --- lib/compiler/aro/aro/Driver/GCCDetector.zig | 16 +++---- lib/compiler/aro/aro/Toolchain.zig | 5 +- lib/compiler/aro/aro/target.zig | 3 +- lib/compiler/aro/aro/toolchains/Linux.zig | 15 ++---- lib/std/Target.zig | 27 ++--------- src/codegen/llvm.zig | 51 ++++++++++----------- src/link/Elf.zig | 1 - test/llvm_targets.zig | 1 - 8 files changed, 37 insertions(+), 82 deletions(-) diff --git a/lib/compiler/aro/aro/Driver/GCCDetector.zig b/lib/compiler/aro/aro/Driver/GCCDetector.zig index 80e94a3b715f08b6ee0dd288dbce48f23c57a691..e7d67aeed470249db38580b07a016a3b38adaa62 100644 --- a/lib/compiler/aro/aro/Driver/GCCDetector.zig +++ b/lib/compiler/aro/aro/Driver/GCCDetector.zig @@ -284,15 +284,11 @@ fn collectLibDirsAndTriples( }, .x86 => { lib_dirs.appendSliceAssumeCapacity(&X86LibDirs); - // MCU toolchain is 32 bit only and its triple alias is TargetTriple - // itself, which will be appended below. - if (target.os.tag != .elfiamcu) { - triple_aliases.appendSliceAssumeCapacity(&X86Triples); - biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs); - biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64Triples); - biarch_libdirs.appendSliceAssumeCapacity(&X32LibDirs); - biarch_triple_aliases.appendSliceAssumeCapacity(&X32Triples); - } + triple_aliases.appendSliceAssumeCapacity(&X86Triples); + biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64Triples); + biarch_libdirs.appendSliceAssumeCapacity(&X32LibDirs); + biarch_triple_aliases.appendSliceAssumeCapacity(&X32Triples); }, .loongarch64 => { lib_dirs.appendSliceAssumeCapacity(&LoongArch64LibDirs); @@ -511,7 +507,7 @@ fn findBiarchMultilibs( const multilib_filter = Multilib.Filter{ .base = path, - .file = if (target.os.tag == .elfiamcu) "libgcc.a" else "crtbegin.o", + .file = "crtbegin.o", }; const Want = enum { diff --git a/lib/compiler/aro/aro/Toolchain.zig b/lib/compiler/aro/aro/Toolchain.zig index c3d43f05b93a98b5e7db776dc90c1eea22c0ff77..bbd540b1b6d3d7755c26228210887514ff4cf45f 100644 --- a/lib/compiler/aro/aro/Toolchain.zig +++ b/lib/compiler/aro/aro/Toolchain.zig @@ -83,9 +83,7 @@ pub fn discover(tc: *Toolchain) !void { const target = tc.getTarget(); tc.inner = switch (target.os.tag) { - .elfiamcu, - .linux, - => if (target.cpu.arch == .hexagon) + .linux => if (target.cpu.arch == .hexagon) .{ .unknown = {} } // TODO else if (target.cpu.arch.isMIPS()) .{ .unknown = {} } // TODO @@ -418,7 +416,6 @@ fn addUnwindLibrary(tc: *const Toolchain, argv: *std.ArrayList([]const u8)) !voi const unw = try tc.getUnwindLibKind(); const target = tc.getTarget(); if ((target.abi.isAndroid() and unw == .libgcc) or - target.os.tag == .elfiamcu or target.ofmt == .wasm or target_util.isWindowsMSVCEnvironment(target) or unw == .none) return; diff --git a/lib/compiler/aro/aro/target.zig b/lib/compiler/aro/aro/target.zig index b4f89b1ca2c9b9829f48de6c4b6b93f51f6c6fc5..c22e45e45758cf2eab4c82d66669cd7e7d792cc5 100644 --- a/lib/compiler/aro/aro/target.zig +++ b/lib/compiler/aro/aro/target.zig @@ -412,7 +412,7 @@ pub fn defaultFpEvalMethod(target: std.Target) LangOpts.FPEvalMethod { /// Value of the `-m` flag for `ld` for this target pub fn ldEmulationOption(target: std.Target, arm_endianness: ?std.builtin.Endian) ?[]const u8 { return switch (target.cpu.arch) { - .x86 => if (target.os.tag == .elfiamcu) "elf_iamcu" else "elf_i386", + .x86 => "elf_i386", .arm, .armeb, .thumb, @@ -642,7 +642,6 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 { .amdhsa => "amdhsa", .ps4 => "ps4", .ps5 => "ps5", - .elfiamcu => "elfiamcu", .mesa3d => "mesa3d", .contiki => "contiki", .amdpal => "amdpal", diff --git a/lib/compiler/aro/aro/toolchains/Linux.zig b/lib/compiler/aro/aro/toolchains/Linux.zig index 466a63eed5d4bac36bba9fecb6e66899fac0ac76..59f6cf2d75433c87ef0879ca9b05c7ea5993f814 100644 --- a/lib/compiler/aro/aro/toolchains/Linux.zig +++ b/lib/compiler/aro/aro/toolchains/Linux.zig @@ -170,7 +170,6 @@ pub fn buildLinkerArgs(self: *const Linux, tc: *const Toolchain, argv: *std.Arra const is_static_pie = try self.getStaticPIE(d); const is_static = self.getStatic(d); const is_android = target.abi.isAndroid(); - const is_iamcu = target.os.tag == .elfiamcu; const is_ve = target.cpu.arch == .ve; const has_crt_begin_end_files = target.abi != .none; // TODO: clang checks for MIPS vendor @@ -225,7 +224,7 @@ pub fn buildLinkerArgs(self: *const Linux, tc: *const Toolchain, argv: *std.Arra try argv.appendSlice(&.{ "-o", d.output_name orelse "a.out" }); if (!d.nostdlib and !d.nostartfiles and !d.relocatable) { - if (!is_android and !is_iamcu) { + if (!is_android) { if (!d.shared) { const crt1 = if (is_pie) "Scrt1.o" @@ -241,9 +240,7 @@ pub fn buildLinkerArgs(self: *const Linux, tc: *const Toolchain, argv: *std.Arra try argv.appendSlice(&.{ "-z", "max-page-size=0x4000000" }); } - if (is_iamcu) { - try argv.append(try tc.getFilePath("crt0.o")); - } else if (has_crt_begin_end_files) { + if (has_crt_begin_end_files) { var path: []const u8 = ""; if (tc.getRuntimeLibKind() == .compiler_rt and !is_android) { const crt_begin = try tc.getCompilerRt("crtbegin", .object); @@ -285,19 +282,13 @@ pub fn buildLinkerArgs(self: *const Linux, tc: *const Toolchain, argv: *std.Arra if (!d.nolibc) { try argv.append("-lc"); } - if (is_iamcu) { - try argv.append("-lgloss"); - } if (is_static or is_static_pie) { try argv.append("--end-group"); } else { try tc.addRuntimeLibs(argv); } - if (is_iamcu) { - try argv.appendSlice(&.{ "--as-needed", "-lsoftfp", "--no-as-needed" }); - } } - if (!d.nostartfiles and !is_iamcu) { + if (!d.nostartfiles) { if (has_crt_begin_end_files) { var path: []const u8 = ""; if (tc.getRuntimeLibKind() == .compiler_rt and !is_android) { diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 7d22b242890f60ae475d0a7a91478a3d570d8f14..3d3cf11484fa88d0491b1d27f6340293eca21d73 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -20,7 +20,6 @@ pub const Os = struct { other, contiki, - elfiamcu, fuchsia, hermit, @@ -156,8 +155,6 @@ pub const Os = struct { .freestanding, .other, - .elfiamcu, - .haiku, .plan9, .serenity, @@ -400,8 +397,6 @@ pub const Os = struct { .freestanding, .other, - .elfiamcu, - .haiku, .plan9, .serenity, @@ -729,7 +724,6 @@ pub const Os = struct { .amdhsa, .ps4, .ps5, - .elfiamcu, .mesa3d, .contiki, .amdpal, @@ -922,7 +916,6 @@ pub const Abi = enum { .wasi, .emscripten => .musl, .contiki, - .elfiamcu, .fuchsia, .hermit, .plan9, @@ -1094,7 +1087,7 @@ pub fn toElfMachine(target: Target) std.elf.EM { .sparc => if (Target.sparc.featureSetHas(target.cpu.features, .v9)) .SPARC32PLUS else .SPARC, .sparc64 => .SPARCV9, .ve => .VE, - .x86 => if (target.os.tag == .elfiamcu) .IAMCU else .@"386", + .x86 => .@"386", .x86_64 => .X86_64, .xcore => .XCORE, .xtensa => .XTENSA, @@ -2155,7 +2148,6 @@ pub const DynamicLinker = struct { .other, .contiki, - .elfiamcu, .hermit, .aix, @@ -2550,7 +2542,6 @@ pub const DynamicLinker = struct { .other, .contiki, - .elfiamcu, .hermit, .aix, @@ -2690,7 +2681,7 @@ pub fn stackAlignment(target: Target) u16 { .riscv64, => if (!Target.riscv.featureSetHas(target.cpu.features, .e)) return 16, .x86 => if (target.os.tag != .windows and target.os.tag != .uefi) return 16, - .x86_64 => return if (target.os.tag == .elfiamcu) 4 else 16, + .x86_64 => return 16, else => {}, } @@ -2851,7 +2842,6 @@ pub fn cTypeBitSize(target: Target, c_type: CType) u16 { }, }, - .elfiamcu, .fuchsia, .hermit, @@ -2918,10 +2908,7 @@ pub fn cTypeBitSize(target: Target, c_type: CType) u16 { .longdouble => switch (target.cpu.arch) { .x86 => switch (target.abi) { .android => return 64, - else => switch (target.os.tag) { - .elfiamcu => return 64, - else => return 80, - }, + else => return 80, }, .powerpc, @@ -3089,10 +3076,6 @@ pub fn cTypeAlignment(target: Target, c_type: CType) u16 { switch (target.cpu.arch) { .avr => return 1, .x86 => switch (target.os.tag) { - .elfiamcu => switch (c_type) { - .longlong, .ulonglong, .double => return 4, - else => {}, - }, .windows, .uefi => switch (c_type) { .longlong, .ulonglong, .double => return 8, .longdouble => switch (target.abi) { @@ -3191,10 +3174,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 { }, .avr => return 1, .x86 => switch (target.os.tag) { - .elfiamcu => switch (c_type) { - .longlong, .ulonglong, .double, .longdouble => return 4, - else => {}, - }, .windows, .uefi => switch (c_type) { .longdouble => switch (target.abi) { .gnu, .ilp32, .cygnus => return 4, diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index a16f681f86e74e19f02bbf2c0a34edc7ce102a34..34982ad70050f6bee7ae4a82eaa8fc89abe2e5dd 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -208,7 +208,6 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![]const u8 { .opencl => "unknown", // https://llvm.org/docs/SPIRVUsage.html#target-triples .ps4 => "ps4", .ps5 => "ps5", - .elfiamcu => "elfiamcu", .mesa3d => "mesa3d", .amdpal => "amdpal", .hermit => "hermit", @@ -402,36 +401,32 @@ pub fn dataLayout(target: std.Target) []const u8 { "E-m:l-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64" else "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64", - .x86 => switch (target.os.tag) { - .elfiamcu => "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32", - .windows => switch (target.abi) { - .cygnus => "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32", - .gnu => if (target.ofmt == .coff) - "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32" - else - "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32", - else => blk: { - const msvc = switch (target.abi) { - .none, .msvc => true, - else => false, - }; + .x86 => if (target.os.tag == .windows) switch (target.abi) { + .cygnus => "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32", + .gnu => if (target.ofmt == .coff) + "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32" + else + "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32", + else => blk: { + const msvc = switch (target.abi) { + .none, .msvc => true, + else => false, + }; - break :blk if (target.ofmt == .coff) - if (msvc) - "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32" - else - "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32" - else if (msvc) - "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32" + break :blk if (target.ofmt == .coff) + if (msvc) + "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32" else - "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32"; - }, + "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32" + else if (msvc) + "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32" + else + "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32"; }, - else => if (target.ofmt == .macho) - "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128" - else - "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128", - }, + } else if (target.ofmt == .macho) + "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128" + else + "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128", .x86_64 => if (target.os.tag.isDarwin() or target.ofmt == .macho) "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" else switch (target.abi) { diff --git a/src/link/Elf.zig b/src/link/Elf.zig index a338ec722d0a0933fef2e0e414b48b8d0fa26682..93513701df0d9e2fcdaafb84427874ce7a554861 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -4174,7 +4174,6 @@ fn getLDMOption(target: std.Target) ?[]const u8 { .s390x => "elf64_s390", .sparc64 => "elf64_sparc", .x86 => switch (target.os.tag) { - .elfiamcu => "elf_iamcu", .freebsd => "elf_i386_fbsd", else => "elf_i386", }, diff --git a/test/llvm_targets.zig b/test/llvm_targets.zig index 33d7be42a90a28a50fa1675478a7afb4337a39d1..7aa868c84bfec7d27c870d9a5e151e23c46fd2f3 100644 --- a/test/llvm_targets.zig +++ b/test/llvm_targets.zig @@ -292,7 +292,6 @@ const targets = [_]std.Target.Query{ .{ .cpu_arch = .wasm64, .os_tag = .wasi, .abi = .musl }, .{ .cpu_arch = .wasm64, .os_tag = .wasi, .abi = .none }, - .{ .cpu_arch = .x86, .os_tag = .elfiamcu, .abi = .none }, .{ .cpu_arch = .x86, .os_tag = .freebsd, .abi = .none }, .{ .cpu_arch = .x86, .os_tag = .freestanding, .abi = .none }, .{ .cpu_arch = .x86, .os_tag = .haiku, .abi = .none }, -- 2.54.0