| ... | @@ -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; |
| 313 | | 313 | |
| 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); | | |
| 318 | | 317 | |
| | 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; |