aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-08-25 07:18:29 +0200
committerAlex Rønne Petersen <alex@alexrp.com>2024-09-10 08:53:30 +0200
commit77c8f4b6713c5209f0cde62001b5995641f8bf60 (patch)
treebf43a6b437610257f989b14d05743e680d968196 /src
parent70c92331c79018f8c5cc845f1015af7fa941f3a4 (diff)
downloadzig-77c8f4b6713c5209f0cde62001b5995641f8bf60.tar.gz
zig-77c8f4b6713c5209f0cde62001b5995641f8bf60.zip
Compilation: Pass hard/soft float flags to Clang as appropriate.
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig22
-rw-r--r--src/target.zig42
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);
}