authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-02 23:22:44+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-10-02 23:22:44+02:00
log038e002b1cc38e1e031f5f09388218c39e1b34ab
tree33e9de825d995cae3a549a78b88d348c37633cc7
parente652318c133a7ec0a2f682fa49af0bc70a455e39
parent67f5d4f78c9fab17c6975a2381143796f0d38203
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #21527 from alexrp/elf-emulations

`link.Elf`: Make `getLDMOption()` exhaustive with regards to LLD's `parseEmulation()`.

3 files changed, 79 insertions(+), 46 deletions(-)

lib/std/Target.zig+2-2
......@@ -847,7 +847,7 @@ pub fn toElfMachine(target: Target) std.elf.EM {
847847
848848 return switch (target.cpu.arch) {
849849 .amdgcn => .AMDGPU,
850 .arc => .ARC_COMPACT2,
850 .arc => .ARC_COMPACT,
851851 .arm, .armeb, .thumb, .thumbeb => .ARM,
852852 .aarch64, .aarch64_be => .AARCH64,
853853 .avr => .AVR,
......@@ -867,6 +867,7 @@ pub fn toElfMachine(target: Target) std.elf.EM {
867867 .sparc => if (Target.sparc.featureSetHas(target.cpu.features, .v9)) .SPARC32PLUS else .SPARC,
868868 .sparc64 => .SPARCV9,
869869 .spu_2 => .SPU_2,
870 .ve => .VE,
870871 .x86 => .@"386",
871872 .x86_64 => .X86_64,
872873 .xcore => .XCORE,
......@@ -877,7 +878,6 @@ pub fn toElfMachine(target: Target) std.elf.EM {
877878 .spirv,
878879 .spirv32,
879880 .spirv64,
880 .ve,
881881 .wasm32,
882882 .wasm64,
883883 => .NONE,
lib/std/start.zig+2-2
......@@ -271,8 +271,8 @@ fn _start() callconv(.Naked) noreturn {
271271 \\ b %[posixCallMainAndExit]
272272 ,
273273 .arc =>
274 // The `arc` tag currently means ARCv2, which has an unusually low stack alignment
275 // requirement. ARCv3 increases it from 4 to 16, but we don't support ARCv3 yet.
274 // The `arc` tag currently means ARC v1 and v2, which have an unusually low stack
275 // alignment requirement. ARC v3 increases it from 4 to 16, but we don't support v3 yet.
276276 \\ mov fp, 0
277277 \\ mov blink, 0
278278 \\ mov r0, sp
src/link/Elf.zig+75-42
......@@ -2194,13 +2194,8 @@ fn linkWithLLD(self: *Elf, arena: Allocator, tid: Zcu.PerThread.Id, prog_node: s
21942194 }
21952195
21962196 if (getLDMOption(target)) |ldm| {
2197 // Any target ELF will use the freebsd osabi if suffixed with "_fbsd".
2198 const arg = if (target.os.tag == .freebsd)
2199 try std.fmt.allocPrint(arena, "{s}_fbsd", .{ldm})
2200 else
2201 ldm;
22022197 try argv.append("-m");
2203 try argv.append(arg);
2198 try argv.append(ldm);
22042199 }
22052200
22062201 if (link_mode == .static) {
......@@ -4467,45 +4462,83 @@ fn shdrTo32(shdr: elf.Elf64_Shdr) elf.Elf32_Shdr {
44674462}
44684463
44694464fn getLDMOption(target: std.Target) ?[]const u8 {
4470 switch (target.cpu.arch) {
4471 .x86 => return "elf_i386",
4472 .aarch64 => return "aarch64linux",
4473 .aarch64_be => return "aarch64linuxb",
4474 .arm, .thumb => return "armelf_linux_eabi",
4475 .armeb, .thumbeb => return "armelfb_linux_eabi",
4476 .powerpc => return "elf32ppclinux",
4477 .powerpc64 => return "elf64ppc",
4478 .powerpc64le => return "elf64lppc",
4479 .sparc => return "elf32_sparc",
4480 .sparc64 => return "elf64_sparc",
4481 .mips => return "elf32btsmip",
4482 .mipsel => return "elf32ltsmip",
4483 .mips64 => {
4484 if (target.abi == .gnuabin32) {
4485 return "elf32btsmipn32";
4486 } else {
4487 return "elf64btsmip";
4488 }
4465 // This should only return emulations understood by LLD's parseEmulation().
4466 return switch (target.cpu.arch) {
4467 .aarch64 => switch (target.os.tag) {
4468 .linux => "aarch64linux",
4469 else => "aarch64elf",
44894470 },
4490 .mips64el => {
4491 if (target.abi == .gnuabin32) {
4492 return "elf32ltsmipn32";
4493 } else {
4494 return "elf64ltsmip";
4495 }
4471 .aarch64_be => switch (target.os.tag) {
4472 .linux => "aarch64linuxb",
4473 else => "aarch64elfb",
44964474 },
4497 .s390x => return "elf64_s390",
4498 .x86_64 => {
4499 if (target.abi == .gnux32) {
4500 return "elf32_x86_64";
4501 } else {
4502 return "elf_x86_64";
4503 }
4475 .amdgcn => "elf64_amdgpu",
4476 .arm, .thumb => switch (target.os.tag) {
4477 .linux => "armelf_linux_eabi",
4478 else => "armelf",
45044479 },
4505 .riscv32 => return "elf32lriscv",
4506 .riscv64 => return "elf64lriscv",
4507 else => return null,
4508 }
4480 .armeb, .thumbeb => switch (target.os.tag) {
4481 .linux => "armelfb_linux_eabi",
4482 else => "armelfb",
4483 },
4484 .hexagon => "hexagonelf",
4485 .loongarch32 => "elf32loongarch",
4486 .loongarch64 => "elf64loongarch",
4487 .mips => switch (target.os.tag) {
4488 .freebsd => "elf32btsmip_fbsd",
4489 else => "elf32btsmip",
4490 },
4491 .mipsel => switch (target.os.tag) {
4492 .freebsd => "elf32ltsmip_fbsd",
4493 else => "elf32ltsmip",
4494 },
4495 .mips64 => switch (target.os.tag) {
4496 .freebsd => switch (target.abi) {
4497 .gnuabin32 => "elf32btsmipn32_fbsd",
4498 else => "elf64btsmip_fbsd",
4499 },
4500 else => switch (target.abi) {
4501 .gnuabin32 => "elf32btsmipn32",
4502 else => "elf64btsmip",
4503 },
4504 },
4505 .mips64el => switch (target.os.tag) {
4506 .freebsd => switch (target.abi) {
4507 .gnuabin32 => "elf32ltsmipn32_fbsd",
4508 else => "elf64ltsmip_fbsd",
4509 },
4510 else => switch (target.abi) {
4511 .gnuabin32 => "elf32ltsmipn32",
4512 else => "elf64ltsmip",
4513 },
4514 },
4515 .msp430 => "msp430elf",
4516 .powerpc => switch (target.os.tag) {
4517 .freebsd => "elf32ppc_fbsd",
4518 .linux => "elf32ppclinux",
4519 else => "elf32ppc",
4520 },
4521 .powerpcle => switch (target.os.tag) {
4522 .linux => "elf32lppclinux",
4523 else => "elf32lppc",
4524 },
4525 .powerpc64 => "elf64ppc",
4526 .powerpc64le => "elf64lppc",
4527 .riscv32 => "elf32lriscv",
4528 .riscv64 => "elf64lriscv",
4529 .s390x => "elf64_s390",
4530 .sparc64 => "elf64_sparc",
4531 .x86 => switch (target.os.tag) {
4532 .elfiamcu => "elf_iamcu",
4533 .freebsd => "elf_i386_fbsd",
4534 else => "elf_i386",
4535 },
4536 .x86_64 => switch (target.abi) {
4537 .gnux32, .muslx32 => "elf32_x86_64",
4538 else => "elf_x86_64",
4539 },
4540 else => null,
4541 };
45094542}
45104543
45114544pub fn padToIdeal(actual_size: anytype) @TypeOf(actual_size) {