11use crate :: back:: write:: { self , save_temp_bitcode, DiagnosticHandlers } ;
2- use crate :: errors:: DynamicLinkingWithLTO ;
2+ use crate :: errors:: {
3+ DynamicLinkingWithLTO , LlvmError , LtoBitcodeFromRlib , LtoDisallowed , LtoDylib ,
4+ } ;
35use crate :: llvm:: { self , build_string} ;
46use crate :: { LlvmCodegenBackend , ModuleLlvm } ;
57use object:: read:: archive:: ArchiveFile ;
@@ -77,15 +79,12 @@ fn prepare_lto(
7779 // Make sure we actually can run LTO
7880 for crate_type in cgcx. crate_types . iter ( ) {
7981 if !crate_type_allows_lto ( * crate_type) {
80- let e = diag_handler. fatal (
81- "lto can only be run for executables, cdylibs and \
82- static library outputs",
83- ) ;
84- return Err ( e) ;
82+ diag_handler. emit_err ( LtoDisallowed ) ;
83+ return Err ( FatalError ) ;
8584 } else if * crate_type == CrateType :: Dylib {
8685 if !cgcx. opts . unstable_opts . dylib_lto {
87- return Err ( diag_handler
88- . fatal ( "lto cannot be used for `dylib` crate type without `-Zdylib-lto`" ) ) ;
86+ diag_handler. emit_err ( LtoDylib ) ;
87+ return Err ( FatalError ) ;
8988 }
9089 }
9190 }
@@ -127,7 +126,10 @@ fn prepare_lto(
127126 let module = SerializedModule :: FromRlib ( data. to_vec ( ) ) ;
128127 upstream_modules. push ( ( module, CString :: new ( name) . unwrap ( ) ) ) ;
129128 }
130- Err ( msg) => return Err ( diag_handler. fatal ( & msg) ) ,
129+ Err ( e) => {
130+ diag_handler. emit_err ( e) ;
131+ return Err ( FatalError ) ;
132+ }
131133 }
132134 }
133135 }
@@ -140,7 +142,7 @@ fn prepare_lto(
140142 Ok ( ( symbols_below_threshold, upstream_modules) )
141143}
142144
143- fn get_bitcode_slice_from_object_data ( obj : & [ u8 ] ) -> Result < & [ u8 ] , String > {
145+ fn get_bitcode_slice_from_object_data ( obj : & [ u8 ] ) -> Result < & [ u8 ] , LtoBitcodeFromRlib > {
144146 let mut len = 0 ;
145147 let data =
146148 unsafe { llvm:: LLVMRustGetBitcodeSliceFromObjectData ( obj. as_ptr ( ) , obj. len ( ) , & mut len) } ;
@@ -155,8 +157,9 @@ fn get_bitcode_slice_from_object_data(obj: &[u8]) -> Result<&[u8], String> {
155157 Ok ( bc)
156158 } else {
157159 assert ! ( len == 0 ) ;
158- let msg = llvm:: last_error ( ) . unwrap_or_else ( || "unknown LLVM error" . to_string ( ) ) ;
159- Err ( format ! ( "failed to get bitcode from object file for LTO ({})" , msg) )
160+ Err ( LtoBitcodeFromRlib {
161+ llvm_err : llvm:: last_error ( ) . unwrap_or_else ( || "unknown LLVM error" . to_string ( ) ) ,
162+ } )
160163 }
161164}
162165
@@ -328,10 +331,9 @@ fn fat_lto(
328331 } ) ;
329332 info ! ( "linking {:?}" , name) ;
330333 let data = bc_decoded. data ( ) ;
331- linker. add ( data) . map_err ( |( ) | {
332- let msg = format ! ( "failed to load bitcode of module {:?}" , name) ;
333- write:: llvm_err ( diag_handler, & msg)
334- } ) ?;
334+ linker
335+ . add ( data)
336+ . map_err ( |( ) | write:: llvm_err ( diag_handler, LlvmError :: LoadBitcode { name } ) ) ?;
335337 serialized_bitcode. push ( bc_decoded) ;
336338 }
337339 drop ( linker) ;
@@ -489,7 +491,7 @@ fn thin_lto(
489491 symbols_below_threshold. as_ptr ( ) ,
490492 symbols_below_threshold. len ( ) as u32 ,
491493 )
492- . ok_or_else ( || write:: llvm_err ( diag_handler, "failed to prepare thin LTO context" ) ) ?;
494+ . ok_or_else ( || write:: llvm_err ( diag_handler, LlvmError :: PrepareThinLtoContext ) ) ?;
493495
494496 let data = ThinData ( data) ;
495497
@@ -562,8 +564,7 @@ fn thin_lto(
562564 // session, overwriting the previous serialized data (if any).
563565 if let Some ( path) = key_map_path {
564566 if let Err ( err) = curr_key_map. save_to_file ( & path) {
565- let msg = format ! ( "Error while writing ThinLTO key data: {}" , err) ;
566- return Err ( write:: llvm_err ( diag_handler, & msg) ) ;
567+ return Err ( write:: llvm_err ( diag_handler, LlvmError :: WriteThinLtoKey { err } ) ) ;
567568 }
568569 }
569570
@@ -689,8 +690,7 @@ pub unsafe fn optimize_thin_module(
689690
690691 let module_name = & thin_module. shared . module_names [ thin_module. idx ] ;
691692 let tm_factory_config = TargetMachineFactoryConfig :: new ( cgcx, module_name. to_str ( ) . unwrap ( ) ) ;
692- let tm =
693- ( cgcx. tm_factory ) ( tm_factory_config) . map_err ( |e| write:: llvm_err ( & diag_handler, & e) ) ?;
693+ let tm = ( cgcx. tm_factory ) ( tm_factory_config) . map_err ( |e| write:: llvm_err ( & diag_handler, e) ) ?;
694694
695695 // Right now the implementation we've got only works over serialized
696696 // modules, so we create a fresh new LLVM context and parse the module
@@ -717,8 +717,7 @@ pub unsafe fn optimize_thin_module(
717717 let mut cu2 = ptr:: null_mut ( ) ;
718718 llvm:: LLVMRustThinLTOGetDICompileUnit ( llmod, & mut cu1, & mut cu2) ;
719719 if !cu2. is_null ( ) {
720- let msg = "multiple source DICompileUnits found" ;
721- return Err ( write:: llvm_err ( & diag_handler, msg) ) ;
720+ return Err ( write:: llvm_err ( & diag_handler, LlvmError :: MultipleSourceDiCompileUnit ) ) ;
722721 }
723722
724723 // Up next comes the per-module local analyses that we do for Thin LTO.
@@ -733,8 +732,7 @@ pub unsafe fn optimize_thin_module(
733732 let _timer =
734733 cgcx. prof . generic_activity_with_arg ( "LLVM_thin_lto_rename" , thin_module. name ( ) ) ;
735734 if !llvm:: LLVMRustPrepareThinLTORename ( thin_module. shared . data . 0 , llmod, target) {
736- let msg = "failed to prepare thin LTO module" ;
737- return Err ( write:: llvm_err ( & diag_handler, msg) ) ;
735+ return Err ( write:: llvm_err ( & diag_handler, LlvmError :: PrepareThinLtoModule ) ) ;
738736 }
739737 save_temp_bitcode ( cgcx, & module, "thin-lto-after-rename" ) ;
740738 }
@@ -744,8 +742,7 @@ pub unsafe fn optimize_thin_module(
744742 . prof
745743 . generic_activity_with_arg ( "LLVM_thin_lto_resolve_weak" , thin_module. name ( ) ) ;
746744 if !llvm:: LLVMRustPrepareThinLTOResolveWeak ( thin_module. shared . data . 0 , llmod) {
747- let msg = "failed to prepare thin LTO module" ;
748- return Err ( write:: llvm_err ( & diag_handler, msg) ) ;
745+ return Err ( write:: llvm_err ( & diag_handler, LlvmError :: PrepareThinLtoModule ) ) ;
749746 }
750747 save_temp_bitcode ( cgcx, & module, "thin-lto-after-resolve" ) ;
751748 }
@@ -755,8 +752,7 @@ pub unsafe fn optimize_thin_module(
755752 . prof
756753 . generic_activity_with_arg ( "LLVM_thin_lto_internalize" , thin_module. name ( ) ) ;
757754 if !llvm:: LLVMRustPrepareThinLTOInternalize ( thin_module. shared . data . 0 , llmod) {
758- let msg = "failed to prepare thin LTO module" ;
759- return Err ( write:: llvm_err ( & diag_handler, msg) ) ;
755+ return Err ( write:: llvm_err ( & diag_handler, LlvmError :: PrepareThinLtoModule ) ) ;
760756 }
761757 save_temp_bitcode ( cgcx, & module, "thin-lto-after-internalize" ) ;
762758 }
@@ -765,8 +761,7 @@ pub unsafe fn optimize_thin_module(
765761 let _timer =
766762 cgcx. prof . generic_activity_with_arg ( "LLVM_thin_lto_import" , thin_module. name ( ) ) ;
767763 if !llvm:: LLVMRustPrepareThinLTOImport ( thin_module. shared . data . 0 , llmod, target) {
768- let msg = "failed to prepare thin LTO module" ;
769- return Err ( write:: llvm_err ( & diag_handler, msg) ) ;
764+ return Err ( write:: llvm_err ( & diag_handler, LlvmError :: PrepareThinLtoModule ) ) ;
770765 }
771766 save_temp_bitcode ( cgcx, & module, "thin-lto-after-import" ) ;
772767 }
@@ -886,11 +881,7 @@ pub fn parse_module<'a>(
886881 diag_handler : & Handler ,
887882) -> Result < & ' a llvm:: Module , FatalError > {
888883 unsafe {
889- llvm:: LLVMRustParseBitcodeForLTO ( cx, data. as_ptr ( ) , data. len ( ) , name. as_ptr ( ) ) . ok_or_else (
890- || {
891- let msg = "failed to parse bitcode for LTO module" ;
892- write:: llvm_err ( diag_handler, msg)
893- } ,
894- )
884+ llvm:: LLVMRustParseBitcodeForLTO ( cx, data. as_ptr ( ) , data. len ( ) , name. as_ptr ( ) )
885+ . ok_or_else ( || write:: llvm_err ( diag_handler, LlvmError :: ParseBitcode ) )
895886 }
896887}
0 commit comments