aboutsummaryrefslogtreecommitdiff
path: root/src/Package/Module.zig
diff options
context:
space:
mode:
authorShawn Gao <16461362+gaosui@users.noreply.github.com>2024-09-23 15:08:58 -0700
committerAlex Rønne Petersen <alex@alexrp.com>2024-11-20 10:09:03 +0100
commitdafe1a910d1b236e7cfba40231f3c730f18f5d1f (patch)
tree8b48e920e62739304f3b94d7a9415e4f9d260b88 /src/Package/Module.zig
parentacba2645f776530e9a1ca287ae2336c928653724 (diff)
downloadzig-dafe1a910d1b236e7cfba40231f3c730f18f5d1f.tar.gz
zig-dafe1a910d1b236e7cfba40231f3c730f18f5d1f.zip
Append disabled LLVM CPU features after enabled ones
Diffstat (limited to 'src/Package/Module.zig')
-rw-r--r--src/Package/Module.zig27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/Package/Module.zig b/src/Package/Module.zig
index 0e777145d9..996e58ddfb 100644
--- a/src/Package/Module.zig
+++ b/src/Package/Module.zig
@@ -312,18 +312,29 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
if (!options.global.use_llvm) break :b null;
var buf = std.ArrayList(u8).init(arena);
- for (target.cpu.arch.allFeaturesList(), 0..) |feature, index_usize| {
- const index = @as(std.Target.Cpu.Feature.Set.Index, @intCast(index_usize));
- const is_enabled = target.cpu.features.isEnabled(index);
+ var disabled_features = std.ArrayList(u8).init(arena);
+ defer disabled_features.deinit();
+ // Append disabled features after enabled ones, so that their effects aren't overwritten.
+ for (target.cpu.arch.allFeaturesList()) |feature| {
if (feature.llvm_name) |llvm_name| {
- const plus_or_minus = "-+"[@intFromBool(is_enabled)];
- try buf.ensureUnusedCapacity(2 + llvm_name.len);
- buf.appendAssumeCapacity(plus_or_minus);
- buf.appendSliceAssumeCapacity(llvm_name);
- buf.appendSliceAssumeCapacity(",");
+ const is_enabled = target.cpu.features.isEnabled(feature.index);
+
+ if (is_enabled) {
+ try buf.ensureUnusedCapacity(2 + llvm_name.len);
+ buf.appendAssumeCapacity('+');
+ buf.appendSliceAssumeCapacity(llvm_name);
+ buf.appendAssumeCapacity(',');
+ } else {
+ try disabled_features.ensureUnusedCapacity(2 + llvm_name.len);
+ disabled_features.appendAssumeCapacity('-');
+ disabled_features.appendSliceAssumeCapacity(llvm_name);
+ disabled_features.appendAssumeCapacity(',');
+ }
}
}
+
+ try buf.appendSlice(disabled_features.items);
if (buf.items.len == 0) break :b "";
assert(std.mem.endsWith(u8, buf.items, ","));
buf.items[buf.items.len - 1] = 0;