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