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
signature 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(
54845484 const is_enabled = target.cpu.features.isEnabled(index);
54855485
54865486 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
54875490 argv.appendSliceAssumeCapacity(&[_][]const u8{ "-Xclang", "-target-feature", "-Xclang" });
54885491 const plus_or_minus = "-+"[@intFromBool(is_enabled)];
54895492 const arg = try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name });
......@@ -5705,10 +5708,6 @@ pub fn addCCArgs(
57055708 if (target.cpu.model.llvm_name) |llvm_name| {
57065709 try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name}));
57075710 }
5708
5709 if (std.Target.mips.featureSetHas(target.cpu.features, .soft_float)) {
5710 try argv.append("-msoft-float");
5711 }
57125711 },
57135712 else => {
57145713 // TODO
......@@ -5751,6 +5750,21 @@ pub fn addCCArgs(
57515750 try argv.append(try std.fmt.allocPrint(arena, "-mabi={s}", .{mabi}));
57525751 }
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
57545768 if (out_dep_path) |p| {
57555769 try argv.appendSlice(&[_][]const u8{ "-MD", "-MV", "-MF", p });
57565770 }
src/target.zig+42
......@@ -339,6 +339,48 @@ pub fn clangAssemblerSupportsMcpuArg(target: std.Target) bool {
339339 };
340340}
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
342384pub fn needUnwindTables(target: std.Target) bool {
343385 return target.os.tag == .windows or target.isDarwin() or std.debug.Dwarf.abi.supportsUnwinding(target);
344386}