@@ -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