Skip to content

Commit

Permalink
Merge pull request #21177 from alexrp/elf-coff-conv
Browse files Browse the repository at this point in the history
`std.{coff,elf}`: Remove the `{MachineType,EM}.toTargetCpuArch()` functions.
  • Loading branch information
andrewrk authored Aug 25, 2024
2 parents 7d54c62 + fb6f5a3 commit 849c31a
Show file tree
Hide file tree
Showing 11 changed files with 26 additions and 81 deletions.
17 changes: 0 additions & 17 deletions lib/std/coff.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand Down
38 changes: 0 additions & 38 deletions lib/std/elf.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions src/link/Elf.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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}",
Expand All @@ -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,
Expand Down Expand Up @@ -1642,7 +1642,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
pub const ParseError = error{
MalformedObject,
MalformedArchive,
InvalidCpuArch,
InvalidMachineType,
MismatchedEflags,
OutOfMemory,
Overflow,
Expand Down Expand Up @@ -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}",
Expand Down
10 changes: 5 additions & 5 deletions src/link/Elf/Object.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
10 changes: 5 additions & 5 deletions src/link/Elf/SharedObject.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions src/link/Elf/relocatable.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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", .{}),
Expand Down Expand Up @@ -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(
Expand Down
2 changes: 1 addition & 1 deletion src/link/MachO.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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 {},
Expand Down
4 changes: 2 additions & 2 deletions src/link/MachO/Dylib.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions src/link/MachO/Object.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/link/MachO/relocatable.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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)}),
};
}
Expand Down
2 changes: 1 addition & 1 deletion test/link/elf.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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",
} });

Expand Down

0 comments on commit 849c31a

Please sign in to comment.