@@ -82,10 +82,7 @@ use std::any::Any;
8282use std:: fmt:: Debug ;
8383use std:: ops:: Deref ;
8484use std:: path:: PathBuf ;
85- #[ cfg( not( feature = "master" ) ) ]
86- use std:: sync:: atomic:: AtomicBool ;
87- #[ cfg( not( feature = "master" ) ) ]
88- use std:: sync:: atomic:: Ordering ;
85+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
8986use std:: sync:: { Arc , Mutex } ;
9087
9188use back:: lto:: { ThinBuffer , ThinData } ;
@@ -177,6 +174,7 @@ impl LockedTargetInfo {
177174#[ derive( Clone ) ]
178175pub struct GccCodegenBackend {
179176 target_info : LockedTargetInfo ,
177+ lto_supported : Arc < AtomicBool > ,
180178}
181179
182180impl CodegenBackend for GccCodegenBackend {
@@ -202,6 +200,29 @@ impl CodegenBackend for GccCodegenBackend {
202200 * * self . target_info . info . lock ( ) . expect ( "lock" ) = context. get_target_info ( ) ;
203201 }
204202
203+ // TODO: try the LTO frontend and check if it errors out. If so, do not embed the bitcode.
204+ {
205+ let temp_dir = TempDir :: new ( ) . expect ( "cannot create temporary directory" ) ;
206+ let temp_file = temp_dir. into_path ( ) . join ( "result.asm" ) ;
207+ let context = Context :: default ( ) ;
208+ let object_file_path = temp_file. to_str ( ) . expect ( "path to str" ) ;
209+ context. compile_to_file ( gccjit:: OutputKind :: ObjectFile , object_file_path) ;
210+
211+ //let temp_dir = TempDir::new().expect("cannot create temporary directory");
212+ //let temp_file = temp_dir.into_path().join("result.asm");
213+ let check_context = Context :: default ( ) ;
214+ check_context. add_driver_option ( "-x" ) ;
215+ check_context. add_driver_option ( "lto" ) ;
216+ check_context. add_driver_option ( object_file_path) ;
217+ check_context. set_print_errors_to_stderr ( false ) ;
218+ //context.compile_to_file(gccjit::OutputKind::ObjectFile, temp_file.to_str().expect("path to str"));
219+ // FIXME: compile gives the error as expected, but compile_to_file doesn't.
220+ check_context. compile ( ) ;
221+ let error = check_context. get_last_error ( ) ;
222+ let lto_supported = error == Ok ( None ) ;
223+ self . lto_supported . store ( lto_supported, Ordering :: SeqCst ) ;
224+ }
225+
205226 #[ cfg( feature = "master" ) ]
206227 gccjit:: set_global_personality_function_name ( b"rust_eh_personality\0 " ) ;
207228
@@ -291,6 +312,7 @@ impl ExtraBackendMethods for GccCodegenBackend {
291312 context : Arc :: new ( SyncContext :: new ( new_context ( tcx) ) ) ,
292313 relocation_model : tcx. sess . relocation_model ( ) ,
293314 lto_mode : LtoMode :: None ,
315+ lto_supported : false ,
294316 temp_dir : None ,
295317 } ;
296318
@@ -305,7 +327,12 @@ impl ExtraBackendMethods for GccCodegenBackend {
305327 tcx : TyCtxt < ' _ > ,
306328 cgu_name : Symbol ,
307329 ) -> ( ModuleCodegen < Self :: Module > , u64 ) {
308- base:: compile_codegen_unit ( tcx, cgu_name, self . target_info . clone ( ) )
330+ base:: compile_codegen_unit (
331+ tcx,
332+ cgu_name,
333+ self . target_info . clone ( ) ,
334+ self . lto_supported . load ( Ordering :: SeqCst ) ,
335+ )
309336 }
310337
311338 fn target_machine_factory (
@@ -332,6 +359,7 @@ pub struct GccContext {
332359 /// LTO.
333360 relocation_model : RelocModel ,
334361 lto_mode : LtoMode ,
362+ lto_supported : bool ,
335363 // Temporary directory used by LTO. We keep it here so that it's not removed before linking.
336364 temp_dir : Option < TempDir > ,
337365}
@@ -443,7 +471,10 @@ pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
443471 supports_128bit_integers : AtomicBool :: new ( false ) ,
444472 } ) ) ) ;
445473
446- Box :: new ( GccCodegenBackend { target_info : LockedTargetInfo { info } } )
474+ Box :: new ( GccCodegenBackend {
475+ lto_supported : Arc :: new ( AtomicBool :: new ( false ) ) ,
476+ target_info : LockedTargetInfo { info } ,
477+ } )
447478}
448479
449480fn to_gcc_opt_level ( optlevel : Option < OptLevel > ) -> OptimizationLevel {
0 commit comments