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: https://github.com/namhyung/uftrace/issues/1764 This commit replaces the mcount name from native function to the LLVM intrinsic so that the transform pass can handle it. Signed-off-by: ChoKyuWon <kyuwoncho18@gmail.com>
This commit is contained in:
parent
ec362f0ae8
commit
3bd54c14bc
@ -128,7 +128,10 @@ fn instrument_function_attr<'ll>(cx: &CodegenCx<'ll, '_>) -> SmallVec<[&'ll Attr
|
|||||||
|
|
||||||
// The function name varies on platforms.
|
// The function name varies on platforms.
|
||||||
// See test/CodeGen/mcount.c in clang.
|
// See test/CodeGen/mcount.c in clang.
|
||||||
let mcount_name = cx.sess().target.mcount.as_ref();
|
let mcount_name = match &cx.sess().target.llvm_mcount_intrinsic {
|
||||||
|
Some(llvm_mcount_intrinsic) => llvm_mcount_intrinsic.as_ref(),
|
||||||
|
None => cx.sess().target.mcount.as_ref(),
|
||||||
|
};
|
||||||
|
|
||||||
attrs.push(llvm::CreateAttrStringValue(
|
attrs.push(llvm::CreateAttrStringValue(
|
||||||
cx.llcx,
|
cx.llcx,
|
||||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
|||||||
features: "+strict-align,+v6".into(),
|
features: "+strict-align,+v6".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
mcount: "\u{1}__gnu_mcount_nc".into(),
|
mcount: "\u{1}__gnu_mcount_nc".into(),
|
||||||
|
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
|
||||||
..super::linux_gnu_base::opts()
|
..super::linux_gnu_base::opts()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ pub fn target() -> Target {
|
|||||||
features: "+strict-align,+v6,+vfp2,-d32".into(),
|
features: "+strict-align,+v6,+vfp2,-d32".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
mcount: "\u{1}__gnu_mcount_nc".into(),
|
mcount: "\u{1}__gnu_mcount_nc".into(),
|
||||||
|
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
|
||||||
..super::linux_gnu_base::opts()
|
..super::linux_gnu_base::opts()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ pub fn target() -> Target {
|
|||||||
endian: Endian::Big,
|
endian: Endian::Big,
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
mcount: "\u{1}__gnu_mcount_nc".into(),
|
mcount: "\u{1}__gnu_mcount_nc".into(),
|
||||||
|
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
|
||||||
..super::linux_gnu_base::opts()
|
..super::linux_gnu_base::opts()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ pub fn target() -> Target {
|
|||||||
// Atomic operations provided by compiler-builtins
|
// Atomic operations provided by compiler-builtins
|
||||||
max_atomic_width: Some(32),
|
max_atomic_width: Some(32),
|
||||||
mcount: "\u{1}__gnu_mcount_nc".into(),
|
mcount: "\u{1}__gnu_mcount_nc".into(),
|
||||||
|
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
|
||||||
has_thumb_interworking: true,
|
has_thumb_interworking: true,
|
||||||
..super::linux_gnu_base::opts()
|
..super::linux_gnu_base::opts()
|
||||||
},
|
},
|
||||||
|
@ -13,6 +13,7 @@ pub fn target() -> Target {
|
|||||||
features: "+v6,+vfp2,-d32".into(),
|
features: "+v6,+vfp2,-d32".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
mcount: "\u{1}__gnu_mcount_nc".into(),
|
mcount: "\u{1}__gnu_mcount_nc".into(),
|
||||||
|
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
|
||||||
..super::freebsd_base::opts()
|
..super::freebsd_base::opts()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ pub fn target() -> Target {
|
|||||||
features: "+v7,+thumb2,+soft-float,-neon".into(),
|
features: "+v7,+thumb2,+soft-float,-neon".into(),
|
||||||
max_atomic_width: Some(64),
|
max_atomic_width: Some(64),
|
||||||
mcount: "\u{1}__gnu_mcount_nc".into(),
|
mcount: "\u{1}__gnu_mcount_nc".into(),
|
||||||
|
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
|
||||||
..super::linux_gnu_base::opts()
|
..super::linux_gnu_base::opts()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -1912,6 +1912,9 @@ pub struct TargetOptions {
|
|||||||
/// Use platform dependent mcount function
|
/// Use platform dependent mcount function
|
||||||
pub mcount: StaticCow<str>,
|
pub mcount: StaticCow<str>,
|
||||||
|
|
||||||
|
/// Use LLVM intrinsic for mcount function name
|
||||||
|
pub llvm_mcount_intrinsic: Option<StaticCow<str>>,
|
||||||
|
|
||||||
/// LLVM ABI name, corresponds to the '-mabi' parameter available in multilib C compilers
|
/// LLVM ABI name, corresponds to the '-mabi' parameter available in multilib C compilers
|
||||||
pub llvm_abiname: StaticCow<str>,
|
pub llvm_abiname: StaticCow<str>,
|
||||||
|
|
||||||
@ -2173,6 +2176,7 @@ impl Default for TargetOptions {
|
|||||||
override_export_symbols: None,
|
override_export_symbols: None,
|
||||||
merge_functions: MergeFunctions::Aliases,
|
merge_functions: MergeFunctions::Aliases,
|
||||||
mcount: "mcount".into(),
|
mcount: "mcount".into(),
|
||||||
|
llvm_mcount_intrinsic: None,
|
||||||
llvm_abiname: "".into(),
|
llvm_abiname: "".into(),
|
||||||
relax_elf_relocations: false,
|
relax_elf_relocations: false,
|
||||||
llvm_args: cvs![],
|
llvm_args: cvs![],
|
||||||
@ -2829,6 +2833,7 @@ impl Target {
|
|||||||
key!(override_export_symbols, opt_list);
|
key!(override_export_symbols, opt_list);
|
||||||
key!(merge_functions, MergeFunctions)?;
|
key!(merge_functions, MergeFunctions)?;
|
||||||
key!(mcount = "target-mcount");
|
key!(mcount = "target-mcount");
|
||||||
|
key!(llvm_mcount_intrinsic, optional);
|
||||||
key!(llvm_abiname);
|
key!(llvm_abiname);
|
||||||
key!(relax_elf_relocations, bool);
|
key!(relax_elf_relocations, bool);
|
||||||
key!(llvm_args, list);
|
key!(llvm_args, list);
|
||||||
@ -3085,6 +3090,7 @@ impl ToJson for Target {
|
|||||||
target_option_val!(override_export_symbols);
|
target_option_val!(override_export_symbols);
|
||||||
target_option_val!(merge_functions);
|
target_option_val!(merge_functions);
|
||||||
target_option_val!(mcount, "target-mcount");
|
target_option_val!(mcount, "target-mcount");
|
||||||
|
target_option_val!(llvm_mcount_intrinsic);
|
||||||
target_option_val!(llvm_abiname);
|
target_option_val!(llvm_abiname);
|
||||||
target_option_val!(relax_elf_relocations);
|
target_option_val!(relax_elf_relocations);
|
||||||
target_option_val!(llvm_args);
|
target_option_val!(llvm_args);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user