From 35d6ee08c468642969b594b711dd6448bbaefa89 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 17 Mar 2022 19:03:37 -0700 Subject: [PATCH] stage2: default to LLVM backend on targets for which self-hosted backends are not up to par. See #89 --- src/Compilation.zig | 13 ++++++++++--- src/target.zig | 9 +++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Compilation.zig b/src/Compilation.zig index c3d349b527..f6fe452951 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -943,11 +943,18 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation { if (use_stage1) break :blk true; - // Prefer LLVM for release builds as long as it supports the target architecture. - if (options.optimize_mode != .Debug and target_util.hasLlvmSupport(options.target)) + // If LLVM does not support the target, then we can't use it. + if (!target_util.hasLlvmSupport(options.target)) + break :blk false; + + // Prefer LLVM for release builds. + if (options.optimize_mode != .Debug) break :blk true; - break :blk false; + // At this point we would prefer to use our own self-hosted backend, + // because the compilation speed is better than LLVM. But only do it if + // we are confident in the robustness of the backend. + break :blk !target_util.selfHostedBackendIsAsRobustAsLlvm(options.target); }; if (!use_llvm) { if (options.use_llvm == true) { diff --git a/src/target.zig b/src/target.zig index aec37b6394..2eff4f8445 100644 --- a/src/target.zig +++ b/src/target.zig @@ -268,6 +268,15 @@ pub fn hasLlvmSupport(target: std.Target) bool { }; } +/// The set of targets that our own self-hosted backends have robust support for. +/// Used to select between LLVM backend and self-hosted backend when compiling in +/// debug mode. A given target should only return true here if it is passing greater +/// than or equal to the number of behavior tests as the respective LLVM backend. +pub fn selfHostedBackendIsAsRobustAsLlvm(target: std.Target) bool { + _ = target; + return false; +} + pub fn supportsStackProbing(target: std.Target) bool { return target.os.tag != .windows and target.os.tag != .uefi and (target.cpu.arch == .i386 or target.cpu.arch == .x86_64);