From a69f55a7cc3980f4d4dfcce6cb9d21a597975c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 19 Aug 2024 13:25:08 +0200 Subject: [PATCH] std.{coff,elf}: Remove the {MachineType,EM}.toTargetCpuArch() functions. These are fundamentally incapable of producing accurate information for reasons I've laid out in #20771. Since our only use of these functions is to check that object files have the correct machine type, and since #21020 made `std.Target.to{Coff,Elf}Machine()` more accurate, just switch these checks over to that and compare the machine type tags instead. Closes #20771. --- lib/std/coff.zig | 17 ---------------- lib/std/elf.zig | 38 ----------------------------------- src/link/Elf/Object.zig | 8 ++++---- src/link/Elf/SharedObject.zig | 8 ++++---- test/link/elf.zig | 2 +- 5 files changed, 9 insertions(+), 64 deletions(-) diff --git a/lib/std/coff.zig b/lib/std/coff.zig index ca05ce3cf9..da7dc0bcda 100644 --- a/lib/std/coff.zig +++ b/lib/std/coff.zig @@ -1060,23 +1060,6 @@ pub const MachineType = enum(u16) { WCEMIPSV2 = 0x169, _, - - pub fn toTargetCpuArch(machine_type: MachineType) ?std.Target.Cpu.Arch { - return switch (machine_type) { - .ARM => .arm, - .POWERPC => .powerpc, - .RISCV32 => .riscv32, - .THUMB => .thumb, - .I386 => .x86, - .ARM64 => .aarch64, - .RISCV64 => .riscv64, - .X64 => .x86_64, - .LOONGARCH32 => .loongarch32, - .LOONGARCH64 => .loongarch64, - // there's cases we don't (yet) handle - else => null, - }; - } }; pub const CoffError = error{ diff --git a/lib/std/elf.zig b/lib/std/elf.zig index af3f1813e2..aefaca4bef 100644 --- a/lib/std/elf.zig +++ b/lib/std/elf.zig @@ -1646,44 +1646,6 @@ pub const EM = enum(u16) { FRV = 0x5441, _, - - pub fn toTargetCpuArch(em: EM) ?std.Target.Cpu.Arch { - return switch (em) { - .AVR => .avr, - .MSP430 => .msp430, - .ARC => .arc, - .ARM => .arm, - .HEXAGON => .hexagon, - .@"68K" => .m68k, - .MIPS => .mips, - .MIPS_RS3_LE => .mipsel, - .PPC => .powerpc, - .SPARC => .sparc, - .@"386" => .x86, - .XCORE => .xcore, - .CSR_KALIMBA => .kalimba, - .LANAI => .lanai, - .AARCH64 => .aarch64, - .PPC64 => .powerpc64, - .RISCV => .riscv64, - .X86_64 => .x86_64, - .BPF => .bpfel, - .SPARCV9 => .sparc64, - .S390 => .s390x, - .SPU_2 => .spu_2, - // FIXME: - // No support for .loongarch32 yet so it is safe to assume we are on .loongarch64. - // - // However, when e_machine is .LOONGARCH, we should check - // ei_class's value to decide the CPU architecture. - // - ELFCLASS32 => .loongarch32 - // - ELFCLASS64 => .loongarch64 - .LOONGARCH => .loongarch64, - // there's many cases we don't (yet) handle, or will never have a - // zig target cpu arch equivalent (such as null). - else => null, - }; - } }; pub const GRP_COMDAT = 1; diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig index a6f9c4ac18..d329218b8d 100644 --- a/src/link/Elf/Object.zig +++ b/src/link/Elf/Object.zig @@ -105,12 +105,12 @@ fn parseCommon(self: *Object, allocator: Allocator, handle: std.fs.File, elf_fil defer allocator.free(header_buffer); self.header = @as(*align(1) const elf.Elf64_Ehdr, @ptrCast(header_buffer)).*; - const target = elf_file.base.comp.root_mod.resolved_target.result; - if (target.cpu.arch != self.header.?.e_machine.toTargetCpuArch().?) { + const em = elf_file.base.comp.root_mod.resolved_target.result.toElfMachine(); + if (em != self.header.?.e_machine) { try elf_file.reportParseError2( self.index, - "invalid cpu architecture: {s}", - .{@tagName(self.header.?.e_machine.toTargetCpuArch().?)}, + "invalid ELF machine type: {s}", + .{@tagName(self.header.?.e_machine)}, ); return error.InvalidCpuArch; } diff --git a/src/link/Elf/SharedObject.zig b/src/link/Elf/SharedObject.zig index b33853d23c..7fdf9116b5 100644 --- a/src/link/Elf/SharedObject.zig +++ b/src/link/Elf/SharedObject.zig @@ -56,12 +56,12 @@ pub fn parse(self: *SharedObject, elf_file: *Elf, handle: std.fs.File) !void { defer gpa.free(header_buffer); self.header = @as(*align(1) const elf.Elf64_Ehdr, @ptrCast(header_buffer)).*; - const target = elf_file.base.comp.root_mod.resolved_target.result; - if (target.cpu.arch != self.header.?.e_machine.toTargetCpuArch().?) { + const em = elf_file.base.comp.root_mod.resolved_target.result.toElfMachine(); + if (em != self.header.?.e_machine) { try elf_file.reportParseError2( self.index, - "invalid cpu architecture: {s}", - .{@tagName(self.header.?.e_machine.toTargetCpuArch().?)}, + "invalid ELF machine type: {s}", + .{@tagName(self.header.?.e_machine)}, ); return error.InvalidCpuArch; } diff --git a/test/link/elf.zig b/test/link/elf.zig index 98253811b2..6abf596ab7 100644 --- a/test/link/elf.zig +++ b/test/link/elf.zig @@ -2257,7 +2257,7 @@ fn testMismatchedCpuArchitectureError(b: *Build, opts: Options) *Step { exe.linkLibC(); expectLinkErrors(exe, test_step, .{ .exact = &.{ - "invalid cpu architecture: aarch64", + "invalid ELF machine type: AARCH64", "note: while parsing /?/a.o", } });