11use std:: cell:: RefCell ;
2+ use std:: ffi:: CString ;
23
34use libc:: c_uint;
45use rustc_codegen_ssa:: traits:: {
@@ -12,6 +13,7 @@ use rustc_middle::mir::coverage::CoverageKind;
1213use rustc_middle:: ty:: Instance ;
1314use rustc_middle:: ty:: layout:: HasTyCtxt ;
1415use rustc_target:: abi:: { Align , Size } ;
16+ use rustc_target:: spec:: HasTargetSpec ;
1517use tracing:: { debug, instrument} ;
1618
1719use crate :: builder:: Builder ;
@@ -284,10 +286,10 @@ pub(crate) fn save_cov_data_to_mod<'ll, 'tcx>(
284286 cx : & CodegenCx < ' ll , ' tcx > ,
285287 cov_data_val : & ' ll llvm:: Value ,
286288) {
287- let covmap_var_name = llvm:: build_string ( |s| unsafe {
289+ let covmap_var_name = CString :: new ( llvm:: build_byte_buffer ( |s| unsafe {
288290 llvm:: LLVMRustCoverageWriteMappingVarNameToString ( s) ;
289- } )
290- . expect ( "Rust Coverage Mapping var name failed UTF-8 conversion" ) ;
291+ } ) )
292+ . unwrap ( ) ;
291293 debug ! ( "covmap var name: {:?}" , covmap_var_name) ;
292294
293295 let covmap_section_name = llvm:: build_string ( |s| unsafe {
@@ -322,7 +324,8 @@ pub(crate) fn save_func_record_to_mod<'ll, 'tcx>(
322324 // of descriptions play distinct roles in LLVM IR; therefore, assign them different names (by
323325 // appending "u" to the end of the function record var name, to prevent `linkonce_odr` merging.
324326 let func_record_var_name =
325- format ! ( "__covrec_{:X}{}" , func_name_hash, if is_used { "u" } else { "" } ) ;
327+ CString :: new ( format ! ( "__covrec_{:X}{}" , func_name_hash, if is_used { "u" } else { "" } ) )
328+ . unwrap ( ) ;
326329 debug ! ( "function record var name: {:?}" , func_record_var_name) ;
327330 debug ! ( "function record section name: {:?}" , covfun_section_name) ;
328331
@@ -334,7 +337,9 @@ pub(crate) fn save_func_record_to_mod<'ll, 'tcx>(
334337 llvm:: set_section ( llglobal, covfun_section_name) ;
335338 // LLVM's coverage mapping format specifies 8-byte alignment for items in this section.
336339 llvm:: set_alignment ( llglobal, Align :: EIGHT ) ;
337- llvm:: set_comdat ( cx. llmod , llglobal, & func_record_var_name) ;
340+ if cx. target_spec ( ) . supports_comdat ( ) {
341+ llvm:: set_comdat ( cx. llmod , llglobal, & func_record_var_name) ;
342+ }
338343 cx. add_used_global ( llglobal) ;
339344}
340345
0 commit comments