authorgravatar for 16461362+gaosui@users.noreply.github.comShawn Gao <16461362+gaosui@users.noreply.github.com> 2024-09-23 15:08:58-07:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-20 10:09:03+01:00
logdafe1a910d1b236e7cfba40231f3c730f18f5d1f
tree8b48e920e62739304f3b94d7a9415e4f9d260b88
parentacba2645f776530e9a1ca287ae2336c928653724

Append disabled LLVM CPU features after enabled ones


1 files changed, 19 insertions(+), 8 deletions(-)

src/Package/Module.zig+19-8
...@@ -312,18 +312,29 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {...@@ -312,18 +312,29 @@ pub fn create(arena: Allocator, options: CreateOptions) !*Package.Module {
312 if (!options.global.use_llvm) break :b null;312 if (!options.global.use_llvm) break :b null;
313313
314 var buf = std.ArrayList(u8).init(arena);314 var buf = std.ArrayList(u8).init(arena);
315 for (target.cpu.arch.allFeaturesList(), 0..) |feature, index_usize| {315 var disabled_features = std.ArrayList(u8).init(arena);
316 const index = @as(std.Target.Cpu.Feature.Set.Index, @intCast(index_usize));316 defer disabled_features.deinit();
317 const is_enabled = target.cpu.features.isEnabled(index);
318317
318 // Append disabled features after enabled ones, so that their effects aren't overwritten.
319 for (target.cpu.arch.allFeaturesList()) |feature| {
319 if (feature.llvm_name) |llvm_name| {320 if (feature.llvm_name) |llvm_name| {
320 const plus_or_minus = "-+"[@intFromBool(is_enabled)];321 const is_enabled = target.cpu.features.isEnabled(feature.index);
321 try buf.ensureUnusedCapacity(2 + llvm_name.len);322
322 buf.appendAssumeCapacity(plus_or_minus);323 if (is_enabled) {
323 buf.appendSliceAssumeCapacity(llvm_name);324 try buf.ensureUnusedCapacity(2 + llvm_name.len);
324 buf.appendSliceAssumeCapacity(",");325 buf.appendAssumeCapacity('+');
326 buf.appendSliceAssumeCapacity(llvm_name);
327 buf.appendAssumeCapacity(',');
328 } else {
329 try disabled_features.ensureUnusedCapacity(2 + llvm_name.len);
330 disabled_features.appendAssumeCapacity('-');
331 disabled_features.appendSliceAssumeCapacity(llvm_name);
332 disabled_features.appendAssumeCapacity(',');
333 }
325 }334 }
326 }335 }
336
337 try buf.appendSlice(disabled_features.items);
327 if (buf.items.len == 0) break :b "";338 if (buf.items.len == 0) break :b "";
328 assert(std.mem.endsWith(u8, buf.items, ","));339 assert(std.mem.endsWith(u8, buf.items, ","));
329 buf.items[buf.items.len - 1] = 0;340 buf.items[buf.items.len - 1] = 0;