Skip to content

Commit 2ceed0b

Browse files
committed
Auto merge of #113814 - ChoKyuWon:master, r=davidtwco
Replace the \01__gnu_mcount_nc to LLVM intrinsic for ARM Current `-Zinstrument-mcount` for ARM32 use the `\01__gnu_mcount_nc` directly for its instrumentation function. However, the LLVM does not use this mcount function directly, but it wraps it to intrinsic, `llvm.arm.gnu.eabi.mcount` and the transform pass also only handle the intrinsic. As a result, current `-Zinstrument-mcount` not work on ARM32. Refer: namhyung/uftrace#1764 This commit replaces the mcount name from native function to the LLVM intrinsic so that the transform pass can handle it.
2 parents b9177c0 + 3bd54c1 commit 2ceed0b

8 files changed

+16
-1
lines changed

compiler/rustc_codegen_llvm/src/attributes.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> SmallVec<[&'ll Attr
128128

129129
// The function name varies on platforms.
130130
// See test/CodeGen/mcount.c in clang.
131-
let mcount_name = cx.sess().target.mcount.as_ref();
131+
let mcount_name = match &cx.sess().target.llvm_mcount_intrinsic {
132+
Some(llvm_mcount_intrinsic) => llvm_mcount_intrinsic.as_ref(),
133+
None => cx.sess().target.mcount.as_ref(),
134+
};
132135

133136
attrs.push(llvm::CreateAttrStringValue(
134137
cx.llcx,

compiler/rustc_target/src/spec/arm_unknown_linux_gnueabi.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub fn target() -> Target {
1111
features: "+strict-align,+v6".into(),
1212
max_atomic_width: Some(64),
1313
mcount: "\u{1}__gnu_mcount_nc".into(),
14+
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
1415
..super::linux_gnu_base::opts()
1516
},
1617
}

compiler/rustc_target/src/spec/arm_unknown_linux_gnueabihf.rs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub fn target() -> Target {
1111
features: "+strict-align,+v6,+vfp2,-d32".into(),
1212
max_atomic_width: Some(64),
1313
mcount: "\u{1}__gnu_mcount_nc".into(),
14+
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
1415
..super::linux_gnu_base::opts()
1516
},
1617
}

compiler/rustc_target/src/spec/armeb_unknown_linux_gnueabi.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub fn target() -> Target {
1313
endian: Endian::Big,
1414
max_atomic_width: Some(64),
1515
mcount: "\u{1}__gnu_mcount_nc".into(),
16+
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
1617
..super::linux_gnu_base::opts()
1718
},
1819
}

compiler/rustc_target/src/spec/armv4t_unknown_linux_gnueabi.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub fn target() -> Target {
1212
// Atomic operations provided by compiler-builtins
1313
max_atomic_width: Some(32),
1414
mcount: "\u{1}__gnu_mcount_nc".into(),
15+
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
1516
has_thumb_interworking: true,
1617
..super::linux_gnu_base::opts()
1718
},

compiler/rustc_target/src/spec/armv6_unknown_freebsd.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub fn target() -> Target {
1313
features: "+v6,+vfp2,-d32".into(),
1414
max_atomic_width: Some(64),
1515
mcount: "\u{1}__gnu_mcount_nc".into(),
16+
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
1617
..super::freebsd_base::opts()
1718
},
1819
}

compiler/rustc_target/src/spec/armv7_unknown_linux_gnueabi.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub fn target() -> Target {
1414
features: "+v7,+thumb2,+soft-float,-neon".into(),
1515
max_atomic_width: Some(64),
1616
mcount: "\u{1}__gnu_mcount_nc".into(),
17+
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
1718
..super::linux_gnu_base::opts()
1819
},
1920
}

compiler/rustc_target/src/spec/mod.rs

+6
Original file line numberDiff line numberDiff line change
@@ -1922,6 +1922,9 @@ pub struct TargetOptions {
19221922
/// Use platform dependent mcount function
19231923
pub mcount: StaticCow<str>,
19241924

1925+
/// Use LLVM intrinsic for mcount function name
1926+
pub llvm_mcount_intrinsic: Option<StaticCow<str>>,
1927+
19251928
/// LLVM ABI name, corresponds to the '-mabi' parameter available in multilib C compilers
19261929
pub llvm_abiname: StaticCow<str>,
19271930

@@ -2183,6 +2186,7 @@ impl Default for TargetOptions {
21832186
override_export_symbols: None,
21842187
merge_functions: MergeFunctions::Aliases,
21852188
mcount: "mcount".into(),
2189+
llvm_mcount_intrinsic: None,
21862190
llvm_abiname: "".into(),
21872191
relax_elf_relocations: false,
21882192
llvm_args: cvs![],
@@ -2840,6 +2844,7 @@ impl Target {
28402844
key!(override_export_symbols, opt_list);
28412845
key!(merge_functions, MergeFunctions)?;
28422846
key!(mcount = "target-mcount");
2847+
key!(llvm_mcount_intrinsic, optional);
28432848
key!(llvm_abiname);
28442849
key!(relax_elf_relocations, bool);
28452850
key!(llvm_args, list);
@@ -3096,6 +3101,7 @@ impl ToJson for Target {
30963101
target_option_val!(override_export_symbols);
30973102
target_option_val!(merge_functions);
30983103
target_option_val!(mcount, "target-mcount");
3104+
target_option_val!(llvm_mcount_intrinsic);
30993105
target_option_val!(llvm_abiname);
31003106
target_option_val!(relax_elf_relocations);
31013107
target_option_val!(llvm_args);

0 commit comments

Comments
 (0)