authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-08-25 07:18:29+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-09-10 08:53:30+02:00
log77c8f4b6713c5209f0cde62001b5995641f8bf60
treebf43a6b437610257f989b14d05743e680d968196
parent70c92331c79018f8c5cc845f1015af7fa941f3a4
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Compilation: Pass hard/soft float flags to Clang as appropriate.


2 files changed, 60 insertions(+), 4 deletions(-)

src/Compilation.zig+18-4
...@@ -5484,6 +5484,9 @@ pub fn addCCArgs(...@@ -5484,6 +5484,9 @@ pub fn addCCArgs(
5484 const is_enabled = target.cpu.features.isEnabled(index);5484 const is_enabled = target.cpu.features.isEnabled(index);
54855485
5486 if (feature.llvm_name) |llvm_name| {5486 if (feature.llvm_name) |llvm_name| {
5487 // We communicate float ABI to Clang through the dedicated options further down.
5488 if (std.mem.eql(u8, llvm_name, "soft-float")) continue;
5489
5487 argv.appendSliceAssumeCapacity(&[_][]const u8{ "-Xclang", "-target-feature", "-Xclang" });5490 argv.appendSliceAssumeCapacity(&[_][]const u8{ "-Xclang", "-target-feature", "-Xclang" });
5488 const plus_or_minus = "-+"[@intFromBool(is_enabled)];5491 const plus_or_minus = "-+"[@intFromBool(is_enabled)];
5489 const arg = try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name });5492 const arg = try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name });
...@@ -5705,10 +5708,6 @@ pub fn addCCArgs(...@@ -5705,10 +5708,6 @@ pub fn addCCArgs(
5705 if (target.cpu.model.llvm_name) |llvm_name| {5708 if (target.cpu.model.llvm_name) |llvm_name| {
5706 try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name}));5709 try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name}));
5707 }5710 }
5708
5709 if (std.Target.mips.featureSetHas(target.cpu.features, .soft_float)) {
5710 try argv.append("-msoft-float");
5711 }
5712 },5711 },
5713 else => {5712 else => {
5714 // TODO5713 // TODO
...@@ -5751,6 +5750,21 @@ pub fn addCCArgs(...@@ -5751,6 +5750,21 @@ pub fn addCCArgs(
5751 try argv.append(try std.fmt.allocPrint(arena, "-mabi={s}", .{mabi}));5750 try argv.append(try std.fmt.allocPrint(arena, "-mabi={s}", .{mabi}));
5752 }5751 }
57535752
5753 // We might want to support -mfloat-abi=softfp for Arm and CSKY here in the future.
5754 if (target_util.clangSupportsFloatAbiArg(target)) {
5755 const fabi = @tagName(target.floatAbi());
5756
5757 try argv.append(switch (target.cpu.arch) {
5758 // For whatever reason, Clang doesn't support `-mfloat-abi` for s390x.
5759 .s390x => try std.fmt.allocPrint(arena, "-m{s}-float", .{fabi}),
5760 else => try std.fmt.allocPrint(arena, "-mfloat-abi={s}", .{fabi}),
5761 });
5762 }
5763
5764 if (target_util.clangSupportsNoImplicitFloatArg(target) and target.floatAbi() == .soft) {
5765 try argv.append("-mno-implicit-float");
5766 }
5767
5754 if (out_dep_path) |p| {5768 if (out_dep_path) |p| {
5755 try argv.appendSlice(&[_][]const u8{ "-MD", "-MV", "-MF", p });5769 try argv.appendSlice(&[_][]const u8{ "-MD", "-MV", "-MF", p });
5756 }5770 }
src/target.zig+42
...@@ -339,6 +339,48 @@ pub fn clangAssemblerSupportsMcpuArg(target: std.Target) bool {...@@ -339,6 +339,48 @@ pub fn clangAssemblerSupportsMcpuArg(target: std.Target) bool {
339 };339 };
340}340}
341341
342pub fn clangSupportsFloatAbiArg(target: std.Target) bool {
343 return switch (target.cpu.arch) {
344 .arm,
345 .armeb,
346 .thumb,
347 .thumbeb,
348 .csky,
349 .mips,
350 .mipsel,
351 .mips64,
352 .mips64el,
353 .powerpc,
354 .powerpcle,
355 .powerpc64,
356 .powerpc64le,
357 .s390x,
358 .sparc,
359 .sparc64,
360 => true,
361 // We use the target triple for LoongArch.
362 .loongarch32, .loongarch64 => false,
363 else => false,
364 };
365}
366
367pub fn clangSupportsNoImplicitFloatArg(target: std.Target) bool {
368 return switch (target.cpu.arch) {
369 .aarch64,
370 .aarch64_be,
371 .arm,
372 .armeb,
373 .thumb,
374 .thumbeb,
375 .riscv32,
376 .riscv64,
377 .x86,
378 .x86_64,
379 => true,
380 else => false,
381 };
382}
383
342pub fn needUnwindTables(target: std.Target) bool {384pub fn needUnwindTables(target: std.Target) bool {
343 return target.os.tag == .windows or target.isDarwin() or std.debug.Dwarf.abi.supportsUnwinding(target);385 return target.os.tag == .windows or target.isDarwin() or std.debug.Dwarf.abi.supportsUnwinding(target);
344}386}