mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
Compilation: avoid passing Clang specific options to Aro
This commit is contained in:
parent
e7a622fb33
commit
21f5f06f1f
@ -6608,14 +6608,43 @@ pub fn addTranslateCCArgs(
|
|||||||
out_dep_path: ?[]const u8,
|
out_dep_path: ?[]const u8,
|
||||||
owner_mod: *Package.Module,
|
owner_mod: *Package.Module,
|
||||||
) !void {
|
) !void {
|
||||||
|
const target = &owner_mod.resolved_target.result;
|
||||||
|
|
||||||
try argv.appendSlice(&.{ "-x", "c" });
|
try argv.appendSlice(&.{ "-x", "c" });
|
||||||
try comp.addCCArgs(arena, argv, ext, out_dep_path, owner_mod);
|
|
||||||
// This gives us access to preprocessing entities, presumably at the cost of performance.
|
const resource_path = try comp.dirs.zig_lib.join(arena, &.{"compiler/aro/include"});
|
||||||
try argv.appendSlice(&.{ "-Xclang", "-detailed-preprocessing-record" });
|
try argv.appendSlice(&.{ "-isystem", resource_path });
|
||||||
|
|
||||||
|
try comp.addCommonCCArgs(arena, argv, ext, out_dep_path, owner_mod);
|
||||||
|
|
||||||
|
try argv.appendSlice(&[_][]const u8{ "-target", try target.zigTriple(arena) });
|
||||||
|
|
||||||
|
const mcpu = mcpu: {
|
||||||
|
var buf: std.ArrayListUnmanaged(u8) = .empty;
|
||||||
|
defer buf.deinit(comp.gpa);
|
||||||
|
|
||||||
|
try buf.print(comp.gpa, "-mcpu={s}", .{target.cpu.model.name});
|
||||||
|
|
||||||
|
// TODO better serialization https://github.com/ziglang/zig/issues/4584
|
||||||
|
const all_features_list = target.cpu.arch.allFeaturesList();
|
||||||
|
try argv.ensureUnusedCapacity(all_features_list.len * 4);
|
||||||
|
for (all_features_list, 0..) |feature, index_usize| {
|
||||||
|
const index = @as(std.Target.Cpu.Feature.Set.Index, @intCast(index_usize));
|
||||||
|
const is_enabled = target.cpu.features.isEnabled(index);
|
||||||
|
|
||||||
|
const plus_or_minus = "-+"[@intFromBool(is_enabled)];
|
||||||
|
try buf.print(comp.gpa, "{c}{s}", .{ plus_or_minus, feature.name });
|
||||||
|
}
|
||||||
|
break :mcpu try buf.toOwnedSlice(arena);
|
||||||
|
};
|
||||||
|
try argv.append(mcpu);
|
||||||
|
|
||||||
|
try argv.appendSlice(comp.global_cc_argv);
|
||||||
|
try argv.appendSlice(owner_mod.cc_argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add common C compiler args between translate-c and C object compilation.
|
/// Add common C compiler args between translate-c and C object compilation.
|
||||||
pub fn addCCArgs(
|
fn addCommonCCArgs(
|
||||||
comp: *const Compilation,
|
comp: *const Compilation,
|
||||||
arena: Allocator,
|
arena: Allocator,
|
||||||
argv: *std.array_list.Managed([]const u8),
|
argv: *std.array_list.Managed([]const u8),
|
||||||
@ -6625,32 +6654,13 @@ pub fn addCCArgs(
|
|||||||
) !void {
|
) !void {
|
||||||
const target = &mod.resolved_target.result;
|
const target = &mod.resolved_target.result;
|
||||||
|
|
||||||
// As of Clang 16.x, it will by default read extra flags from /etc/clang.
|
if (target_util.supports_fpic(target)) {
|
||||||
// I'm sure the person who implemented this means well, but they have a lot
|
// PIE needs to go before PIC because Clang interprets `-fno-PIE` to imply `-fno-PIC`, which
|
||||||
// to learn about abstractions and where the appropriate boundaries between
|
// we don't necessarily want.
|
||||||
// them are. The road to hell is paved with good intentions. Fortunately it
|
try argv.append(if (comp.config.pie) "-fPIE" else "-fno-PIE");
|
||||||
// can be disabled.
|
try argv.append(if (mod.pic) "-fPIC" else "-fno-PIC");
|
||||||
try argv.append("--no-default-config");
|
|
||||||
|
|
||||||
// We don't ever put `-fcolor-diagnostics` or `-fno-color-diagnostics` because in passthrough mode
|
|
||||||
// we want Clang to infer it, and in normal mode we always want it off, which will be true since
|
|
||||||
// clang will detect stderr as a pipe rather than a terminal.
|
|
||||||
if (!comp.clang_passthrough_mode and ext.clangSupportsDiagnostics()) {
|
|
||||||
// Make stderr more easily parseable.
|
|
||||||
try argv.append("-fno-caret-diagnostics");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// We never want clang to invoke the system assembler for anything. So we would want
|
|
||||||
// this option always enabled. However, it only matters for some targets. To avoid
|
|
||||||
// "unused parameter" warnings, and to keep CLI spam to a minimum, we only put this
|
|
||||||
// flag on the command line if it is necessary.
|
|
||||||
if (target_util.clangMightShellOutForAssembly(target)) {
|
|
||||||
try argv.append("-integrated-as");
|
|
||||||
}
|
|
||||||
|
|
||||||
const llvm_triple = try @import("codegen/llvm.zig").targetTriple(arena, target);
|
|
||||||
try argv.appendSlice(&[_][]const u8{ "-target", llvm_triple });
|
|
||||||
|
|
||||||
switch (target.os.tag) {
|
switch (target.os.tag) {
|
||||||
.ios, .macos, .tvos, .watchos => |os| {
|
.ios, .macos, .tvos, .watchos => |os| {
|
||||||
try argv.ensureUnusedCapacity(2);
|
try argv.ensureUnusedCapacity(2);
|
||||||
@ -6676,78 +6686,6 @@ pub fn addCCArgs(
|
|||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
|
|
||||||
const xclang_flag = switch (ext) {
|
|
||||||
.assembly, .assembly_with_cpp => "-Xclangas",
|
|
||||||
else => "-Xclang",
|
|
||||||
};
|
|
||||||
|
|
||||||
if (target_util.clangSupportsTargetCpuArg(target)) {
|
|
||||||
if (target.cpu.model.llvm_name) |llvm_name| {
|
|
||||||
try argv.appendSlice(&[_][]const u8{
|
|
||||||
xclang_flag, "-target-cpu", xclang_flag, llvm_name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// It would be really nice if there was a more compact way to communicate this info to Clang.
|
|
||||||
const all_features_list = target.cpu.arch.allFeaturesList();
|
|
||||||
try argv.ensureUnusedCapacity(all_features_list.len * 4);
|
|
||||||
for (all_features_list, 0..) |feature, index_usize| {
|
|
||||||
const index = @as(std.Target.Cpu.Feature.Set.Index, @intCast(index_usize));
|
|
||||||
const is_enabled = target.cpu.features.isEnabled(index);
|
|
||||||
|
|
||||||
if (feature.llvm_name) |llvm_name| {
|
|
||||||
// We communicate float ABI to Clang through the dedicated options.
|
|
||||||
if (std.mem.startsWith(u8, llvm_name, "soft-float") or
|
|
||||||
std.mem.startsWith(u8, llvm_name, "hard-float"))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Ignore these until we figure out how to handle the concept of omitting features.
|
|
||||||
// See https://github.com/ziglang/zig/issues/23539
|
|
||||||
if (target_util.isDynamicAMDGCNFeature(target, feature)) continue;
|
|
||||||
|
|
||||||
argv.appendSliceAssumeCapacity(&[_][]const u8{ xclang_flag, "-target-feature", xclang_flag });
|
|
||||||
const plus_or_minus = "-+"[@intFromBool(is_enabled)];
|
|
||||||
const arg = try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name });
|
|
||||||
argv.appendAssumeCapacity(arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target.cpu.arch.isThumb()) {
|
|
||||||
try argv.append(switch (ext) {
|
|
||||||
.assembly, .assembly_with_cpp => "-Wa,-mthumb",
|
|
||||||
else => "-mthumb",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_util.llvmMachineAbi(target)) |mabi| {
|
|
||||||
// Clang's integrated Arm assembler doesn't support `-mabi` yet...
|
|
||||||
// Clang's FreeBSD driver doesn't support `-mabi` on PPC64 (ELFv2 is used anyway).
|
|
||||||
if (!(target.cpu.arch.isArm() and (ext == .assembly or ext == .assembly_with_cpp)) and
|
|
||||||
!(target.cpu.arch.isPowerPC64() and target.os.tag == .freebsd))
|
|
||||||
{
|
|
||||||
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.abi.float());
|
|
||||||
|
|
||||||
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.supports_fpic(target)) {
|
|
||||||
// PIE needs to go before PIC because Clang interprets `-fno-PIE` to imply `-fno-PIC`, which
|
|
||||||
// we don't necessarily want.
|
|
||||||
try argv.append(if (comp.config.pie) "-fPIE" else "-fno-PIE");
|
|
||||||
try argv.append(if (mod.pic) "-fPIC" else "-fno-PIC");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (comp.mingw_unicode_entry_point) {
|
if (comp.mingw_unicode_entry_point) {
|
||||||
try argv.append("-municode");
|
try argv.append("-municode");
|
||||||
}
|
}
|
||||||
@ -6784,45 +6722,6 @@ pub fn addCCArgs(
|
|||||||
if (ext != .assembly) {
|
if (ext != .assembly) {
|
||||||
try argv.append(if (target.os.tag == .freestanding) "-ffreestanding" else "-fhosted");
|
try argv.append(if (target.os.tag == .freestanding) "-ffreestanding" else "-fhosted");
|
||||||
|
|
||||||
if (target_util.clangSupportsNoImplicitFloatArg(target) and target.abi.float() == .soft) {
|
|
||||||
try argv.append("-mno-implicit-float");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_util.hasRedZone(target)) {
|
|
||||||
try argv.append(if (mod.red_zone) "-mred-zone" else "-mno-red-zone");
|
|
||||||
}
|
|
||||||
|
|
||||||
try argv.append(if (mod.omit_frame_pointer) "-fomit-frame-pointer" else "-fno-omit-frame-pointer");
|
|
||||||
|
|
||||||
const ssp_buf_size = mod.stack_protector;
|
|
||||||
if (ssp_buf_size != 0) {
|
|
||||||
try argv.appendSlice(&[_][]const u8{
|
|
||||||
"-fstack-protector-strong",
|
|
||||||
"--param",
|
|
||||||
try std.fmt.allocPrint(arena, "ssp-buffer-size={d}", .{ssp_buf_size}),
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
try argv.append("-fno-stack-protector");
|
|
||||||
}
|
|
||||||
|
|
||||||
try argv.append(if (mod.no_builtin) "-fno-builtin" else "-fbuiltin");
|
|
||||||
|
|
||||||
try argv.append(if (comp.function_sections) "-ffunction-sections" else "-fno-function-sections");
|
|
||||||
try argv.append(if (comp.data_sections) "-fdata-sections" else "-fno-data-sections");
|
|
||||||
|
|
||||||
switch (mod.unwind_tables) {
|
|
||||||
.none => {
|
|
||||||
try argv.append("-fno-unwind-tables");
|
|
||||||
try argv.append("-fno-asynchronous-unwind-tables");
|
|
||||||
},
|
|
||||||
.sync => {
|
|
||||||
// Need to override Clang's convoluted default logic.
|
|
||||||
try argv.append("-fno-asynchronous-unwind-tables");
|
|
||||||
try argv.append("-funwind-tables");
|
|
||||||
},
|
|
||||||
.async => try argv.append("-fasynchronous-unwind-tables"),
|
|
||||||
}
|
|
||||||
|
|
||||||
try argv.append("-nostdinc");
|
try argv.append("-nostdinc");
|
||||||
|
|
||||||
if (ext == .cpp or ext == .hpp) {
|
if (ext == .cpp or ext == .hpp) {
|
||||||
@ -6961,80 +6860,6 @@ pub fn addCCArgs(
|
|||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only assembly files support these flags.
|
|
||||||
switch (ext) {
|
|
||||||
.assembly,
|
|
||||||
.assembly_with_cpp,
|
|
||||||
=> {
|
|
||||||
// The Clang assembler does not accept the list of CPU features like the
|
|
||||||
// compiler frontend does. Therefore we must hard-code the -m flags for
|
|
||||||
// all CPU features here.
|
|
||||||
switch (target.cpu.arch) {
|
|
||||||
.riscv32, .riscv32be, .riscv64, .riscv64be => {
|
|
||||||
const RvArchFeat = struct { char: u8, feat: std.Target.riscv.Feature };
|
|
||||||
const letters = [_]RvArchFeat{
|
|
||||||
.{ .char = 'm', .feat = .m },
|
|
||||||
.{ .char = 'a', .feat = .a },
|
|
||||||
.{ .char = 'f', .feat = .f },
|
|
||||||
.{ .char = 'd', .feat = .d },
|
|
||||||
.{ .char = 'c', .feat = .c },
|
|
||||||
};
|
|
||||||
const prefix: []const u8 = if (target.cpu.arch == .riscv64) "rv64" else "rv32";
|
|
||||||
const prefix_len = 4;
|
|
||||||
assert(prefix.len == prefix_len);
|
|
||||||
var march_buf: [prefix_len + letters.len + 1]u8 = undefined;
|
|
||||||
var march_index: usize = prefix_len;
|
|
||||||
@memcpy(march_buf[0..prefix.len], prefix);
|
|
||||||
|
|
||||||
if (target.cpu.has(.riscv, .e)) {
|
|
||||||
march_buf[march_index] = 'e';
|
|
||||||
} else {
|
|
||||||
march_buf[march_index] = 'i';
|
|
||||||
}
|
|
||||||
march_index += 1;
|
|
||||||
|
|
||||||
for (letters) |letter| {
|
|
||||||
if (target.cpu.has(.riscv, letter.feat)) {
|
|
||||||
march_buf[march_index] = letter.char;
|
|
||||||
march_index += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const march_arg = try std.fmt.allocPrint(arena, "-march={s}", .{
|
|
||||||
march_buf[0..march_index],
|
|
||||||
});
|
|
||||||
try argv.append(march_arg);
|
|
||||||
|
|
||||||
if (target.cpu.has(.riscv, .relax)) {
|
|
||||||
try argv.append("-mrelax");
|
|
||||||
} else {
|
|
||||||
try argv.append("-mno-relax");
|
|
||||||
}
|
|
||||||
if (target.cpu.has(.riscv, .save_restore)) {
|
|
||||||
try argv.append("-msave-restore");
|
|
||||||
} else {
|
|
||||||
try argv.append("-mno-save-restore");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
.mips, .mipsel, .mips64, .mips64el => {
|
|
||||||
if (target.cpu.model.llvm_name) |llvm_name| {
|
|
||||||
try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name}));
|
|
||||||
}
|
|
||||||
},
|
|
||||||
else => {
|
|
||||||
// TODO
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target_util.clangAssemblerSupportsMcpuArg(target)) {
|
|
||||||
if (target.cpu.model.llvm_name) |llvm_name| {
|
|
||||||
try argv.append(try std.fmt.allocPrint(arena, "-mcpu={s}", .{llvm_name}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
else => {},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only compiled files support these flags.
|
// Only compiled files support these flags.
|
||||||
switch (ext) {
|
switch (ext) {
|
||||||
.c,
|
.c,
|
||||||
@ -7133,6 +6958,243 @@ pub fn addCCArgs(
|
|||||||
},
|
},
|
||||||
else => {},
|
else => {},
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add common C compiler args and Clang specific args.
|
||||||
|
pub fn addCCArgs(
|
||||||
|
comp: *const Compilation,
|
||||||
|
arena: Allocator,
|
||||||
|
argv: *std.ArrayList([]const u8),
|
||||||
|
ext: FileExt,
|
||||||
|
out_dep_path: ?[]const u8,
|
||||||
|
mod: *Package.Module,
|
||||||
|
) !void {
|
||||||
|
const target = &mod.resolved_target.result;
|
||||||
|
|
||||||
|
// As of Clang 16.x, it will by default read extra flags from /etc/clang.
|
||||||
|
// I'm sure the person who implemented this means well, but they have a lot
|
||||||
|
// to learn about abstractions and where the appropriate boundaries between
|
||||||
|
// them are. The road to hell is paved with good intentions. Fortunately it
|
||||||
|
// can be disabled.
|
||||||
|
try argv.append("--no-default-config");
|
||||||
|
|
||||||
|
// We don't ever put `-fcolor-diagnostics` or `-fno-color-diagnostics` because in passthrough mode
|
||||||
|
// we want Clang to infer it, and in normal mode we always want it off, which will be true since
|
||||||
|
// clang will detect stderr as a pipe rather than a terminal.
|
||||||
|
if (!comp.clang_passthrough_mode and ext.clangSupportsDiagnostics()) {
|
||||||
|
// Make stderr more easily parseable.
|
||||||
|
try argv.append("-fno-caret-diagnostics");
|
||||||
|
}
|
||||||
|
|
||||||
|
// We never want clang to invoke the system assembler for anything. So we would want
|
||||||
|
// this option always enabled. However, it only matters for some targets. To avoid
|
||||||
|
// "unused parameter" warnings, and to keep CLI spam to a minimum, we only put this
|
||||||
|
// flag on the command line if it is necessary.
|
||||||
|
if (target_util.clangMightShellOutForAssembly(target)) {
|
||||||
|
try argv.append("-integrated-as");
|
||||||
|
}
|
||||||
|
|
||||||
|
const llvm_triple = try @import("codegen/llvm.zig").targetTriple(arena, target);
|
||||||
|
try argv.appendSlice(&[_][]const u8{ "-target", llvm_triple });
|
||||||
|
|
||||||
|
if (target.cpu.arch.isThumb()) {
|
||||||
|
try argv.append(switch (ext) {
|
||||||
|
.assembly, .assembly_with_cpp => "-Wa,-mthumb",
|
||||||
|
else => "-mthumb",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_util.llvmMachineAbi(target)) |mabi| {
|
||||||
|
// Clang's integrated Arm assembler doesn't support `-mabi` yet...
|
||||||
|
// Clang's FreeBSD driver doesn't support `-mabi` on PPC64 (ELFv2 is used anyway).
|
||||||
|
if (!(target.cpu.arch.isArm() and (ext == .assembly or ext == .assembly_with_cpp)) and
|
||||||
|
!(target.cpu.arch.isPowerPC64() and target.os.tag == .freebsd))
|
||||||
|
{
|
||||||
|
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.abi.float());
|
||||||
|
|
||||||
|
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}),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
try comp.addCommonCCArgs(arena, argv, ext, out_dep_path, mod);
|
||||||
|
|
||||||
|
// Only assembly files support these flags.
|
||||||
|
switch (ext) {
|
||||||
|
.assembly,
|
||||||
|
.assembly_with_cpp,
|
||||||
|
=> {
|
||||||
|
// The Clang assembler does not accept the list of CPU features like the
|
||||||
|
// compiler frontend does. Therefore we must hard-code the -m flags for
|
||||||
|
// all CPU features here.
|
||||||
|
switch (target.cpu.arch) {
|
||||||
|
.riscv32, .riscv32be, .riscv64, .riscv64be => {
|
||||||
|
const RvArchFeat = struct { char: u8, feat: std.Target.riscv.Feature };
|
||||||
|
const letters = [_]RvArchFeat{
|
||||||
|
.{ .char = 'm', .feat = .m },
|
||||||
|
.{ .char = 'a', .feat = .a },
|
||||||
|
.{ .char = 'f', .feat = .f },
|
||||||
|
.{ .char = 'd', .feat = .d },
|
||||||
|
.{ .char = 'c', .feat = .c },
|
||||||
|
};
|
||||||
|
const prefix: []const u8 = if (target.cpu.arch == .riscv64) "rv64" else "rv32";
|
||||||
|
const prefix_len = 4;
|
||||||
|
assert(prefix.len == prefix_len);
|
||||||
|
var march_buf: [prefix_len + letters.len + 1]u8 = undefined;
|
||||||
|
var march_index: usize = prefix_len;
|
||||||
|
@memcpy(march_buf[0..prefix.len], prefix);
|
||||||
|
|
||||||
|
if (target.cpu.has(.riscv, .e)) {
|
||||||
|
march_buf[march_index] = 'e';
|
||||||
|
} else {
|
||||||
|
march_buf[march_index] = 'i';
|
||||||
|
}
|
||||||
|
march_index += 1;
|
||||||
|
|
||||||
|
for (letters) |letter| {
|
||||||
|
if (target.cpu.has(.riscv, letter.feat)) {
|
||||||
|
march_buf[march_index] = letter.char;
|
||||||
|
march_index += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const march_arg = try std.fmt.allocPrint(arena, "-march={s}", .{
|
||||||
|
march_buf[0..march_index],
|
||||||
|
});
|
||||||
|
try argv.append(march_arg);
|
||||||
|
|
||||||
|
if (target.cpu.has(.riscv, .relax)) {
|
||||||
|
try argv.append("-mrelax");
|
||||||
|
} else {
|
||||||
|
try argv.append("-mno-relax");
|
||||||
|
}
|
||||||
|
if (target.cpu.has(.riscv, .save_restore)) {
|
||||||
|
try argv.append("-msave-restore");
|
||||||
|
} else {
|
||||||
|
try argv.append("-mno-save-restore");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.mips, .mipsel, .mips64, .mips64el => {
|
||||||
|
if (target.cpu.model.llvm_name) |llvm_name| {
|
||||||
|
try argv.append(try std.fmt.allocPrint(arena, "-march={s}", .{llvm_name}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
else => {
|
||||||
|
// TODO
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_util.clangAssemblerSupportsMcpuArg(target)) {
|
||||||
|
if (target.cpu.model.llvm_name) |llvm_name| {
|
||||||
|
try argv.append(try std.fmt.allocPrint(arena, "-mcpu={s}", .{llvm_name}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-preprocessed assembly files don't support these flags.
|
||||||
|
if (ext != .assembly) {
|
||||||
|
if (target_util.clangSupportsNoImplicitFloatArg(target) and target.abi.float() == .soft) {
|
||||||
|
try argv.append("-mno-implicit-float");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (target_util.hasRedZone(target)) {
|
||||||
|
try argv.append(if (mod.red_zone) "-mred-zone" else "-mno-red-zone");
|
||||||
|
}
|
||||||
|
|
||||||
|
try argv.append(if (mod.omit_frame_pointer) "-fomit-frame-pointer" else "-fno-omit-frame-pointer");
|
||||||
|
|
||||||
|
const ssp_buf_size = mod.stack_protector;
|
||||||
|
if (ssp_buf_size != 0) {
|
||||||
|
try argv.appendSlice(&[_][]const u8{
|
||||||
|
"-fstack-protector-strong",
|
||||||
|
"--param",
|
||||||
|
try std.fmt.allocPrint(arena, "ssp-buffer-size={d}", .{ssp_buf_size}),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
try argv.append("-fno-stack-protector");
|
||||||
|
}
|
||||||
|
|
||||||
|
try argv.append(if (mod.no_builtin) "-fno-builtin" else "-fbuiltin");
|
||||||
|
|
||||||
|
try argv.append(if (comp.function_sections) "-ffunction-sections" else "-fno-function-sections");
|
||||||
|
try argv.append(if (comp.data_sections) "-fdata-sections" else "-fno-data-sections");
|
||||||
|
|
||||||
|
switch (mod.unwind_tables) {
|
||||||
|
.none => {
|
||||||
|
try argv.append("-fno-unwind-tables");
|
||||||
|
try argv.append("-fno-asynchronous-unwind-tables");
|
||||||
|
},
|
||||||
|
.sync => {
|
||||||
|
// Need to override Clang's convoluted default logic.
|
||||||
|
try argv.append("-fno-asynchronous-unwind-tables");
|
||||||
|
try argv.append("-funwind-tables");
|
||||||
|
},
|
||||||
|
.async => try argv.append("-fasynchronous-unwind-tables"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only compiled files support these flags.
|
||||||
|
switch (ext) {
|
||||||
|
.c,
|
||||||
|
.h,
|
||||||
|
.cpp,
|
||||||
|
.hpp,
|
||||||
|
.m,
|
||||||
|
.hm,
|
||||||
|
.mm,
|
||||||
|
.hmm,
|
||||||
|
.ll,
|
||||||
|
.bc,
|
||||||
|
=> {
|
||||||
|
const xclang_flag = switch (ext) {
|
||||||
|
.assembly, .assembly_with_cpp => "-Xclangas",
|
||||||
|
else => "-Xclang",
|
||||||
|
};
|
||||||
|
|
||||||
|
if (target_util.clangSupportsTargetCpuArg(target)) {
|
||||||
|
if (target.cpu.model.llvm_name) |llvm_name| {
|
||||||
|
try argv.appendSlice(&[_][]const u8{
|
||||||
|
xclang_flag, "-target-cpu", xclang_flag, llvm_name,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// It would be really nice if there was a more compact way to communicate this info to Clang.
|
||||||
|
const all_features_list = target.cpu.arch.allFeaturesList();
|
||||||
|
try argv.ensureUnusedCapacity(all_features_list.len * 4);
|
||||||
|
for (all_features_list, 0..) |feature, index_usize| {
|
||||||
|
const index = @as(std.Target.Cpu.Feature.Set.Index, @intCast(index_usize));
|
||||||
|
const is_enabled = target.cpu.features.isEnabled(index);
|
||||||
|
|
||||||
|
if (feature.llvm_name) |llvm_name| {
|
||||||
|
// We communicate float ABI to Clang through the dedicated options.
|
||||||
|
if (std.mem.startsWith(u8, llvm_name, "soft-float") or
|
||||||
|
std.mem.startsWith(u8, llvm_name, "hard-float"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Ignore these until we figure out how to handle the concept of omitting features.
|
||||||
|
// See https://github.com/ziglang/zig/issues/23539
|
||||||
|
if (target_util.isDynamicAMDGCNFeature(target, feature)) continue;
|
||||||
|
|
||||||
|
argv.appendSliceAssumeCapacity(&[_][]const u8{ xclang_flag, "-target-feature", xclang_flag });
|
||||||
|
const plus_or_minus = "-+"[@intFromBool(is_enabled)];
|
||||||
|
const arg = try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name });
|
||||||
|
argv.appendAssumeCapacity(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
else => {},
|
||||||
|
}
|
||||||
|
|
||||||
try argv.appendSlice(comp.global_cc_argv);
|
try argv.appendSlice(comp.global_cc_argv);
|
||||||
try argv.appendSlice(mod.cc_argv);
|
try argv.appendSlice(mod.cc_argv);
|
||||||
|
|||||||
@ -4555,7 +4555,6 @@ fn cmdTranslateC(
|
|||||||
};
|
};
|
||||||
|
|
||||||
var argv = std.ArrayList([]const u8).init(arena);
|
var argv = std.ArrayList([]const u8).init(arena);
|
||||||
try argv.append("arocc");
|
|
||||||
try comp.addTranslateCCArgs(arena, &argv, ext, out_dep_path, comp.root_mod);
|
try comp.addTranslateCCArgs(arena, &argv, ext, out_dep_path, comp.root_mod);
|
||||||
try argv.append(c_source_file.src_path);
|
try argv.append(c_source_file.src_path);
|
||||||
if (comp.verbose_cc) Compilation.dump_argv(argv.items);
|
if (comp.verbose_cc) Compilation.dump_argv(argv.items);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user