zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit a69f55a7cc3980f4d4dfcce6cb9d21a597975c7f (tree)
parent 3fb6e46f6e4231b9569193a15a4357a2ae11fb0f
Author: Alex Rønne Petersen <alex@alexrp.com>
Date:   Mon, 19 Aug 2024 13:25:08 +0200

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.

Diffstat:
Mlib/std/coff.zig | 17-----------------
Mlib/std/elf.zig | 38--------------------------------------
Msrc/link/Elf/Object.zig | 8++++----
Msrc/link/Elf/SharedObject.zig | 8++++----
Mtest/link/elf.zig | 2+-
5 files changed, 9 insertions(+), 64 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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 @@ -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", } });