Skip to content

Commit 29f93ad

Browse files
authored
Rollup merge of #60788 - froydnj:apple-target-modifications-followup, r=estebank
default to $ARCH-apple-macosx10.7.0 LLVM triple for darwin targets Over in #60378, we made `rustc` switch LLVM target triples dynamically based on the `MACOSX_DEPLOYMENT_TARGET` environment variable. This change was made to align with `clang`'s behavior, and therefore make cross-language LTO feasible on OS X. Otherwise, `rustc` would produce LLVM bitcode files with a target triple of `x86_64-apple-darwin`, `clang` would produce LLVM bitcode files with a target triple of `x86_64-apple-macosx$VERSION`, and the linker would complain. This change worked fine, except for one corner case: if you didn't have `MACOSX_DEPLOYMENT_TARGET` set, and you wanted to do LTO on just Rust code, you'd get warning messages similar to: ``` warning: Linking two modules of different target triples: ' is 'x86_64-apple-macosx10.7.0' whereas 'main.7rcbfp3g-cgu.4' is 'x86_64-apple-darwin' ``` This message occurs because libstd is compiled with `MACOSX_DEPLOYMENT_TARGET` set to 10.7. The LLVM bitcode distributed in libstd's rlibs, then, is tagged with the target triple of `x86_64-apple-macosx10.7.0`, while the bitcode `rustc` produces for "user" code is tagged with the target triple of `x86_64-apple-darwin`. It's not good to have LTO on just Rust code (probably much more common than cross-language LTO) warn by default. These warnings also break Cargo's testsuite. This change defaults to acting as though `MACOSX_DEPLOYMENT_TARGET` was set to 10.7. "user" code will then be given a target triple that is equivalent to the target triple libstd bitcode is already using. The above warning will therefore go away. `rustc` already assumes that compiling without `MACOSX_DEPLOYMENT_TARGET` means that we're compiling for a target compatible with OS X 10.7 (e.g. that things like TLS work properly). So this change is really just making things conform more closely to the status quo. (It's also worth noting that before and after this patch, compiling with `MACOSX_DEPLOYMENT_TARGET` set to, say, 10.9, works just fine: target triples with an "apple" version ignore OS versions when checking compatibility, so bitcode with a `x86_64-apple-macosx10.7.0` triple works just fine with bitcode with a `x86_64-apple-macosx10.9.0` triple.)
2 parents 020111a + 7e94f9c commit 29f93ad

File tree

3 files changed

+7
-14
lines changed

3 files changed

+7
-14
lines changed

src/librustc_target/spec/apple_base.rs

+5-12
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub fn opts() -> TargetOptions {
1414
//
1515
// Here we detect what version is being requested, defaulting to 10.7. ELF
1616
// TLS is flagged as enabled if it looks to be supported.
17-
let version = macos_deployment_target().unwrap_or((10, 7));
17+
let version = macos_deployment_target();
1818

1919
TargetOptions {
2020
// macOS has -dead_strip, which doesn't rely on function_sections
@@ -35,7 +35,7 @@ pub fn opts() -> TargetOptions {
3535
}
3636
}
3737

38-
fn macos_deployment_target() -> Option<(u32, u32)> {
38+
fn macos_deployment_target() -> (u32, u32) {
3939
let deployment_target = env::var("MACOSX_DEPLOYMENT_TARGET").ok();
4040
let version = deployment_target.as_ref().and_then(|s| {
4141
let mut i = s.splitn(2, '.');
@@ -44,17 +44,10 @@ fn macos_deployment_target() -> Option<(u32, u32)> {
4444
a.parse::<u32>().and_then(|a| b.parse::<u32>().map(|b| (a, b))).ok()
4545
});
4646

47-
version
47+
version.unwrap_or((10, 7))
4848
}
4949

5050
pub fn macos_llvm_target(arch: &str) -> String {
51-
let version = macos_deployment_target();
52-
let llvm_target = match version {
53-
Some((major, minor)) => {
54-
format!("{}-apple-macosx{}.{}.0", arch, major, minor)
55-
},
56-
None => format!("{}-apple-darwin", arch)
57-
};
58-
59-
llvm_target
51+
let (major, minor) = macos_deployment_target();
52+
format!("{}-apple-macosx{}.{}.0", arch, major, minor)
6053
}

src/test/codegen/i686-no-macosx-deployment-target.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub struct Bool {
1919
b: bool,
2020
}
2121

22-
// CHECK: target triple = "i686-apple-darwin"
22+
// CHECK: target triple = "i686-apple-macosx10.7.0"
2323
#[no_mangle]
2424
pub extern "C" fn structbool() -> Bool {
2525
Bool { b: true }

src/test/codegen/x86_64-no-macosx-deployment-target.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub struct Bool {
1919
b: bool,
2020
}
2121

22-
// CHECK: target triple = "x86_64-apple-darwin"
22+
// CHECK: target triple = "x86_64-apple-macosx10.7.0"
2323
#[no_mangle]
2424
pub extern "C" fn structbool() -> Bool {
2525
Bool { b: true }

0 commit comments

Comments
 (0)