@@ -26,11 +26,11 @@ use std::mem::ManuallyDrop;
2626use back:: owned_target_machine:: OwnedTargetMachine ;
2727use back:: write:: { create_informational_target_machine, create_target_machine} ;
2828use context:: SimpleCx ;
29- use errors:: { AutoDiffWithoutLTO , ParseTargetMachineConfig } ;
29+ use errors:: ParseTargetMachineConfig ;
3030use llvm_util:: target_config;
3131use rustc_ast:: expand:: allocator:: AllocatorKind ;
3232use rustc_ast:: expand:: autodiff_attrs:: AutoDiffItem ;
33- use rustc_codegen_ssa:: back:: lto:: { LtoModuleCodegen , SerializedModule , ThinModule } ;
33+ use rustc_codegen_ssa:: back:: lto:: { SerializedModule , ThinModule } ;
3434use rustc_codegen_ssa:: back:: write:: {
3535 CodegenContext , FatLtoInput , ModuleConfig , TargetMachineFactoryConfig , TargetMachineFactoryFn ,
3636} ;
@@ -43,7 +43,7 @@ use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
4343use rustc_middle:: ty:: TyCtxt ;
4444use rustc_middle:: util:: Providers ;
4545use rustc_session:: Session ;
46- use rustc_session:: config:: { Lto , OptLevel , OutputFilenames , PrintKind , PrintRequest } ;
46+ use rustc_session:: config:: { OptLevel , OutputFilenames , PrintKind , PrintRequest } ;
4747use rustc_span:: Symbol ;
4848
4949mod back {
@@ -174,18 +174,29 @@ impl WriteBackendMethods for LlvmCodegenBackend {
174174 ) -> Result < ModuleCodegen < Self :: Module > , FatalError > {
175175 back:: write:: link ( cgcx, dcx, modules)
176176 }
177- fn run_fat_lto (
177+ fn run_and_optimize_fat_lto (
178178 cgcx : & CodegenContext < Self > ,
179179 modules : Vec < FatLtoInput < Self > > ,
180180 cached_modules : Vec < ( SerializedModule < Self :: ModuleBuffer > , WorkProduct ) > ,
181- ) -> Result < LtoModuleCodegen < Self > , FatalError > {
182- back:: lto:: run_fat ( cgcx, modules, cached_modules)
181+ diff_fncs : Vec < AutoDiffItem > ,
182+ ) -> Result < ModuleCodegen < Self :: Module > , FatalError > {
183+ let mut module = back:: lto:: run_fat ( cgcx, modules, cached_modules) ?;
184+
185+ if !diff_fncs. is_empty ( ) {
186+ builder:: autodiff:: differentiate ( & module, cgcx, diff_fncs) ?;
187+ }
188+
189+ let dcx = cgcx. create_dcx ( ) ;
190+ let dcx = dcx. handle ( ) ;
191+ back:: lto:: run_pass_manager ( cgcx, dcx, & mut module, false ) ?;
192+
193+ Ok ( module)
183194 }
184195 fn run_thin_lto (
185196 cgcx : & CodegenContext < Self > ,
186197 modules : Vec < ( String , Self :: ThinBuffer ) > ,
187198 cached_modules : Vec < ( SerializedModule < Self :: ModuleBuffer > , WorkProduct ) > ,
188- ) -> Result < ( Vec < LtoModuleCodegen < Self > > , Vec < WorkProduct > ) , FatalError > {
199+ ) -> Result < ( Vec < ThinModule < Self > > , Vec < WorkProduct > ) , FatalError > {
189200 back:: lto:: run_thin ( cgcx, modules, cached_modules)
190201 }
191202 fn optimize (
@@ -196,14 +207,6 @@ impl WriteBackendMethods for LlvmCodegenBackend {
196207 ) -> Result < ( ) , FatalError > {
197208 back:: write:: optimize ( cgcx, dcx, module, config)
198209 }
199- fn optimize_fat (
200- cgcx : & CodegenContext < Self > ,
201- module : & mut ModuleCodegen < Self :: Module > ,
202- ) -> Result < ( ) , FatalError > {
203- let dcx = cgcx. create_dcx ( ) ;
204- let dcx = dcx. handle ( ) ;
205- back:: lto:: run_pass_manager ( cgcx, dcx, module, false )
206- }
207210 fn optimize_thin (
208211 cgcx : & CodegenContext < Self > ,
209212 thin : ThinModule < Self > ,
@@ -212,11 +215,10 @@ impl WriteBackendMethods for LlvmCodegenBackend {
212215 }
213216 fn codegen (
214217 cgcx : & CodegenContext < Self > ,
215- dcx : DiagCtxtHandle < ' _ > ,
216218 module : ModuleCodegen < Self :: Module > ,
217219 config : & ModuleConfig ,
218220 ) -> Result < CompiledModule , FatalError > {
219- back:: write:: codegen ( cgcx, dcx , module, config)
221+ back:: write:: codegen ( cgcx, module, config)
220222 }
221223 fn prepare_thin (
222224 module : ModuleCodegen < Self :: Module > ,
@@ -227,19 +229,6 @@ impl WriteBackendMethods for LlvmCodegenBackend {
227229 fn serialize_module ( module : ModuleCodegen < Self :: Module > ) -> ( String , Self :: ModuleBuffer ) {
228230 ( module. name , back:: lto:: ModuleBuffer :: new ( module. module_llvm . llmod ( ) ) )
229231 }
230- /// Generate autodiff rules
231- fn autodiff (
232- cgcx : & CodegenContext < Self > ,
233- module : & ModuleCodegen < Self :: Module > ,
234- diff_fncs : Vec < AutoDiffItem > ,
235- config : & ModuleConfig ,
236- ) -> Result < ( ) , FatalError > {
237- if cgcx. lto != Lto :: Fat {
238- let dcx = cgcx. create_dcx ( ) ;
239- return Err ( dcx. handle ( ) . emit_almost_fatal ( AutoDiffWithoutLTO ) ) ;
240- }
241- builder:: autodiff:: differentiate ( module, cgcx, diff_fncs, config)
242- }
243232}
244233
245234impl LlvmCodegenBackend {
0 commit comments