| ... | @@ -3396,88 +3396,8 @@ test "fds" { | ... | @@ -3396,88 +3396,8 @@ test "fds" { |
| 3396 | gimmeMoreOfThoseSweetSweetFileDescriptors(); | 3396 | gimmeMoreOfThoseSweetSweetFileDescriptors(); |
| 3397 | } | 3397 | } |
| 3398 | | 3398 | |
| 3399 | fn detectNativeCpuWithLLVM( | | |
| 3400 | arch: std.Target.Cpu.Arch, | | |
| 3401 | llvm_cpu_name_z: ?[*:0]const u8, | | |
| 3402 | llvm_cpu_features_opt: ?[*:0]const u8, | | |
| 3403 | ) !std.Target.Cpu { | | |
| 3404 | var result = std.Target.Cpu.baseline(arch); | | |
| 3405 | | | |
| 3406 | if (llvm_cpu_name_z) |cpu_name_z| { | | |
| 3407 | const llvm_cpu_name = mem.spanZ(cpu_name_z); | | |
| 3408 | | | |
| 3409 | for (arch.allCpuModels()) |model| { | | |
| 3410 | const this_llvm_name = model.llvm_name orelse continue; | | |
| 3411 | if (mem.eql(u8, this_llvm_name, llvm_cpu_name)) { | | |
| 3412 | // Here we use the non-dependencies-populated set, | | |
| 3413 | // so that subtracting features later in this function | | |
| 3414 | // affect the prepopulated set. | | |
| 3415 | result = std.Target.Cpu{ | | |
| 3416 | .arch = arch, | | |
| 3417 | .model = model, | | |
| 3418 | .features = model.features, | | |
| 3419 | }; | | |
| 3420 | break; | | |
| 3421 | } | | |
| 3422 | } | | |
| 3423 | } | | |
| 3424 | | | |
| 3425 | const all_features = arch.allFeaturesList(); | | |
| 3426 | | | |
| 3427 | if (llvm_cpu_features_opt) |llvm_cpu_features| { | | |
| 3428 | var it = mem.tokenize(mem.spanZ(llvm_cpu_features), ","); | | |
| 3429 | while (it.next()) |decorated_llvm_feat| { | | |
| 3430 | var op: enum { | | |
| 3431 | add, | | |
| 3432 | sub, | | |
| 3433 | } = undefined; | | |
| 3434 | var llvm_feat: []const u8 = undefined; | | |
| 3435 | if (mem.startsWith(u8, decorated_llvm_feat, "+")) { | | |
| 3436 | op = .add; | | |
| 3437 | llvm_feat = decorated_llvm_feat[1..]; | | |
| 3438 | } else if (mem.startsWith(u8, decorated_llvm_feat, "-")) { | | |
| 3439 | op = .sub; | | |
| 3440 | llvm_feat = decorated_llvm_feat[1..]; | | |
| 3441 | } else { | | |
| 3442 | return error.InvalidLlvmCpuFeaturesFormat; | | |
| 3443 | } | | |
| 3444 | for (all_features) |feature, index_usize| { | | |
| 3445 | const this_llvm_name = feature.llvm_name orelse continue; | | |
| 3446 | if (mem.eql(u8, llvm_feat, this_llvm_name)) { | | |
| 3447 | const index = @intCast(std.Target.Cpu.Feature.Set.Index, index_usize); | | |
| 3448 | switch (op) { | | |
| 3449 | .add => result.features.addFeature(index), | | |
| 3450 | .sub => result.features.removeFeature(index), | | |
| 3451 | } | | |
| 3452 | break; | | |
| 3453 | } | | |
| 3454 | } | | |
| 3455 | } | | |
| 3456 | } | | |
| 3457 | | | |
| 3458 | result.features.populateDependencies(all_features); | | |
| 3459 | return result; | | |
| 3460 | } | | |
| 3461 | | | |
| 3462 | fn detectNativeTargetInfo(gpa: *Allocator, cross_target: std.zig.CrossTarget) !std.zig.system.NativeTargetInfo { | 3399 | fn detectNativeTargetInfo(gpa: *Allocator, cross_target: std.zig.CrossTarget) !std.zig.system.NativeTargetInfo { |
| 3463 | var info = try std.zig.system.NativeTargetInfo.detect(gpa, cross_target); | 3400 | return std.zig.system.NativeTargetInfo.detect(gpa, cross_target); |
| 3464 | if (info.cpu_detection_unimplemented) { | | |
| 3465 | const arch = std.Target.current.cpu.arch; | | |
| 3466 | | | |
| 3467 | // We want to just use detected_info.target but implementing | | |
| 3468 | // CPU model & feature detection is todo so here we rely on LLVM. | | |
| 3469 | // https://github.com/ziglang/zig/issues/4591 | | |
| 3470 | if (!build_options.have_llvm) | | |
| 3471 | fatal("CPU features detection is not yet available for {s} without LLVM extensions", .{@tagName(arch)}); | | |
| 3472 | | | |
| 3473 | const llvm = @import("codegen/llvm/bindings.zig"); | | |
| 3474 | const llvm_cpu_name = llvm.GetHostCPUName(); | | |
| 3475 | const llvm_cpu_features = llvm.GetNativeFeatures(); | | |
| 3476 | info.target.cpu = try detectNativeCpuWithLLVM(arch, llvm_cpu_name, llvm_cpu_features); | | |
| 3477 | cross_target.updateCpuFeatures(&info.target.cpu.features); | | |
| 3478 | info.target.cpu.arch = cross_target.getCpuArch(); | | |
| 3479 | } | | |
| 3480 | return info; | | |
| 3481 | } | 3401 | } |
| 3482 | | 3402 | |
| 3483 | /// Indicate that we are now terminating with a successful exit code. | 3403 | /// Indicate that we are now terminating with a successful exit code. |