From 261a91519d57590283b250ea9dc1d924b01d4dd6 Mon Sep 17 00:00:00 2001
From: Yuki OKUSHI <huyuumi.dev@gmail.com>
Date: Fri, 29 Mar 2019 06:44:31 +0900
Subject: [PATCH 1/6] Use platform dependent mcount function

---
 src/librustc_codegen_llvm/attributes.rs | 30 ++++++++++++++++++++++++-
 src/test/codegen/instrument-mcount.rs   |  7 ++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 src/test/codegen/instrument-mcount.rs

diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index 71e7535313f..e765b986d62 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -77,9 +77,37 @@ pub fn set_instrument_function(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
     if cx.sess().instrument_mcount() {
         // Similar to `clang -pg` behavior. Handled by the
         // `post-inline-ee-instrument` LLVM pass.
+
+        // The function name varies on platforms.
+        // See test/CodeGen/mcount.c in clang.
+        let mcount_name = if cfg!(target_os = "netbsd") {
+            const_cstr!("__mcount")
+        } else if cfg!(any(
+                target_arch = "mips", target_arch = "mips64",
+                target_arch = "powerpc", target_arch = "powerpc64")) {
+            const_cstr!("_mcount")
+        } else if cfg!(target_os = "darwin") {
+            const_cstr!("\01mcount")
+        } else if cfg!(target_arch = "aarch64")
+            && (cfg!(target_os = "linux")
+                || (cfg!(target_os = "unknown") && cfg!(target_env = "gnu")))
+        {
+            const_cstr!("\01_mcount")
+        } else if cfg!(target_arch = "arm")
+            && cfg!(any(target_os = "linux", target_os = "unknown"))
+        {
+            if cfg!(target_env = "gnu") {
+                const_cstr!("\01__gnu_mcount_nc")
+            } else {
+                const_cstr!("\01mcount")
+            }
+        } else {
+            const_cstr!("mcount")
+        };
+
         llvm::AddFunctionAttrStringValue(
             llfn, llvm::AttributePlace::Function,
-            const_cstr!("instrument-function-entry-inlined"), const_cstr!("mcount"));
+            const_cstr!("instrument-function-entry-inlined"), mcount_name);
     }
 }
 
diff --git a/src/test/codegen/instrument-mcount.rs b/src/test/codegen/instrument-mcount.rs
new file mode 100644
index 00000000000..bd01556d986
--- /dev/null
+++ b/src/test/codegen/instrument-mcount.rs
@@ -0,0 +1,7 @@
+// ignore-tidy-linelength
+// compile-flags: -Z instrument-mcount
+
+#![crate_type = "lib"]
+
+// CHECK: attributes #{{.*}} "instrument-function-entry-inlined"="{{_*}}mcount" "no-frame-pointer-elim"="true"
+pub fn foo() {}

From 8381cbab1a80b2c71df79fb8c33f480cfbca52bb Mon Sep 17 00:00:00 2001
From: Yuki OKUSHI <huyuumi.dev@gmail.com>
Date: Sat, 30 Mar 2019 18:50:19 +0900
Subject: [PATCH 2/6] Add target_mcount option

---
 src/librustc_target/spec/aarch64_unknown_linux_gnu.rs     | 1 +
 src/librustc_target/spec/aarch64_unknown_linux_musl.rs    | 1 +
 src/librustc_target/spec/aarch64_unknown_netbsd.rs        | 7 +++++--
 src/librustc_target/spec/arm_unknown_linux_gnueabi.rs     | 1 +
 src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs   | 1 +
 src/librustc_target/spec/arm_unknown_linux_musleabi.rs    | 1 +
 src/librustc_target/spec/arm_unknown_linux_musleabihf.rs  | 1 +
 src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs  | 1 +
 src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs | 1 +
 .../spec/armv5te_unknown_linux_musleabi.rs                | 1 +
 src/librustc_target/spec/armv6_unknown_freebsd.rs         | 1 +
 src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs   | 1 +
 src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs | 7 +++++--
 src/librustc_target/spec/armv7_unknown_freebsd.rs         | 1 +
 src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs | 1 +
 .../spec/armv7_unknown_linux_musleabihf.rs                | 1 +
 src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs   | 1 +
 src/librustc_target/spec/i686_apple_darwin.rs             | 7 +++++--
 src/librustc_target/spec/i686_unknown_netbsd.rs           | 7 +++++--
 src/librustc_target/spec/mips64_unknown_linux_gnuabi64.rs | 1 +
 .../spec/mips64el_unknown_linux_gnuabi64.rs               | 1 +
 src/librustc_target/spec/mips_unknown_linux_gnu.rs        | 1 +
 src/librustc_target/spec/mips_unknown_linux_musl.rs       | 7 +++++--
 src/librustc_target/spec/mips_unknown_linux_uclibc.rs     | 1 +
 src/librustc_target/spec/mipsel_unknown_linux_gnu.rs      | 1 +
 src/librustc_target/spec/mipsel_unknown_linux_musl.rs     | 7 +++++--
 src/librustc_target/spec/mipsel_unknown_linux_uclibc.rs   | 1 +
 src/librustc_target/spec/mipsisa32r6_unknown_linux_gnu.rs | 1 +
 .../spec/mipsisa32r6el_unknown_linux_gnu.rs               | 1 +
 .../spec/mipsisa64r6_unknown_linux_gnuabi64.rs            | 1 +
 .../spec/mipsisa64r6el_unknown_linux_gnuabi64.rs          | 1 +
 src/librustc_target/spec/mod.rs                           | 8 +++++++-
 src/librustc_target/spec/powerpc64_unknown_freebsd.rs     | 7 +++++--
 src/librustc_target/spec/powerpc64_unknown_linux_gnu.rs   | 7 +++++--
 src/librustc_target/spec/powerpc64_unknown_linux_musl.rs  | 7 +++++--
 src/librustc_target/spec/powerpc64le_unknown_linux_gnu.rs | 7 +++++--
 .../spec/powerpc64le_unknown_linux_musl.rs                | 7 +++++--
 src/librustc_target/spec/powerpc_unknown_linux_gnu.rs     | 7 +++++--
 src/librustc_target/spec/powerpc_unknown_linux_gnuspe.rs  | 7 +++++--
 src/librustc_target/spec/powerpc_unknown_linux_musl.rs    | 7 +++++--
 src/librustc_target/spec/powerpc_unknown_netbsd.rs        | 7 +++++--
 src/librustc_target/spec/sparc64_unknown_netbsd.rs        | 7 +++++--
 src/librustc_target/spec/x86_64_apple_darwin.rs           | 7 +++++--
 src/librustc_target/spec/x86_64_rumprun_netbsd.rs         | 7 +++++--
 src/librustc_target/spec/x86_64_unknown_netbsd.rs         | 7 +++++--
 45 files changed, 127 insertions(+), 39 deletions(-)

diff --git a/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs b/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs
index e772d8b532c..59a28573641 100644
--- a/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01_mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/aarch64_unknown_linux_musl.rs b/src/librustc_target/spec/aarch64_unknown_linux_musl.rs
index 8123ee82ed5..781b1322f5a 100644
--- a/src/librustc_target/spec/aarch64_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/aarch64_unknown_linux_musl.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01_mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/aarch64_unknown_netbsd.rs b/src/librustc_target/spec/aarch64_unknown_netbsd.rs
index 47ae08ade9a..455cbebb91e 100644
--- a/src/librustc_target/spec/aarch64_unknown_netbsd.rs
+++ b/src/librustc_target/spec/aarch64_unknown_netbsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::netbsd_base::opts();
@@ -16,6 +16,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "__mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs b/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs
index f291818ba80..1173d18634e 100644
--- a/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs
@@ -18,6 +18,7 @@ pub fn target() -> TargetResult {
         options: TargetOptions {
             features: "+strict-align,+v6".to_string(),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs b/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs
index 32b509d9721..6fc7c46be3b 100644
--- a/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs
@@ -18,6 +18,7 @@ pub fn target() -> TargetResult {
         options: TargetOptions {
             features: "+strict-align,+v6,+vfp2".to_string(),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_musleabi.rs b/src/librustc_target/spec/arm_unknown_linux_musleabi.rs
index 7637577e7e8..7a2a4e85e4a 100644
--- a/src/librustc_target/spec/arm_unknown_linux_musleabi.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_musleabi.rs
@@ -23,6 +23,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs b/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs
index 9def151b3ef..b7aa1952cb0 100644
--- a/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs
@@ -23,6 +23,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs b/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs
index 7cd4b14cdeb..59c15f1610d 100644
--- a/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs
+++ b/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs
@@ -19,6 +19,7 @@ pub fn target() -> TargetResult {
             // Atomic operations provided by compiler-builtins
             max_atomic_width: Some(32),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs b/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs
index 15f61482771..a1a61a69d05 100644
--- a/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs
+++ b/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs
@@ -19,6 +19,7 @@ pub fn target() -> TargetResult {
             // Atomic operations provided by compiler-builtins
             max_atomic_width: Some(32),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs b/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs
index 74915b942ea..9b44a54715e 100644
--- a/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs
+++ b/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs
@@ -22,6 +22,7 @@ pub fn target() -> TargetResult {
             // Atomic operations provided by compiler-builtins
             max_atomic_width: Some(32),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01mcount".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv6_unknown_freebsd.rs b/src/librustc_target/spec/armv6_unknown_freebsd.rs
index 39886a16a74..e706c8281d2 100644
--- a/src/librustc_target/spec/armv6_unknown_freebsd.rs
+++ b/src/librustc_target/spec/armv6_unknown_freebsd.rs
@@ -18,6 +18,7 @@ pub fn target() -> TargetResult {
             features: "+v6,+vfp2".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs b/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs
index e460b6c574a..b056776bdfb 100644
--- a/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs
+++ b/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs
@@ -18,6 +18,7 @@ pub fn target() -> TargetResult {
         options: TargetOptions {
             features: "+v6,+vfp2".to_string(),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "__mcount".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs b/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs
index a6c7fb537c7..70d4985ab86 100644
--- a/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::cloudabi_base::opts();
@@ -19,6 +19,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "\01mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/armv7_unknown_freebsd.rs b/src/librustc_target/spec/armv7_unknown_freebsd.rs
index ba63fd2bf05..0f9ee5d44a9 100644
--- a/src/librustc_target/spec/armv7_unknown_freebsd.rs
+++ b/src/librustc_target/spec/armv7_unknown_freebsd.rs
@@ -18,6 +18,7 @@ pub fn target() -> TargetResult {
             features: "+v7,+vfp3,+d16,+thumb2,-neon".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs b/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs
index f16215433c7..afba6f608ee 100644
--- a/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs
@@ -23,6 +23,7 @@ pub fn target() -> TargetResult {
             cpu: "generic".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs b/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs
index 45a26966b71..516d0401adf 100644
--- a/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs
@@ -26,6 +26,7 @@ pub fn target() -> TargetResult {
             cpu: "generic".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "\01mcount".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs b/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs
index 44e2636e918..e2d55e9317b 100644
--- a/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs
@@ -19,6 +19,7 @@ pub fn target() -> TargetResult {
             cpu: "generic".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
+            target_mcount: "__mcount".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/i686_apple_darwin.rs b/src/librustc_target/spec/i686_apple_darwin.rs
index c8a61296d33..a82ff33ce1d 100644
--- a/src/librustc_target/spec/i686_apple_darwin.rs
+++ b/src/librustc_target/spec/i686_apple_darwin.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::apple_base::opts();
@@ -19,6 +19,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "apple".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "\01mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/i686_unknown_netbsd.rs b/src/librustc_target/spec/i686_unknown_netbsd.rs
index e8a9f29ea5f..99130e93dad 100644
--- a/src/librustc_target/spec/i686_unknown_netbsd.rs
+++ b/src/librustc_target/spec/i686_unknown_netbsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::netbsd_base::opts();
@@ -18,6 +18,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "__mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/mips64_unknown_linux_gnuabi64.rs b/src/librustc_target/spec/mips64_unknown_linux_gnuabi64.rs
index 3b38e64050f..b2ea8a6f388 100644
--- a/src/librustc_target/spec/mips64_unknown_linux_gnuabi64.rs
+++ b/src/librustc_target/spec/mips64_unknown_linux_gnuabi64.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips64r2".to_string(),
             features: "+mips64r2".to_string(),
             max_atomic_width: Some(64),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mips64el_unknown_linux_gnuabi64.rs b/src/librustc_target/spec/mips64el_unknown_linux_gnuabi64.rs
index 0f6cd86d616..48aea4a39b0 100644
--- a/src/librustc_target/spec/mips64el_unknown_linux_gnuabi64.rs
+++ b/src/librustc_target/spec/mips64el_unknown_linux_gnuabi64.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips64r2".to_string(),
             features: "+mips64r2".to_string(),
             max_atomic_width: Some(64),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mips_unknown_linux_gnu.rs b/src/librustc_target/spec/mips_unknown_linux_gnu.rs
index b4d29c5fbea..e360abdb38d 100644
--- a/src/librustc_target/spec/mips_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/mips_unknown_linux_gnu.rs
@@ -16,6 +16,7 @@ pub fn target() -> TargetResult {
             cpu: "mips32r2".to_string(),
             features: "+mips32r2,+fpxx,+nooddspreg".to_string(),
             max_atomic_width: Some(32),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mips_unknown_linux_musl.rs b/src/librustc_target/spec/mips_unknown_linux_musl.rs
index c56c6e38229..3f5428de950 100644
--- a/src/librustc_target/spec/mips_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/mips_unknown_linux_musl.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_musl_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: "musl".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/mips_unknown_linux_uclibc.rs b/src/librustc_target/spec/mips_unknown_linux_uclibc.rs
index cb02769c7df..8116b8c9cc8 100644
--- a/src/librustc_target/spec/mips_unknown_linux_uclibc.rs
+++ b/src/librustc_target/spec/mips_unknown_linux_uclibc.rs
@@ -16,6 +16,7 @@ pub fn target() -> TargetResult {
             cpu: "mips32r2".to_string(),
             features: "+mips32r2,+soft-float".to_string(),
             max_atomic_width: Some(32),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mipsel_unknown_linux_gnu.rs b/src/librustc_target/spec/mipsel_unknown_linux_gnu.rs
index ed49ddd4993..7e9d8cd942a 100644
--- a/src/librustc_target/spec/mipsel_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/mipsel_unknown_linux_gnu.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips32r2".to_string(),
             features: "+mips32r2,+fpxx,+nooddspreg".to_string(),
             max_atomic_width: Some(32),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mipsel_unknown_linux_musl.rs b/src/librustc_target/spec/mipsel_unknown_linux_musl.rs
index bcc49cf5ffe..56ad2940feb 100644
--- a/src/librustc_target/spec/mipsel_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/mipsel_unknown_linux_musl.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_musl_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: "musl".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/mipsel_unknown_linux_uclibc.rs b/src/librustc_target/spec/mipsel_unknown_linux_uclibc.rs
index 205f328a24c..a8152011efa 100644
--- a/src/librustc_target/spec/mipsel_unknown_linux_uclibc.rs
+++ b/src/librustc_target/spec/mipsel_unknown_linux_uclibc.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips32r2".to_string(),
             features: "+mips32r2,+soft-float".to_string(),
             max_atomic_width: Some(32),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mipsisa32r6_unknown_linux_gnu.rs b/src/librustc_target/spec/mipsisa32r6_unknown_linux_gnu.rs
index f4729145849..36b83c63fca 100644
--- a/src/librustc_target/spec/mipsisa32r6_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/mipsisa32r6_unknown_linux_gnu.rs
@@ -16,6 +16,7 @@ pub fn target() -> TargetResult {
             cpu: "mips32r6".to_string(),
             features: "+mips32r6".to_string(),
             max_atomic_width: Some(32),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mipsisa32r6el_unknown_linux_gnu.rs b/src/librustc_target/spec/mipsisa32r6el_unknown_linux_gnu.rs
index f4f98d33571..717ae3f1d20 100644
--- a/src/librustc_target/spec/mipsisa32r6el_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/mipsisa32r6el_unknown_linux_gnu.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips32r6".to_string(),
             features: "+mips32r6".to_string(),
             max_atomic_width: Some(32),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mipsisa64r6_unknown_linux_gnuabi64.rs b/src/librustc_target/spec/mipsisa64r6_unknown_linux_gnuabi64.rs
index 7faed3adc79..3f7d233e55f 100644
--- a/src/librustc_target/spec/mipsisa64r6_unknown_linux_gnuabi64.rs
+++ b/src/librustc_target/spec/mipsisa64r6_unknown_linux_gnuabi64.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips64r6".to_string(),
             features: "+mips64r6".to_string(),
             max_atomic_width: Some(64),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mipsisa64r6el_unknown_linux_gnuabi64.rs b/src/librustc_target/spec/mipsisa64r6el_unknown_linux_gnuabi64.rs
index 58a814a759e..4f41b8323a9 100644
--- a/src/librustc_target/spec/mipsisa64r6el_unknown_linux_gnuabi64.rs
+++ b/src/librustc_target/spec/mipsisa64r6el_unknown_linux_gnuabi64.rs
@@ -17,6 +17,7 @@ pub fn target() -> TargetResult {
             cpu: "mips64r6".to_string(),
             features: "+mips64r6".to_string(),
             max_atomic_width: Some(64),
+            target_mcount: "_mcount".to_string(),
 
             ..super::linux_base::opts()
         },
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index fdb1db645c3..7654d3932e3 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -759,7 +759,10 @@ pub struct TargetOptions {
     /// to opt out. The default is "aliases".
     ///
     /// Workaround for: https://github.com/rust-lang/rust/issues/57356
-    pub merge_functions: MergeFunctions
+    pub merge_functions: MergeFunctions,
+
+    /// Use platform dependent mcount function
+    pub target_mcount: String
 }
 
 impl Default for TargetOptions {
@@ -843,6 +846,7 @@ impl Default for TargetOptions {
             simd_types_indirect: true,
             override_export_symbols: None,
             merge_functions: MergeFunctions::Aliases,
+            target_mcount: "mcount".to_string(),
         }
     }
 }
@@ -1148,6 +1152,7 @@ impl Target {
         key!(simd_types_indirect, bool);
         key!(override_export_symbols, opt_list);
         key!(merge_functions, MergeFunctions)?;
+        key!(target_mcount);
 
         if let Some(array) = obj.find("abi-blacklist").and_then(Json::as_array) {
             for name in array.iter().filter_map(|abi| abi.as_string()) {
@@ -1362,6 +1367,7 @@ impl ToJson for Target {
         target_option_val!(simd_types_indirect);
         target_option_val!(override_export_symbols);
         target_option_val!(merge_functions);
+        target_option_val!(target_mcount);
 
         if default.abi_blacklist != self.options.abi_blacklist {
             d.insert("abi-blacklist".to_string(), self.options.abi_blacklist.iter()
diff --git a/src/librustc_target/spec/powerpc64_unknown_freebsd.rs b/src/librustc_target/spec/powerpc64_unknown_freebsd.rs
index 360876b9ff5..fc881db6b09 100644
--- a/src/librustc_target/spec/powerpc64_unknown_freebsd.rs
+++ b/src/librustc_target/spec/powerpc64_unknown_freebsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::freebsd_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc64_unknown_linux_gnu.rs b/src/librustc_target/spec/powerpc64_unknown_linux_gnu.rs
index c16db7583f3..89e68ab3062 100644
--- a/src/librustc_target/spec/powerpc64_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/powerpc64_unknown_linux_gnu.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult, RelroLevel};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult, RelroLevel};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_base::opts();
@@ -21,6 +21,9 @@ pub fn target() -> TargetResult {
         target_env: "gnu".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc64_unknown_linux_musl.rs b/src/librustc_target/spec/powerpc64_unknown_linux_musl.rs
index ac0b7431f91..be91dc44b93 100644
--- a/src/librustc_target/spec/powerpc64_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/powerpc64_unknown_linux_musl.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_musl_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: "musl".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc64le_unknown_linux_gnu.rs b/src/librustc_target/spec/powerpc64le_unknown_linux_gnu.rs
index 038b925a286..784e3b09094 100644
--- a/src/librustc_target/spec/powerpc64le_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/powerpc64le_unknown_linux_gnu.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: "gnu".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc64le_unknown_linux_musl.rs b/src/librustc_target/spec/powerpc64le_unknown_linux_musl.rs
index 57103345f0a..a3cf47fc5e0 100644
--- a/src/librustc_target/spec/powerpc64le_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/powerpc64le_unknown_linux_musl.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_musl_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: "musl".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc_unknown_linux_gnu.rs b/src/librustc_target/spec/powerpc_unknown_linux_gnu.rs
index 38a801d5ab5..ff52fbc179b 100644
--- a/src/librustc_target/spec/powerpc_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/powerpc_unknown_linux_gnu.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_base::opts();
@@ -16,6 +16,9 @@ pub fn target() -> TargetResult {
         target_env: "gnu".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc_unknown_linux_gnuspe.rs b/src/librustc_target/spec/powerpc_unknown_linux_gnuspe.rs
index 675b2c749d6..1868c42be39 100644
--- a/src/librustc_target/spec/powerpc_unknown_linux_gnuspe.rs
+++ b/src/librustc_target/spec/powerpc_unknown_linux_gnuspe.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_base::opts();
@@ -16,6 +16,9 @@ pub fn target() -> TargetResult {
         target_env: "gnu".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc_unknown_linux_musl.rs b/src/librustc_target/spec/powerpc_unknown_linux_musl.rs
index 240443aa98d..1ad2201092c 100644
--- a/src/librustc_target/spec/powerpc_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/powerpc_unknown_linux_musl.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::linux_musl_base::opts();
@@ -16,6 +16,9 @@ pub fn target() -> TargetResult {
         target_env: "musl".to_string(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "_mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/powerpc_unknown_netbsd.rs b/src/librustc_target/spec/powerpc_unknown_netbsd.rs
index 10e7089cf1c..6cc3a6c2ef3 100644
--- a/src/librustc_target/spec/powerpc_unknown_netbsd.rs
+++ b/src/librustc_target/spec/powerpc_unknown_netbsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::netbsd_base::opts();
@@ -16,6 +16,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "__mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/sparc64_unknown_netbsd.rs b/src/librustc_target/spec/sparc64_unknown_netbsd.rs
index 78d53e69e8b..09d1debef41 100644
--- a/src/librustc_target/spec/sparc64_unknown_netbsd.rs
+++ b/src/librustc_target/spec/sparc64_unknown_netbsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::netbsd_base::opts();
@@ -17,6 +17,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "__mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/x86_64_apple_darwin.rs b/src/librustc_target/spec/x86_64_apple_darwin.rs
index 0911ce06c13..fecc20c01c5 100644
--- a/src/librustc_target/spec/x86_64_apple_darwin.rs
+++ b/src/librustc_target/spec/x86_64_apple_darwin.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::apple_base::opts();
@@ -19,6 +19,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "apple".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "\01mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/x86_64_rumprun_netbsd.rs b/src/librustc_target/spec/x86_64_rumprun_netbsd.rs
index a2c706c4c72..f6861f2a687 100644
--- a/src/librustc_target/spec/x86_64_rumprun_netbsd.rs
+++ b/src/librustc_target/spec/x86_64_rumprun_netbsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::netbsd_base::opts();
@@ -24,6 +24,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "rumprun".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "__mcount".to_string(),
+            .. base
+        },
     })
 }
diff --git a/src/librustc_target/spec/x86_64_unknown_netbsd.rs b/src/librustc_target/spec/x86_64_unknown_netbsd.rs
index ffc4f1d5c49..6f4ab4995b5 100644
--- a/src/librustc_target/spec/x86_64_unknown_netbsd.rs
+++ b/src/librustc_target/spec/x86_64_unknown_netbsd.rs
@@ -1,4 +1,4 @@
-use crate::spec::{LinkerFlavor, Target, TargetResult};
+use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};
 
 pub fn target() -> TargetResult {
     let mut base = super::netbsd_base::opts();
@@ -18,6 +18,9 @@ pub fn target() -> TargetResult {
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
-        options: base,
+        options: TargetOptions {
+            target_mcount: "__mcount".to_string(),
+            .. base
+        },
     })
 }

From 3281248b88262687fcf34b2404cece968bcf837c Mon Sep 17 00:00:00 2001
From: Yuki OKUSHI <huyuumi.dev@gmail.com>
Date: Sat, 30 Mar 2019 18:50:34 +0900
Subject: [PATCH 3/6] Use target_mcount

---
 src/librustc_codegen_llvm/attributes.rs | 28 ++++---------------------
 1 file changed, 4 insertions(+), 24 deletions(-)

diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index e765b986d62..9aaad60cd6d 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -80,30 +80,10 @@ pub fn set_instrument_function(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
 
         // The function name varies on platforms.
         // See test/CodeGen/mcount.c in clang.
-        let mcount_name = if cfg!(target_os = "netbsd") {
-            const_cstr!("__mcount")
-        } else if cfg!(any(
-                target_arch = "mips", target_arch = "mips64",
-                target_arch = "powerpc", target_arch = "powerpc64")) {
-            const_cstr!("_mcount")
-        } else if cfg!(target_os = "darwin") {
-            const_cstr!("\01mcount")
-        } else if cfg!(target_arch = "aarch64")
-            && (cfg!(target_os = "linux")
-                || (cfg!(target_os = "unknown") && cfg!(target_env = "gnu")))
-        {
-            const_cstr!("\01_mcount")
-        } else if cfg!(target_arch = "arm")
-            && cfg!(any(target_os = "linux", target_os = "unknown"))
-        {
-            if cfg!(target_env = "gnu") {
-                const_cstr!("\01__gnu_mcount_nc")
-            } else {
-                const_cstr!("\01mcount")
-            }
-        } else {
-            const_cstr!("mcount")
-        };
+        use std::ffi::CStr;
+        let target_mcount = format!("{}{}",
+            &cx.sess().target.target.options.target_mcount, "\0");
+        let mcount_name = CStr::from_bytes_with_nul(target_mcount.as_bytes()).unwrap();
 
         llvm::AddFunctionAttrStringValue(
             llfn, llvm::AttributePlace::Function,

From 77774e4e960e6b65ddb95b087772c6d2ad6c3009 Mon Sep 17 00:00:00 2001
From: Yuki OKUSHI <huyuumi.dev@gmail.com>
Date: Sat, 30 Mar 2019 21:37:02 +0900
Subject: [PATCH 4/6] Use CString

---
 src/librustc_codegen_llvm/attributes.rs | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/librustc_codegen_llvm/attributes.rs b/src/librustc_codegen_llvm/attributes.rs
index 9aaad60cd6d..77fa34e74dd 100644
--- a/src/librustc_codegen_llvm/attributes.rs
+++ b/src/librustc_codegen_llvm/attributes.rs
@@ -80,14 +80,12 @@ pub fn set_instrument_function(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
 
         // The function name varies on platforms.
         // See test/CodeGen/mcount.c in clang.
-        use std::ffi::CStr;
-        let target_mcount = format!("{}{}",
-            &cx.sess().target.target.options.target_mcount, "\0");
-        let mcount_name = CStr::from_bytes_with_nul(target_mcount.as_bytes()).unwrap();
+        let mcount_name = CString::new(
+            cx.sess().target.target.options.target_mcount.as_str().as_bytes()).unwrap();
 
         llvm::AddFunctionAttrStringValue(
             llfn, llvm::AttributePlace::Function,
-            const_cstr!("instrument-function-entry-inlined"), mcount_name);
+            const_cstr!("instrument-function-entry-inlined"), &mcount_name);
     }
 }
 

From aec518addd7ab4624ccd57ea143395483dfc690a Mon Sep 17 00:00:00 2001
From: Yuki OKUSHI <huyuumi.dev@gmail.com>
Date: Sun, 31 Mar 2019 07:13:59 +0900
Subject: [PATCH 5/6] Fix test

---
 src/test/codegen/instrument-mcount.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/test/codegen/instrument-mcount.rs b/src/test/codegen/instrument-mcount.rs
index bd01556d986..c72d09f7a03 100644
--- a/src/test/codegen/instrument-mcount.rs
+++ b/src/test/codegen/instrument-mcount.rs
@@ -3,5 +3,5 @@
 
 #![crate_type = "lib"]
 
-// CHECK: attributes #{{.*}} "instrument-function-entry-inlined"="{{_*}}mcount" "no-frame-pointer-elim"="true"
+// CHECK: attributes #{{.*}} "instrument-function-entry-inlined"="{{.*}}mcount{{.*}}" "no-frame-pointer-elim"="true"
 pub fn foo() {}

From 7b26a43ae51fdb3c2ec7a3407e91add212c5754e Mon Sep 17 00:00:00 2001
From: Yuki OKUSHI <huyuumi.dev@gmail.com>
Date: Sun, 31 Mar 2019 23:17:49 +0900
Subject: [PATCH 6/6] Use `u{1}` instead of `01`

---
 src/librustc_target/spec/aarch64_unknown_linux_gnu.rs      | 2 +-
 src/librustc_target/spec/aarch64_unknown_linux_musl.rs     | 2 +-
 src/librustc_target/spec/arm_unknown_linux_gnueabi.rs      | 2 +-
 src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs    | 2 +-
 src/librustc_target/spec/arm_unknown_linux_musleabi.rs     | 2 +-
 src/librustc_target/spec/arm_unknown_linux_musleabihf.rs   | 2 +-
 src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs   | 2 +-
 src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs  | 2 +-
 src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs | 2 +-
 src/librustc_target/spec/armv6_unknown_freebsd.rs          | 2 +-
 src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs  | 2 +-
 src/librustc_target/spec/armv7_unknown_freebsd.rs          | 2 +-
 src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs  | 2 +-
 src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs | 2 +-
 src/librustc_target/spec/i686_apple_darwin.rs              | 2 +-
 src/librustc_target/spec/x86_64_apple_darwin.rs            | 2 +-
 16 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs b/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs
index 59a28573641..b9d36c09f16 100644
--- a/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs
+++ b/src/librustc_target/spec/aarch64_unknown_linux_gnu.rs
@@ -17,7 +17,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01_mcount".to_string(),
+            target_mcount: "\u{1}_mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/aarch64_unknown_linux_musl.rs b/src/librustc_target/spec/aarch64_unknown_linux_musl.rs
index 781b1322f5a..968e82ca39f 100644
--- a/src/librustc_target/spec/aarch64_unknown_linux_musl.rs
+++ b/src/librustc_target/spec/aarch64_unknown_linux_musl.rs
@@ -17,7 +17,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01_mcount".to_string(),
+            target_mcount: "\u{1}_mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs b/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs
index 1173d18634e..2f835420148 100644
--- a/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_gnueabi.rs
@@ -18,7 +18,7 @@ pub fn target() -> TargetResult {
         options: TargetOptions {
             features: "+strict-align,+v6".to_string(),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs b/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs
index 6fc7c46be3b..cd4b2e1c922 100644
--- a/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_gnueabihf.rs
@@ -18,7 +18,7 @@ pub fn target() -> TargetResult {
         options: TargetOptions {
             features: "+strict-align,+v6,+vfp2".to_string(),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_musleabi.rs b/src/librustc_target/spec/arm_unknown_linux_musleabi.rs
index 7a2a4e85e4a..606c3f19060 100644
--- a/src/librustc_target/spec/arm_unknown_linux_musleabi.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_musleabi.rs
@@ -23,7 +23,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs b/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs
index b7aa1952cb0..d22156bc328 100644
--- a/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs
+++ b/src/librustc_target/spec/arm_unknown_linux_musleabihf.rs
@@ -23,7 +23,7 @@ pub fn target() -> TargetResult {
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs b/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs
index 59c15f1610d..e7da24843cc 100644
--- a/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs
+++ b/src/librustc_target/spec/armv4t_unknown_linux_gnueabi.rs
@@ -19,7 +19,7 @@ pub fn target() -> TargetResult {
             // Atomic operations provided by compiler-builtins
             max_atomic_width: Some(32),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs b/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs
index a1a61a69d05..ea586f42c26 100644
--- a/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs
+++ b/src/librustc_target/spec/armv5te_unknown_linux_gnueabi.rs
@@ -19,7 +19,7 @@ pub fn target() -> TargetResult {
             // Atomic operations provided by compiler-builtins
             max_atomic_width: Some(32),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs b/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs
index 9b44a54715e..dae5c8c3d75 100644
--- a/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs
+++ b/src/librustc_target/spec/armv5te_unknown_linux_musleabi.rs
@@ -22,7 +22,7 @@ pub fn target() -> TargetResult {
             // Atomic operations provided by compiler-builtins
             max_atomic_width: Some(32),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv6_unknown_freebsd.rs b/src/librustc_target/spec/armv6_unknown_freebsd.rs
index e706c8281d2..a90590a39e7 100644
--- a/src/librustc_target/spec/armv6_unknown_freebsd.rs
+++ b/src/librustc_target/spec/armv6_unknown_freebsd.rs
@@ -18,7 +18,7 @@ pub fn target() -> TargetResult {
             features: "+v6,+vfp2".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs b/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs
index 70d4985ab86..c03f4b544ed 100644
--- a/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_cloudabi_eabihf.rs
@@ -20,7 +20,7 @@ pub fn target() -> TargetResult {
         target_vendor: "unknown".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/armv7_unknown_freebsd.rs b/src/librustc_target/spec/armv7_unknown_freebsd.rs
index 0f9ee5d44a9..ca7ab474bef 100644
--- a/src/librustc_target/spec/armv7_unknown_freebsd.rs
+++ b/src/librustc_target/spec/armv7_unknown_freebsd.rs
@@ -18,7 +18,7 @@ pub fn target() -> TargetResult {
             features: "+v7,+vfp3,+d16,+thumb2,-neon".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs b/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs
index afba6f608ee..f0952cccb20 100644
--- a/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_linux_gnueabihf.rs
@@ -23,7 +23,7 @@ pub fn target() -> TargetResult {
             cpu: "generic".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01__gnu_mcount_nc".to_string(),
+            target_mcount: "\u{1}__gnu_mcount_nc".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs b/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs
index 516d0401adf..a9974f6b80c 100644
--- a/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs
+++ b/src/librustc_target/spec/armv7_unknown_linux_musleabihf.rs
@@ -26,7 +26,7 @@ pub fn target() -> TargetResult {
             cpu: "generic".to_string(),
             max_atomic_width: Some(64),
             abi_blacklist: super::arm_base::abi_blacklist(),
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         }
     })
diff --git a/src/librustc_target/spec/i686_apple_darwin.rs b/src/librustc_target/spec/i686_apple_darwin.rs
index a82ff33ce1d..58c59cc8728 100644
--- a/src/librustc_target/spec/i686_apple_darwin.rs
+++ b/src/librustc_target/spec/i686_apple_darwin.rs
@@ -20,7 +20,7 @@ pub fn target() -> TargetResult {
         target_vendor: "apple".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         },
     })
diff --git a/src/librustc_target/spec/x86_64_apple_darwin.rs b/src/librustc_target/spec/x86_64_apple_darwin.rs
index fecc20c01c5..c54181741b3 100644
--- a/src/librustc_target/spec/x86_64_apple_darwin.rs
+++ b/src/librustc_target/spec/x86_64_apple_darwin.rs
@@ -20,7 +20,7 @@ pub fn target() -> TargetResult {
         target_vendor: "apple".to_string(),
         linker_flavor: LinkerFlavor::Gcc,
         options: TargetOptions {
-            target_mcount: "\01mcount".to_string(),
+            target_mcount: "\u{1}mcount".to_string(),
             .. base
         },
     })