@@ -26,7 +26,7 @@ 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 ;
@@ -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,12 +174,23 @@ 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+ diff_fncs : Vec < AutoDiffItem > ,
181182 ) -> Result < ModuleCodegen < Self :: Module > , FatalError > {
182- back:: lto:: run_fat ( cgcx, modules, cached_modules)
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 > ,
@@ -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 > ,
@@ -226,18 +229,6 @@ impl WriteBackendMethods for LlvmCodegenBackend {
226229 fn serialize_module ( module : ModuleCodegen < Self :: Module > ) -> ( String , Self :: ModuleBuffer ) {
227230 ( module. name , back:: lto:: ModuleBuffer :: new ( module. module_llvm . llmod ( ) ) )
228231 }
229- /// Generate autodiff rules
230- fn autodiff (
231- cgcx : & CodegenContext < Self > ,
232- module : & ModuleCodegen < Self :: Module > ,
233- diff_fncs : Vec < AutoDiffItem > ,
234- ) -> Result < ( ) , FatalError > {
235- if cgcx. lto != Lto :: Fat {
236- let dcx = cgcx. create_dcx ( ) ;
237- return Err ( dcx. handle ( ) . emit_almost_fatal ( AutoDiffWithoutLTO ) ) ;
238- }
239- builder:: autodiff:: differentiate ( module, cgcx, diff_fncs)
240- }
241232}
242233
243234impl LlvmCodegenBackend {
0 commit comments