coverage: Emit MC/DC intrinsics using the normal helper method
This commit is contained in:
parent
4923e856be
commit
b3d65852c3
@ -1654,40 +1654,21 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
|
|||||||
///
|
///
|
||||||
/// [`CodeGenPGO::emitMCDCParameters`]:
|
/// [`CodeGenPGO::emitMCDCParameters`]:
|
||||||
/// https://github.com/rust-lang/llvm-project/blob/5399a24/clang/lib/CodeGen/CodeGenPGO.cpp#L1124
|
/// https://github.com/rust-lang/llvm-project/blob/5399a24/clang/lib/CodeGen/CodeGenPGO.cpp#L1124
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
pub(crate) fn mcdc_parameters(
|
pub(crate) fn mcdc_parameters(
|
||||||
&mut self,
|
&mut self,
|
||||||
fn_name: &'ll Value,
|
fn_name: &'ll Value,
|
||||||
hash: &'ll Value,
|
hash: &'ll Value,
|
||||||
bitmap_bits: &'ll Value,
|
bitmap_bits: &'ll Value,
|
||||||
) {
|
) {
|
||||||
debug!("mcdc_parameters() with args ({:?}, {:?}, {:?})", fn_name, hash, bitmap_bits);
|
|
||||||
|
|
||||||
assert!(
|
assert!(
|
||||||
crate::llvm_util::get_version() >= (19, 0, 0),
|
crate::llvm_util::get_version() >= (19, 0, 0),
|
||||||
"MCDC intrinsics require LLVM 19 or later"
|
"MCDC intrinsics require LLVM 19 or later"
|
||||||
);
|
);
|
||||||
|
self.call_intrinsic("llvm.instrprof.mcdc.parameters", &[fn_name, hash, bitmap_bits]);
|
||||||
let llfn = unsafe { llvm::LLVMRustGetInstrProfMCDCParametersIntrinsic(self.cx().llmod) };
|
|
||||||
let llty = self.cx.type_func(
|
|
||||||
&[self.cx.type_ptr(), self.cx.type_i64(), self.cx.type_i32()],
|
|
||||||
self.cx.type_void(),
|
|
||||||
);
|
|
||||||
let args = &[fn_name, hash, bitmap_bits];
|
|
||||||
let args = self.check_call("call", llty, llfn, args);
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let _ = llvm::LLVMRustBuildCall(
|
|
||||||
self.llbuilder,
|
|
||||||
llty,
|
|
||||||
llfn,
|
|
||||||
args.as_ptr() as *const &llvm::Value,
|
|
||||||
args.len() as c_uint,
|
|
||||||
[].as_ptr(),
|
|
||||||
0 as c_uint,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
pub(crate) fn mcdc_tvbitmap_update(
|
pub(crate) fn mcdc_tvbitmap_update(
|
||||||
&mut self,
|
&mut self,
|
||||||
fn_name: &'ll Value,
|
fn_name: &'ll Value,
|
||||||
@ -1695,39 +1676,21 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
|
|||||||
bitmap_index: &'ll Value,
|
bitmap_index: &'ll Value,
|
||||||
mcdc_temp: &'ll Value,
|
mcdc_temp: &'ll Value,
|
||||||
) {
|
) {
|
||||||
debug!(
|
|
||||||
"mcdc_tvbitmap_update() with args ({:?}, {:?}, {:?}, {:?})",
|
|
||||||
fn_name, hash, bitmap_index, mcdc_temp
|
|
||||||
);
|
|
||||||
assert!(
|
assert!(
|
||||||
crate::llvm_util::get_version() >= (19, 0, 0),
|
crate::llvm_util::get_version() >= (19, 0, 0),
|
||||||
"MCDC intrinsics require LLVM 19 or later"
|
"MCDC intrinsics require LLVM 19 or later"
|
||||||
);
|
);
|
||||||
|
|
||||||
let llfn =
|
|
||||||
unsafe { llvm::LLVMRustGetInstrProfMCDCTVBitmapUpdateIntrinsic(self.cx().llmod) };
|
|
||||||
let llty = self.cx.type_func(
|
|
||||||
&[self.cx.type_ptr(), self.cx.type_i64(), self.cx.type_i32(), self.cx.type_ptr()],
|
|
||||||
self.cx.type_void(),
|
|
||||||
);
|
|
||||||
let args = &[fn_name, hash, bitmap_index, mcdc_temp];
|
let args = &[fn_name, hash, bitmap_index, mcdc_temp];
|
||||||
let args = self.check_call("call", llty, llfn, args);
|
self.call_intrinsic("llvm.instrprof.mcdc.tvbitmap.update", args);
|
||||||
unsafe {
|
}
|
||||||
let _ = llvm::LLVMRustBuildCall(
|
|
||||||
self.llbuilder,
|
#[instrument(level = "debug", skip(self))]
|
||||||
llty,
|
pub(crate) fn mcdc_condbitmap_reset(&mut self, mcdc_temp: &'ll Value) {
|
||||||
llfn,
|
|
||||||
args.as_ptr() as *const &llvm::Value,
|
|
||||||
args.len() as c_uint,
|
|
||||||
[].as_ptr(),
|
|
||||||
0 as c_uint,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
self.store(self.const_i32(0), mcdc_temp, self.tcx.data_layout.i32_align.abi);
|
self.store(self.const_i32(0), mcdc_temp, self.tcx.data_layout.i32_align.abi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(self))]
|
||||||
pub(crate) fn mcdc_condbitmap_update(&mut self, cond_index: &'ll Value, mcdc_temp: &'ll Value) {
|
pub(crate) fn mcdc_condbitmap_update(&mut self, cond_index: &'ll Value, mcdc_temp: &'ll Value) {
|
||||||
debug!("mcdc_condbitmap_update() with args ({:?}, {:?})", cond_index, mcdc_temp);
|
|
||||||
assert!(
|
assert!(
|
||||||
crate::llvm_util::get_version() >= (19, 0, 0),
|
crate::llvm_util::get_version() >= (19, 0, 0),
|
||||||
"MCDC intrinsics require LLVM 19 or later"
|
"MCDC intrinsics require LLVM 19 or later"
|
||||||
|
@ -1099,6 +1099,10 @@ impl<'ll> CodegenCx<'ll, '_> {
|
|||||||
|
|
||||||
if self.sess().instrument_coverage() {
|
if self.sess().instrument_coverage() {
|
||||||
ifn!("llvm.instrprof.increment", fn(ptr, t_i64, t_i32, t_i32) -> void);
|
ifn!("llvm.instrprof.increment", fn(ptr, t_i64, t_i32, t_i32) -> void);
|
||||||
|
if crate::llvm_util::get_version() >= (19, 0, 0) {
|
||||||
|
ifn!("llvm.instrprof.mcdc.parameters", fn(ptr, t_i64, t_i32) -> void);
|
||||||
|
ifn!("llvm.instrprof.mcdc.tvbitmap.update", fn(ptr, t_i64, t_i32, ptr) -> void);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ifn!("llvm.type.test", fn(ptr, t_metadata) -> i1);
|
ifn!("llvm.type.test", fn(ptr, t_metadata) -> i1);
|
||||||
|
@ -208,6 +208,7 @@ impl<'tcx> CoverageInfoBuilderMethods<'tcx> for Builder<'_, '_, 'tcx> {
|
|||||||
let hash = bx.const_u64(function_coverage_info.function_source_hash);
|
let hash = bx.const_u64(function_coverage_info.function_source_hash);
|
||||||
let bitmap_index = bx.const_u32(bitmap_idx);
|
let bitmap_index = bx.const_u32(bitmap_idx);
|
||||||
bx.mcdc_tvbitmap_update(fn_name, hash, bitmap_index, cond_bitmap);
|
bx.mcdc_tvbitmap_update(fn_name, hash, bitmap_index, cond_bitmap);
|
||||||
|
bx.mcdc_condbitmap_reset(cond_bitmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1615,9 +1615,6 @@ unsafe extern "C" {
|
|||||||
pub fn LLVMRustSetAllowReassoc(Instr: &Value);
|
pub fn LLVMRustSetAllowReassoc(Instr: &Value);
|
||||||
|
|
||||||
// Miscellaneous instructions
|
// Miscellaneous instructions
|
||||||
pub fn LLVMRustGetInstrProfMCDCParametersIntrinsic(M: &Module) -> &Value;
|
|
||||||
pub fn LLVMRustGetInstrProfMCDCTVBitmapUpdateIntrinsic(M: &Module) -> &Value;
|
|
||||||
|
|
||||||
pub fn LLVMRustBuildCall<'a>(
|
pub fn LLVMRustBuildCall<'a>(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
Ty: &'a Type,
|
Ty: &'a Type,
|
||||||
|
@ -1531,34 +1531,6 @@ extern "C" LLVMValueRef LLVMRustBuildCall(LLVMBuilderRef B, LLVMTypeRef Ty,
|
|||||||
ArrayRef<OperandBundleDef>(OpBundles)));
|
ArrayRef<OperandBundleDef>(OpBundles)));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" LLVMValueRef
|
|
||||||
LLVMRustGetInstrProfMCDCParametersIntrinsic(LLVMModuleRef M) {
|
|
||||||
#if LLVM_VERSION_LT(19, 0)
|
|
||||||
report_fatal_error("LLVM 19.0 is required for mcdc intrinsic functions");
|
|
||||||
#endif
|
|
||||||
#if LLVM_VERSION_GE(20, 0)
|
|
||||||
return wrap(llvm::Intrinsic::getOrInsertDeclaration(
|
|
||||||
unwrap(M), llvm::Intrinsic::instrprof_mcdc_parameters));
|
|
||||||
#else
|
|
||||||
return wrap(llvm::Intrinsic::getDeclaration(
|
|
||||||
unwrap(M), llvm::Intrinsic::instrprof_mcdc_parameters));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef
|
|
||||||
LLVMRustGetInstrProfMCDCTVBitmapUpdateIntrinsic(LLVMModuleRef M) {
|
|
||||||
#if LLVM_VERSION_LT(19, 0)
|
|
||||||
report_fatal_error("LLVM 19.0 is required for mcdc intrinsic functions");
|
|
||||||
#endif
|
|
||||||
#if LLVM_VERSION_GE(20, 0)
|
|
||||||
return wrap(llvm::Intrinsic::getOrInsertDeclaration(
|
|
||||||
unwrap(M), llvm::Intrinsic::instrprof_mcdc_tvbitmap_update));
|
|
||||||
#else
|
|
||||||
return wrap(llvm::Intrinsic::getDeclaration(
|
|
||||||
unwrap(M), llvm::Intrinsic::instrprof_mcdc_tvbitmap_update));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst,
|
extern "C" LLVMValueRef LLVMRustBuildMemCpy(LLVMBuilderRef B, LLVMValueRef Dst,
|
||||||
unsigned DstAlign, LLVMValueRef Src,
|
unsigned DstAlign, LLVMValueRef Src,
|
||||||
unsigned SrcAlign,
|
unsigned SrcAlign,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user