@@ -75,9 +75,6 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
7575
7676 // Encode all filenames referenced by coverage mappings in this CGU.
7777 let filenames_buffer = global_file_table. make_filenames_buffer ( tcx) ;
78-
79- let filenames_size = filenames_buffer. len ( ) ;
80- let filenames_val = cx. const_bytes ( & filenames_buffer) ;
8178 let filenames_ref = llvm_cov:: hash_bytes ( & filenames_buffer) ;
8279
8380 let mut unused_function_names = Vec :: new ( ) ;
@@ -126,7 +123,7 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
126123 // Generate the coverage map header, which contains the filenames used by
127124 // this CGU's coverage mappings, and store it in a well-known global.
128125 // (This is skipped if we returned early due to having no covfun records.)
129- generate_covmap_record ( cx, covmap_version, filenames_size , filenames_val ) ;
126+ generate_covmap_record ( cx, covmap_version, & filenames_buffer ) ;
130127}
131128
132129/// Maps "global" (per-CGU) file ID numbers to their underlying filenames.
@@ -225,38 +222,35 @@ fn span_file_name(tcx: TyCtxt<'_>, span: Span) -> Symbol {
225222/// Generates the contents of the covmap record for this CGU, which mostly
226223/// consists of a header and a list of filenames. The record is then stored
227224/// as a global variable in the `__llvm_covmap` section.
228- fn generate_covmap_record < ' ll > (
229- cx : & CodegenCx < ' ll , ' _ > ,
230- version : u32 ,
231- filenames_size : usize ,
232- filenames_val : & ' ll llvm:: Value ,
233- ) {
234- debug ! ( "cov map: filenames_size = {}, 0-based version = {}" , filenames_size, version) ;
235-
236- // Create the coverage data header (Note, fields 0 and 2 are now always zero,
237- // as of `llvm::coverage::CovMapVersion::Version4`.)
238- let zero_was_n_records_val = cx. const_u32 ( 0 ) ;
239- let filenames_size_val = cx. const_u32 ( filenames_size as u32 ) ;
240- let zero_was_coverage_size_val = cx. const_u32 ( 0 ) ;
241- let version_val = cx. const_u32 ( version) ;
242- let cov_data_header_val = cx. const_struct (
243- & [ zero_was_n_records_val, filenames_size_val, zero_was_coverage_size_val, version_val] ,
244- /*packed=*/ false ,
225+ fn generate_covmap_record < ' ll > ( cx : & CodegenCx < ' ll , ' _ > , version : u32 , filenames_buffer : & [ u8 ] ) {
226+ // A covmap record consists of four target-endian u32 values, followed by
227+ // the encoded filenames table. Two of the header fields are unused in
228+ // modern versions of the LLVM coverage mapping format, and are always 0.
229+ // <https://llvm.org/docs/CoverageMappingFormat.html#llvm-ir-representation>
230+ // See also `src/llvm-project/clang/lib/CodeGen/CoverageMappingGen.cpp`.
231+ let covmap_header = cx. const_struct (
232+ & [
233+ cx. const_u32 ( 0 ) , // (unused)
234+ cx. const_u32 ( filenames_buffer. len ( ) as u32 ) ,
235+ cx. const_u32 ( 0 ) , // (unused)
236+ cx. const_u32 ( version) ,
237+ ] ,
238+ /* packed */ false ,
245239 ) ;
246-
247- // Create the complete LLVM coverage data value to add to the LLVM IR
248- let covmap_data =
249- cx. const_struct ( & [ cov_data_header_val, filenames_val] , /*packed=*/ false ) ;
250-
251- let llglobal = llvm:: add_global ( cx. llmod , cx. val_ty ( covmap_data) , & llvm_cov:: covmap_var_name ( ) ) ;
252- llvm:: set_initializer ( llglobal, covmap_data) ;
253- llvm:: set_global_constant ( llglobal, true ) ;
254- llvm:: set_linkage ( llglobal, llvm:: Linkage :: PrivateLinkage ) ;
255- llvm:: set_section ( llglobal, & llvm_cov:: covmap_section_name ( cx. llmod ) ) ;
240+ let covmap_record = cx
241+ . const_struct ( & [ covmap_header, cx. const_bytes ( filenames_buffer) ] , /* packed */ false ) ;
242+
243+ let covmap_global =
244+ llvm:: add_global ( cx. llmod , cx. val_ty ( covmap_record) , & llvm_cov:: covmap_var_name ( ) ) ;
245+ llvm:: set_initializer ( covmap_global, covmap_record) ;
246+ llvm:: set_global_constant ( covmap_global, true ) ;
247+ llvm:: set_linkage ( covmap_global, llvm:: Linkage :: PrivateLinkage ) ;
248+ llvm:: set_section ( covmap_global, & llvm_cov:: covmap_section_name ( cx. llmod ) ) ;
256249 // LLVM's coverage mapping format specifies 8-byte alignment for items in this section.
257250 // <https://llvm.org/docs/CoverageMappingFormat.html>
258- llvm:: set_alignment ( llglobal, Align :: EIGHT ) ;
259- cx. add_used_global ( llglobal) ;
251+ llvm:: set_alignment ( covmap_global, Align :: EIGHT ) ;
252+
253+ cx. add_used_global ( covmap_global) ;
260254}
261255
262256/// Each CGU will normally only emit coverage metadata for the functions that it actually generates.
0 commit comments