Merge pull request #21177 from alexrp/elf-coff-conv

`std.{coff,elf}`: Remove the `{MachineType,EM}.toTargetCpuArch()` functions.
This commit is contained in:
Andrew Kelley 2024-08-25 14:49:53 -07:00 committed by GitHub
commit 849c31a6cc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 26 additions and 81 deletions

View File

@ -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{

View File

@ -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;

View File

@ -1100,7 +1100,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
error.MalformedObject,
error.MalformedArchive,
error.MismatchedEflags,
error.InvalidCpuArch,
error.InvalidMachineType,
=> continue, // already reported
else => |e| try self.reportParseError(
obj.path,
@ -1187,7 +1187,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
for (system_libs.items) |lib| {
self.parseLibrary(lib, false) catch |err| switch (err) {
error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => continue, // already reported
error.MalformedObject, error.MalformedArchive, error.InvalidMachineType => continue, // already reported
else => |e| try self.reportParseError(
lib.path,
"unexpected error: parsing library failed with error {s}",
@ -1213,7 +1213,7 @@ pub fn flushModule(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_nod
error.MalformedObject,
error.MalformedArchive,
error.MismatchedEflags,
error.InvalidCpuArch,
error.InvalidMachineType,
=> continue, // already reported
else => |e| try self.reportParseError(
obj.path,
@ -1642,7 +1642,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
pub const ParseError = error{
MalformedObject,
MalformedArchive,
InvalidCpuArch,
InvalidMachineType,
MismatchedEflags,
OutOfMemory,
Overflow,
@ -1813,7 +1813,7 @@ fn parseLdScript(self: *Elf, lib: SystemLib) ParseError!void {
.needed = scr_obj.needed,
.path = full_path,
}, false) catch |err| switch (err) {
error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => continue, // already reported
error.MalformedObject, error.MalformedArchive, error.InvalidMachineType => continue, // already reported
else => |e| try self.reportParseError(
full_path,
"unexpected error: parsing library failed with error {s}",

View File

@ -105,14 +105,14 @@ 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;
return error.InvalidMachineType;
}
try elf_file.validateEFlags(self.index, self.header.?.e_flags);

View File

@ -56,14 +56,14 @@ 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;
return error.InvalidMachineType;
}
const shoff = std.math.cast(usize, self.header.?.e_shoff) orelse return error.Overflow;

View File

@ -21,7 +21,7 @@ pub fn flushStaticLib(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]co
parsePositional(elf_file, obj.path) catch |err| switch (err) {
error.MalformedObject,
error.MalformedArchive,
error.InvalidCpuArch,
error.InvalidMachineType,
error.MismatchedEflags,
=> continue, // already reported
error.UnknownFileType => try elf_file.reportParseError(obj.path, "unknown file type for an object file", .{}),
@ -178,7 +178,7 @@ pub fn flushObject(elf_file: *Elf, comp: *Compilation, module_obj_path: ?[]const
elf_file.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {
error.MalformedObject,
error.MalformedArchive,
error.InvalidCpuArch,
error.InvalidMachineType,
error.MismatchedEflags,
=> continue, // already reported
else => |e| try elf_file.reportParseError(

View File

@ -921,7 +921,7 @@ fn parseInputFileWorker(self: *MachO, file: File) void {
error.MalformedObject,
error.MalformedDylib,
error.MalformedTbd,
error.InvalidCpuArch,
error.InvalidMachineType,
error.InvalidTarget,
=> {}, // already reported
else => |e| self.reportParseError2(file.getIndex(), "unexpected error: parsing input file failed with error {s}", .{@errorName(e)}) catch {},

View File

@ -75,12 +75,12 @@ fn parseBinary(self: *Dylib, macho_file: *MachO) !void {
macho.CPU_TYPE_X86_64 => .x86_64,
else => |x| {
try macho_file.reportParseError2(self.index, "unknown cpu architecture: {d}", .{x});
return error.InvalidCpuArch;
return error.InvalidMachineType;
},
};
if (macho_file.getTarget().cpu.arch != this_cpu_arch) {
try macho_file.reportParseError2(self.index, "invalid cpu architecture: {s}", .{@tagName(this_cpu_arch)});
return error.InvalidCpuArch;
return error.InvalidMachineType;
}
const lc_buffer = try gpa.alloc(u8, header.sizeofcmds);

View File

@ -91,12 +91,12 @@ pub fn parse(self: *Object, macho_file: *MachO) !void {
macho.CPU_TYPE_X86_64 => .x86_64,
else => |x| {
try macho_file.reportParseError2(self.index, "unknown cpu architecture: {d}", .{x});
return error.InvalidCpuArch;
return error.InvalidMachineType;
},
};
if (cpu_arch != this_cpu_arch) {
try macho_file.reportParseError2(self.index, "invalid cpu architecture: {s}", .{@tagName(this_cpu_arch)});
return error.InvalidCpuArch;
return error.InvalidMachineType;
}
const lc_buffer = try gpa.alloc(u8, self.header.?.sizeofcmds);
@ -1648,12 +1648,12 @@ pub fn parseAr(self: *Object, macho_file: *MachO) !void {
macho.CPU_TYPE_X86_64 => .x86_64,
else => |x| {
try macho_file.reportParseError2(self.index, "unknown cpu architecture: {d}", .{x});
return error.InvalidCpuArch;
return error.InvalidMachineType;
},
};
if (macho_file.getTarget().cpu.arch != this_cpu_arch) {
try macho_file.reportParseError2(self.index, "invalid cpu architecture: {s}", .{@tagName(this_cpu_arch)});
return error.InvalidCpuArch;
return error.InvalidMachineType;
}
const lc_buffer = try gpa.alloc(u8, self.header.?.sizeofcmds);

View File

@ -232,7 +232,7 @@ fn parseInputFilesAr(macho_file: *MachO) !void {
for (macho_file.objects.items) |index| {
macho_file.getFile(index).?.parseAr(macho_file) catch |err| switch (err) {
error.InvalidCpuArch => {}, // already reported
error.InvalidMachineType => {}, // already reported
else => |e| try macho_file.reportParseError2(index, "unexpected error: parsing input file failed with error {s}", .{@errorName(e)}),
};
}

View File

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