about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTom Karpiniec <tom@ditto.live>2020-05-07 12:26:18 +1000
committerTom Karpiniec <tom@ditto.live>2020-05-07 15:35:48 +1000
commit342aad1d1b88a37361bf3a704750217b4fb4039d (patch)
tree4d8d971335a23bc9956095d223fed99053c66718
parent43271a39adc26d29350d4830b594c6435472815e (diff)
downloadrust-342aad1d1b88a37361bf3a704750217b4fb4039d.tar.gz
rust-342aad1d1b88a37361bf3a704750217b4fb4039d.zip
Force embed-bitcode on non-simulator iOS/tvOS targets
At this time Apple recommends Bitcode be included for iOS apps, and
requires it for tvOS. It is unlikely that a developer would want to
disable bitcode when building for these targets, yet by default it will
not be generated. This presents a papercut for developers on those
platforms.

Introduces a new TargetOption boolean key for specific triples to
indicate that bitcode should be generated, even if cargo attempts to
optimise with -Cembed-bitcode=no.
-rw-r--r--src/librustc_codegen_ssa/back/write.rs2
-rw-r--r--src/librustc_target/spec/aarch64_apple_ios.rs1
-rw-r--r--src/librustc_target/spec/aarch64_apple_tvos.rs1
-rw-r--r--src/librustc_target/spec/mod.rs5
4 files changed, 9 insertions, 0 deletions
diff --git a/src/librustc_codegen_ssa/back/write.rs b/src/librustc_codegen_ssa/back/write.rs
index 5c3444eff0a..72c4539e829 100644
--- a/src/librustc_codegen_ssa/back/write.rs
+++ b/src/librustc_codegen_ssa/back/write.rs
@@ -147,6 +147,8 @@ impl ModuleConfig {
             || sess.opts.cg.linker_plugin_lto.enabled()
         {
             EmitObj::Bitcode
+        } else if sess.target.target.options.forces_embed_bitcode {
+            EmitObj::ObjectCode(BitcodeSection::Full)
         } else if need_crate_bitcode_for_rlib(sess) {
             let force_full = need_crate_bitcode_for_rlib(sess);
             match sess.opts.optimize {
diff --git a/src/librustc_target/spec/aarch64_apple_ios.rs b/src/librustc_target/spec/aarch64_apple_ios.rs
index e896b46da9a..3ecedd769fa 100644
--- a/src/librustc_target/spec/aarch64_apple_ios.rs
+++ b/src/librustc_target/spec/aarch64_apple_ios.rs
@@ -19,6 +19,7 @@ pub fn target() -> TargetResult {
             eliminate_frame_pointer: false,
             max_atomic_width: Some(128),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            forces_embed_bitcode: true,
             ..base
         },
     })
diff --git a/src/librustc_target/spec/aarch64_apple_tvos.rs b/src/librustc_target/spec/aarch64_apple_tvos.rs
index 794bc7900e7..f1cd14ffd11 100644
--- a/src/librustc_target/spec/aarch64_apple_tvos.rs
+++ b/src/librustc_target/spec/aarch64_apple_tvos.rs
@@ -19,6 +19,7 @@ pub fn target() -> TargetResult {
             eliminate_frame_pointer: false,
             max_atomic_width: Some(128),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            forces_embed_bitcode: true,
             ..base
         },
     })
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index e853c07632f..8b319a0e381 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -783,6 +783,8 @@ pub struct TargetOptions {
     // If we give emcc .o files that are actually .bc files it
     // will 'just work'.
     pub obj_is_bitcode: bool,
+    /// Whether the target requires that emitted object code includes bitcode.
+    pub forces_embed_bitcode: bool,
 
     /// Don't use this field; instead use the `.min_atomic_width()` method.
     pub min_atomic_width: Option<u64>,
@@ -939,6 +941,7 @@ impl Default for TargetOptions {
             allow_asm: true,
             has_elf_tls: false,
             obj_is_bitcode: false,
+            forces_embed_bitcode: false,
             min_atomic_width: None,
             max_atomic_width: None,
             atomic_cas: true,
@@ -1278,6 +1281,7 @@ impl Target {
         key!(main_needs_argc_argv, bool);
         key!(has_elf_tls, bool);
         key!(obj_is_bitcode, bool);
+        key!(forces_embed_bitcode, bool);
         key!(max_atomic_width, Option<u64>);
         key!(min_atomic_width, Option<u64>);
         key!(atomic_cas, bool);
@@ -1505,6 +1509,7 @@ impl ToJson for Target {
         target_option_val!(main_needs_argc_argv);
         target_option_val!(has_elf_tls);
         target_option_val!(obj_is_bitcode);
+        target_option_val!(forces_embed_bitcode);
         target_option_val!(min_atomic_width);
         target_option_val!(max_atomic_width);
         target_option_val!(atomic_cas);