未验证 提交 bbb88eac 编写于 作者: D Dylan DPC 提交者: GitHub

Rollup merge of #93604 - tmandry:libunwind-fuchsia-default, r=Mark-Simulacrum

Make llvm-libunwind a per-target option

Fuchsia doesn't ship libunwind in its SDK, so we must provide it statically.
...@@ -605,16 +605,9 @@ changelog-seen = 2 ...@@ -605,16 +605,9 @@ changelog-seen = 2
# development of NLL # development of NLL
#test-compare-mode = false #test-compare-mode = false
# Use LLVM libunwind as the implementation for Rust's unwinder. # Global default for llvm-libunwind for all targets. See the target-specific
# Accepted values are 'in-tree' (formerly true), 'system' or 'no' (formerly false). # documentation for llvm-libunwind below. Note that the target-specific
# This option only applies for Linux and Fuchsia targets. # option will override this if set.
# On Linux target, if crt-static is not enabled, 'no' means dynamic link to
# `libgcc_s.so`, 'in-tree' means static link to the in-tree build of llvm libunwind
# and 'system' means dynamic link to `libunwind.so`. If crt-static is enabled,
# the behavior is depend on the libc. On musl target, 'no' and 'in-tree' both
# means static link to the in-tree build of llvm libunwind, and 'system' means
# static link to `libunwind.a` provided by system. Due to the limitation of glibc,
# it must link to `libgcc_eh.a` to get a working output, and this option have no effect.
#llvm-libunwind = 'no' #llvm-libunwind = 'no'
# Enable Windows Control Flow Guard checks in the standard library. # Enable Windows Control Flow Guard checks in the standard library.
...@@ -671,6 +664,18 @@ changelog-seen = 2 ...@@ -671,6 +664,18 @@ changelog-seen = 2
# not, you can specify an explicit file name for it. # not, you can specify an explicit file name for it.
#llvm-filecheck = "/path/to/llvm-version/bin/FileCheck" #llvm-filecheck = "/path/to/llvm-version/bin/FileCheck"
# Use LLVM libunwind as the implementation for Rust's unwinder.
# Accepted values are 'in-tree' (formerly true), 'system' or 'no' (formerly false).
# This option only applies for Linux and Fuchsia targets.
# On Linux target, if crt-static is not enabled, 'no' means dynamic link to
# `libgcc_s.so`, 'in-tree' means static link to the in-tree build of llvm libunwind
# and 'system' means dynamic link to `libunwind.so`. If crt-static is enabled,
# the behavior is depend on the libc. On musl target, 'no' and 'in-tree' both
# means static link to the in-tree build of llvm libunwind, and 'system' means
# static link to `libunwind.a` provided by system. Due to the limitation of glibc,
# it must link to `libgcc_eh.a` to get a working output, and this option have no effect.
#llvm-libunwind = 'no' if Linux, 'in-tree' if Fuchsia
# If this target is for Android, this option will be required to specify where # If this target is for Android, this option will be required to specify where
# the NDK for the target lives. This is used to find the C compiler to link and # the NDK for the target lives. This is used to find the C compiler to link and
# build native code. # build native code.
......
...@@ -176,7 +176,7 @@ fn copy_third_party_objects( ...@@ -176,7 +176,7 @@ fn copy_third_party_objects(
if target == "x86_64-fortanix-unknown-sgx" if target == "x86_64-fortanix-unknown-sgx"
|| target.contains("pc-windows-gnullvm") || target.contains("pc-windows-gnullvm")
|| builder.config.llvm_libunwind == LlvmLibunwind::InTree || builder.config.llvm_libunwind(target) == LlvmLibunwind::InTree
&& (target.contains("linux") || target.contains("fuchsia")) && (target.contains("linux") || target.contains("fuchsia"))
{ {
let libunwind_path = let libunwind_path =
......
...@@ -67,7 +67,6 @@ pub struct Config { ...@@ -67,7 +67,6 @@ pub struct Config {
pub rustc_error_format: Option<String>, pub rustc_error_format: Option<String>,
pub json_output: bool, pub json_output: bool,
pub test_compare_mode: bool, pub test_compare_mode: bool,
pub llvm_libunwind: LlvmLibunwind,
pub color: Color, pub color: Color,
pub patch_binaries_for_nix: bool, pub patch_binaries_for_nix: bool,
...@@ -151,6 +150,7 @@ pub struct Config { ...@@ -151,6 +150,7 @@ pub struct Config {
pub rust_profile_generate: Option<String>, pub rust_profile_generate: Option<String>,
pub llvm_profile_use: Option<String>, pub llvm_profile_use: Option<String>,
pub llvm_profile_generate: bool, pub llvm_profile_generate: bool,
pub llvm_libunwind_default: Option<LlvmLibunwind>,
pub build: TargetSelection, pub build: TargetSelection,
pub hosts: Vec<TargetSelection>, pub hosts: Vec<TargetSelection>,
...@@ -342,6 +342,7 @@ pub struct Target { ...@@ -342,6 +342,7 @@ pub struct Target {
pub llvm_config: Option<PathBuf>, pub llvm_config: Option<PathBuf>,
/// Some(path to FileCheck) if one was specified. /// Some(path to FileCheck) if one was specified.
pub llvm_filecheck: Option<PathBuf>, pub llvm_filecheck: Option<PathBuf>,
pub llvm_libunwind: Option<LlvmLibunwind>,
pub cc: Option<PathBuf>, pub cc: Option<PathBuf>,
pub cxx: Option<PathBuf>, pub cxx: Option<PathBuf>,
pub ar: Option<PathBuf>, pub ar: Option<PathBuf>,
...@@ -680,6 +681,7 @@ struct TomlTarget { ...@@ -680,6 +681,7 @@ struct TomlTarget {
linker: Option<String> = "linker", linker: Option<String> = "linker",
llvm_config: Option<String> = "llvm-config", llvm_config: Option<String> = "llvm-config",
llvm_filecheck: Option<String> = "llvm-filecheck", llvm_filecheck: Option<String> = "llvm-filecheck",
llvm_libunwind: Option<String> = "llvm-libunwind",
android_ndk: Option<String> = "android-ndk", android_ndk: Option<String> = "android-ndk",
sanitizers: Option<bool> = "sanitizers", sanitizers: Option<bool> = "sanitizers",
profiler: Option<bool> = "profiler", profiler: Option<bool> = "profiler",
...@@ -1043,10 +1045,6 @@ pub fn parse(args: &[String]) -> Config { ...@@ -1043,10 +1045,6 @@ pub fn parse(args: &[String]) -> Config {
set(&mut config.rust_rpath, rust.rpath); set(&mut config.rust_rpath, rust.rpath);
set(&mut config.jemalloc, rust.jemalloc); set(&mut config.jemalloc, rust.jemalloc);
set(&mut config.test_compare_mode, rust.test_compare_mode); set(&mut config.test_compare_mode, rust.test_compare_mode);
config.llvm_libunwind = rust
.llvm_libunwind
.map(|v| v.parse().expect("failed to parse rust.llvm-libunwind"))
.unwrap_or_default();
set(&mut config.backtrace, rust.backtrace); set(&mut config.backtrace, rust.backtrace);
set(&mut config.channel, rust.channel); set(&mut config.channel, rust.channel);
config.description = rust.description; config.description = rust.description;
...@@ -1069,6 +1067,9 @@ pub fn parse(args: &[String]) -> Config { ...@@ -1069,6 +1067,9 @@ pub fn parse(args: &[String]) -> Config {
config.rust_thin_lto_import_instr_limit = rust.thin_lto_import_instr_limit; config.rust_thin_lto_import_instr_limit = rust.thin_lto_import_instr_limit;
set(&mut config.rust_remap_debuginfo, rust.remap_debuginfo); set(&mut config.rust_remap_debuginfo, rust.remap_debuginfo);
set(&mut config.control_flow_guard, rust.control_flow_guard); set(&mut config.control_flow_guard, rust.control_flow_guard);
config.llvm_libunwind_default = rust
.llvm_libunwind
.map(|v| v.parse().expect("failed to parse rust.llvm-libunwind"));
if let Some(ref backends) = rust.codegen_backends { if let Some(ref backends) = rust.codegen_backends {
config.rust_codegen_backends = config.rust_codegen_backends =
...@@ -1095,6 +1096,10 @@ pub fn parse(args: &[String]) -> Config { ...@@ -1095,6 +1096,10 @@ pub fn parse(args: &[String]) -> Config {
if let Some(ref s) = cfg.llvm_filecheck { if let Some(ref s) = cfg.llvm_filecheck {
target.llvm_filecheck = Some(config.src.join(s)); target.llvm_filecheck = Some(config.src.join(s));
} }
target.llvm_libunwind = cfg
.llvm_libunwind
.as_ref()
.map(|v| v.parse().expect("failed to parse rust.llvm-libunwind"));
if let Some(ref s) = cfg.android_ndk { if let Some(ref s) = cfg.android_ndk {
target.ndk = Some(config.src.join(s)); target.ndk = Some(config.src.join(s));
} }
...@@ -1328,6 +1333,14 @@ pub fn llvm_enabled(&self) -> bool { ...@@ -1328,6 +1333,14 @@ pub fn llvm_enabled(&self) -> bool {
self.rust_codegen_backends.contains(&INTERNER.intern_str("llvm")) self.rust_codegen_backends.contains(&INTERNER.intern_str("llvm"))
} }
pub fn llvm_libunwind(&self, target: TargetSelection) -> LlvmLibunwind {
self.target_config
.get(&target)
.and_then(|t| t.llvm_libunwind)
.or(self.llvm_libunwind_default)
.unwrap_or(LlvmLibunwind::No)
}
pub fn submodules(&self, rust_info: &GitInfo) -> bool { pub fn submodules(&self, rust_info: &GitInfo) -> bool {
self.submodules.unwrap_or(rust_info.is_git()) self.submodules.unwrap_or(rust_info.is_git())
} }
......
...@@ -720,7 +720,7 @@ fn clear_if_dirty(&self, dir: &Path, input: &Path) -> bool { ...@@ -720,7 +720,7 @@ fn clear_if_dirty(&self, dir: &Path, input: &Path) -> bool {
fn std_features(&self, target: TargetSelection) -> String { fn std_features(&self, target: TargetSelection) -> String {
let mut features = "panic-unwind".to_string(); let mut features = "panic-unwind".to_string();
match self.config.llvm_libunwind { match self.config.llvm_libunwind(target) {
LlvmLibunwind::InTree => features.push_str(" llvm-libunwind"), LlvmLibunwind::InTree => features.push_str(" llvm-libunwind"),
LlvmLibunwind::System => features.push_str(" system-llvm-libunwind"), LlvmLibunwind::System => features.push_str(" system-llvm-libunwind"),
LlvmLibunwind::No => {} LlvmLibunwind::No => {}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册