From 1ad60c43868212e3c4162196686f3017f80efc02 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 14 Sep 2020 22:57:08 -0700 Subject: [PATCH] integrate target features into building C source files --- BRANCH_TODO | 1 - src-self-hosted/Compilation.zig | 27 ++++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/BRANCH_TODO b/BRANCH_TODO index c5af55bbf2..5ec11da3f0 100644 --- a/BRANCH_TODO +++ b/BRANCH_TODO @@ -1,4 +1,3 @@ - * integrate target features into building C source files * integrate target features into building assembly code * handle .d files from c objects * glibc .so files diff --git a/src-self-hosted/Compilation.zig b/src-self-hosted/Compilation.zig index 484f43e4ab..48bc20630b 100644 --- a/src-self-hosted/Compilation.zig +++ b/src-self-hosted/Compilation.zig @@ -1209,19 +1209,20 @@ fn addCCArgs( "-Xclang", "-target-cpu", "-Xclang", llvm_name, }); } - // TODO CLI args for target features - //if (g->zig_target->llvm_cpu_features != nullptr) { - // // https://github.com/ziglang/zig/issues/5017 - // SplitIterator it = memSplit(str(g->zig_target->llvm_cpu_features), str(",")); - // Optional> flag = SplitIterator_next(&it); - // while (flag.is_some) { - // try argv.append("-Xclang"); - // try argv.append("-target-feature"); - // try argv.append("-Xclang"); - // try argv.append(buf_ptr(buf_create_from_slice(flag.value))); - // flag = SplitIterator_next(&it); - // } - //} + + // 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.ensureCapacity(argv.items.len + all_features_list.len * 4); + for (all_features_list) |feature, index_usize| { + const index = @intCast(std.Target.Cpu.Feature.Set.Index, index_usize); + const is_enabled = target.cpu.features.isEnabled(index); + + if (feature.llvm_name) |llvm_name| { + argv.appendSliceAssumeCapacity(&[_][]const u8{ "-Xclang", "-target-feature", "-Xclang" }); + const plus_or_minus = "-+"[@boolToInt(is_enabled)]; + try argv.append(try std.fmt.allocPrint(arena, "{c}{s}", .{ plus_or_minus, llvm_name })); + } + } const mcmodel = comp.bin_file.options.machine_code_model; if (mcmodel != .default) { try argv.append(try std.fmt.allocPrint(arena, "-mcmodel={}", .{@tagName(mcmodel)}));