1
1
use std:: iter;
2
2
3
- use itertools:: Itertools as _;
4
3
use rustc_abi:: Align ;
5
4
use rustc_codegen_ssa:: traits:: {
6
5
BaseTypeCodegenMethods , ConstCodegenMethods , StaticCodegenMethods ,
7
6
} ;
8
7
use rustc_data_structures:: fx:: { FxHashSet , FxIndexMap , FxIndexSet } ;
9
8
use rustc_hir:: def_id:: { DefId , LocalDefId } ;
10
9
use rustc_index:: IndexVec ;
10
+ use rustc_middle:: mir;
11
11
use rustc_middle:: ty:: { self , TyCtxt } ;
12
- use rustc_middle:: { bug, mir} ;
13
12
use rustc_session:: RemapFileNameExt ;
14
13
use rustc_session:: config:: RemapPathScopeComponents ;
15
14
use rustc_span:: def_id:: DefIdSet ;
@@ -67,25 +66,12 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
67
66
return ;
68
67
}
69
68
70
- let all_file_names = function_coverage_map
71
- . iter ( )
72
- . map ( |( _, fn_cov) | fn_cov. function_coverage_info . body_span )
73
- . map ( |span| span_file_name ( tcx, span) ) ;
74
- let global_file_table = GlobalFileTable :: new ( all_file_names) ;
75
-
76
- // Encode all filenames referenced by coverage mappings in this CGU.
77
- let filenames_buffer = global_file_table. make_filenames_buffer ( tcx) ;
78
- // The `llvm-cov` tool uses this hash to associate each covfun record with
79
- // its corresponding filenames table, since the final binary will typically
80
- // contain multiple covmap records from different compilation units.
81
- let filenames_hash = llvm_cov:: hash_bytes ( & filenames_buffer) ;
82
-
83
- let mut unused_function_names = Vec :: new ( ) ;
69
+ let mut global_file_table = GlobalFileTable :: new ( ) ;
84
70
85
71
let covfun_records = function_coverage_map
86
72
. into_iter ( )
87
73
. filter_map ( |( instance, function_coverage) | {
88
- prepare_covfun_record ( tcx, & global_file_table, instance, & function_coverage)
74
+ prepare_covfun_record ( tcx, & mut global_file_table, instance, & function_coverage)
89
75
} )
90
76
. collect :: < Vec < _ > > ( ) ;
91
77
@@ -98,6 +84,15 @@ pub(crate) fn finalize(cx: &CodegenCx<'_, '_>) {
98
84
return ;
99
85
}
100
86
87
+ // Encode all filenames referenced by coverage mappings in this CGU.
88
+ let filenames_buffer = global_file_table. make_filenames_buffer ( tcx) ;
89
+ // The `llvm-cov` tool uses this hash to associate each covfun record with
90
+ // its corresponding filenames table, since the final binary will typically
91
+ // contain multiple covmap records from different compilation units.
92
+ let filenames_hash = llvm_cov:: hash_bytes ( & filenames_buffer) ;
93
+
94
+ let mut unused_function_names = vec ! [ ] ;
95
+
101
96
for covfun in & covfun_records {
102
97
unused_function_names. extend ( covfun. mangled_function_name_if_unused ( ) ) ;
103
98
@@ -137,22 +132,14 @@ struct GlobalFileTable {
137
132
}
138
133
139
134
impl GlobalFileTable {
140
- fn new ( all_file_names : impl IntoIterator < Item = Symbol > ) -> Self {
141
- // Collect all of the filenames into a set. Filenames usually come in
142
- // contiguous runs, so we can dedup adjacent ones to save work.
143
- let mut raw_file_table = all_file_names. into_iter ( ) . dedup ( ) . collect :: < FxIndexSet < Symbol > > ( ) ;
144
-
145
- // Sort the file table by its actual string values, not the arbitrary
146
- // ordering of its symbols.
147
- raw_file_table. sort_unstable_by ( |a, b| a. as_str ( ) . cmp ( b. as_str ( ) ) ) ;
148
-
149
- Self { raw_file_table }
135
+ fn new ( ) -> Self {
136
+ Self { raw_file_table : FxIndexSet :: default ( ) }
150
137
}
151
138
152
- fn global_file_id_for_file_name ( & self , file_name : Symbol ) -> GlobalFileId {
153
- let raw_id = self . raw_file_table . get_index_of ( & file_name ) . unwrap_or_else ( || {
154
- bug ! ( "file name not found in prepared global file table: { file_name}" ) ;
155
- } ) ;
139
+ fn global_file_id_for_file_name ( & mut self , file_name : Symbol ) -> GlobalFileId {
140
+ // Ensure the given file has a table entry, and get its index.
141
+ self . raw_file_table . insert ( file_name) ;
142
+ let raw_id = self . raw_file_table . get_index_of ( & file_name ) . unwrap ( ) ;
156
143
// The raw file table doesn't include an entry for the working dir
157
144
// (which has ID 0), so add 1 to get the correct ID.
158
145
GlobalFileId :: from_usize ( raw_id + 1 )
0 commit comments