@@ -48,18 +48,11 @@ pub fn crate_type_allows_lto(crate_type: config::CrateType) -> bool {
48
48
}
49
49
}
50
50
51
- /// Performs LTO, which in the case of full LTO means merging all modules into
52
- /// a single one and returning it for further optimizing. For ThinLTO, it will
53
- /// do the global analysis necessary and return two lists, one of the modules
54
- /// the need optimization and another for modules that can simply be copied over
55
- /// from the incr. comp. cache.
56
- pub ( crate ) fn run ( cgcx : & CodegenContext < LlvmCodegenBackend > ,
57
- modules : Vec < ModuleCodegen < ModuleLlvm > > ,
58
- cached_modules : Vec < ( SerializedModule < ModuleBuffer > , WorkProduct ) > ,
59
- timeline : & mut Timeline )
60
- -> Result < ( Vec < LtoModuleCodegen < LlvmCodegenBackend > > , Vec < WorkProduct > ) , FatalError >
51
+ fn prepare_lto ( cgcx : & CodegenContext < LlvmCodegenBackend > ,
52
+ timeline : & mut Timeline ,
53
+ diag_handler : & Handler )
54
+ -> Result < ( Vec < CString > , Vec < ( SerializedModule < ModuleBuffer > , CString ) > ) , FatalError >
61
55
{
62
- let diag_handler = cgcx. create_diag_handler ( ) ;
63
56
let export_threshold = match cgcx. lto {
64
57
// We're just doing LTO for our one crate
65
58
Lto :: ThinLocal => SymbolExportLevel :: Rust ,
@@ -144,36 +137,56 @@ pub(crate) fn run(cgcx: &CodegenContext<LlvmCodegenBackend>,
144
137
}
145
138
}
146
139
140
+ Ok ( ( symbol_white_list, upstream_modules) )
141
+ }
142
+
143
+ /// Performs fat LTO by merging all modules into a single one and returning it
144
+ /// for further optimization.
145
+ pub ( crate ) fn run_fat ( cgcx : & CodegenContext < LlvmCodegenBackend > ,
146
+ modules : Vec < ModuleCodegen < ModuleLlvm > > ,
147
+ _cached_modules : Vec < ( SerializedModule < ModuleBuffer > , WorkProduct ) > ,
148
+ timeline : & mut Timeline )
149
+ -> Result < ( Vec < LtoModuleCodegen < LlvmCodegenBackend > > , Vec < WorkProduct > ) , FatalError >
150
+ {
151
+ let diag_handler = cgcx. create_diag_handler ( ) ;
152
+ let ( symbol_white_list, upstream_modules) = prepare_lto ( cgcx, timeline, & diag_handler) ?;
147
153
let symbol_white_list = symbol_white_list. iter ( )
148
154
. map ( |c| c. as_ptr ( ) )
149
155
. collect :: < Vec < _ > > ( ) ;
150
- match cgcx . lto {
151
- Lto :: Fat => {
152
- assert ! ( cached_modules . is_empty ( ) ) ;
153
- let opt_jobs = fat_lto ( cgcx ,
154
- & diag_handler ,
155
- modules ,
156
- upstream_modules ,
157
- & symbol_white_list ,
158
- timeline ) ;
159
- opt_jobs . map ( |opt_jobs| ( opt_jobs , vec ! [ ] ) )
160
- }
161
- Lto :: Thin |
162
- Lto :: ThinLocal => {
163
- if cgcx . opts . debugging_opts . cross_lang_lto . enabled ( ) {
164
- unreachable ! ( "We should never reach this case if the LTO step \
165
- is deferred to the linker" ) ;
166
- }
167
- thin_lto ( cgcx ,
168
- & diag_handler ,
169
- modules ,
170
- upstream_modules ,
171
- cached_modules ,
172
- & symbol_white_list ,
173
- timeline )
174
- }
175
- Lto :: No => unreachable ! ( ) ,
156
+ let opt_jobs = fat_lto ( cgcx ,
157
+ & diag_handler ,
158
+ modules ,
159
+ upstream_modules ,
160
+ & symbol_white_list ,
161
+ timeline ) ;
162
+ opt_jobs . map ( |opt_jobs| ( opt_jobs , vec ! [ ] ) )
163
+ }
164
+
165
+ /// Performs thin LTO by performing necessary global analysis and returning two
166
+ /// lists, one of the modules that need optimization and another for modules that
167
+ /// can simply be copied over from the incr. comp. cache.
168
+ pub ( crate ) fn run_thin ( cgcx : & CodegenContext < LlvmCodegenBackend > ,
169
+ modules : Vec < ModuleCodegen < ModuleLlvm > > ,
170
+ cached_modules : Vec < ( SerializedModule < ModuleBuffer > , WorkProduct ) > ,
171
+ timeline : & mut Timeline )
172
+ -> Result < ( Vec < LtoModuleCodegen < LlvmCodegenBackend > > , Vec < WorkProduct > ) , FatalError >
173
+ {
174
+ let diag_handler = cgcx . create_diag_handler ( ) ;
175
+ let ( symbol_white_list , upstream_modules ) = prepare_lto ( cgcx , timeline , & diag_handler ) ? ;
176
+ let symbol_white_list = symbol_white_list . iter ( )
177
+ . map ( |c| c . as_ptr ( ) )
178
+ . collect :: < Vec < _ > > ( ) ;
179
+ if cgcx . opts . debugging_opts . cross_lang_lto . enabled ( ) {
180
+ unreachable ! ( "We should never reach this case if the LTO step \
181
+ is deferred to the linker" ) ;
176
182
}
183
+ thin_lto ( cgcx,
184
+ & diag_handler,
185
+ modules,
186
+ upstream_modules,
187
+ cached_modules,
188
+ & symbol_white_list,
189
+ timeline)
177
190
}
178
191
179
192
fn fat_lto ( cgcx : & CodegenContext < LlvmCodegenBackend > ,
0 commit comments