diff options
| author | Alex Rønne Petersen <alex@alexrp.com> | 2024-08-25 07:18:29 +0200 |
|---|---|---|
| committer | Alex Rønne Petersen <alex@alexrp.com> | 2024-09-10 08:53:30 +0200 |
| commit | 77c8f4b6713c5209f0cde62001b5995641f8bf60 (patch) | |
| tree | bf43a6b437610257f989b14d05743e680d968196 | |
| parent | 70c92331c79018f8c5cc845f1015af7fa941f3a4 (diff) | |
| download | zig-77c8f4b6713c5209f0cde62001b5995641f8bf60.tar.gz zig-77c8f4b6713c5209f0cde62001b5995641f8bf60.zip | |
Compilation: Pass hard/soft float flags to Clang as appropriate.
| -rw-r--r-- | src/Compilation.zig | 22 | ||||
| -rw-r--r-- | src/target.zig | 42 |
2 files changed, 60 insertions, 4 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig index 54fa120856..ffd004b93e 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -5484,6 +5484,9 @@ pub fn addCCArgs( const is_enabled = target.cpu.features.isEnabled(index); if (feature.llvm_name) |llvm_name| { + // We communicate float ABI to Clang through the dedicated options further down. + if (std.mem.eql(u8, llvm_name, "soft-float")) continue; + argv.appendSliceAssumeCapacity(&[_][]const u8{ "-Xclang", "-target-feature", "-Xclang" }); const plus_or_minus = "-+"[@intFromBool(is_enabled)]; const arg = try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name }); @@ -5705,10 +5708,6 @@ pub fn addCCArgs( if (target.cpu.model.llvm_name) |llvm_name| { try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name})); } - - if (std.Target.mips.featureSetHas(target.cpu.features, .soft_float)) { - try argv.append("-msoft-float"); - } }, else => { // TODO @@ -5751,6 +5750,21 @@ pub fn addCCArgs( try argv.append(try std.fmt.allocPrint(arena, "-mabi={s}", .{mabi})); } + // We might want to support -mfloat-abi=softfp for Arm and CSKY here in the future. + if (target_util.clangSupportsFloatAbiArg(target)) { + const fabi = @tagName(target.floatAbi()); + + try argv.append(switch (target.cpu.arch) { + // For whatever reason, Clang doesn't support `-mfloat-abi` for s390x. + .s390x => try std.fmt.allocPrint(arena, "-m{s}-float", .{fabi}), + else => try std.fmt.allocPrint(arena, "-mfloat-abi={s}", .{fabi}), + }); + } + + if (target_util.clangSupportsNoImplicitFloatArg(target) and target.floatAbi() == .soft) { + try argv.append("-mno-implicit-float"); + } + if (out_dep_path) |p| { try argv.appendSlice(&[_][]const u8{ "-MD", "-MV", "-MF", p }); } diff --git a/src/target.zig b/src/target.zig index 221c2029ba..59c151bd6e 100644 --- a/src/target.zig +++ b/src/target.zig @@ -339,6 +339,48 @@ pub fn clangAssemblerSupportsMcpuArg(target: std.Target) bool { }; } +pub fn clangSupportsFloatAbiArg(target: std.Target) bool { + return switch (target.cpu.arch) { + .arm, + .armeb, + .thumb, + .thumbeb, + .csky, + .mips, + .mipsel, + .mips64, + .mips64el, + .powerpc, + .powerpcle, + .powerpc64, + .powerpc64le, + .s390x, + .sparc, + .sparc64, + => true, + // We use the target triple for LoongArch. + .loongarch32, .loongarch64 => false, + else => false, + }; +} + +pub fn clangSupportsNoImplicitFloatArg(target: std.Target) bool { + return switch (target.cpu.arch) { + .aarch64, + .aarch64_be, + .arm, + .armeb, + .thumb, + .thumbeb, + .riscv32, + .riscv64, + .x86, + .x86_64, + => true, + else => false, + }; +} + pub fn needUnwindTables(target: std.Target) bool { return target.os.tag == .windows or target.isDarwin() or std.debug.Dwarf.abi.supportsUnwinding(target); } |
