1
1
use crate :: back:: write:: { self , save_temp_bitcode, DiagnosticHandlers } ;
2
- use crate :: errors:: DynamicLinkingWithLTO ;
2
+ use crate :: errors:: {
3
+ DynamicLinkingWithLTO , LlvmError , LtoBitcodeFromRlib , LtoDisallowed , LtoDylib ,
4
+ } ;
3
5
use crate :: llvm:: { self , build_string} ;
4
6
use crate :: { LlvmCodegenBackend , ModuleLlvm } ;
5
7
use object:: read:: archive:: ArchiveFile ;
@@ -77,15 +79,12 @@ fn prepare_lto(
77
79
// Make sure we actually can run LTO
78
80
for crate_type in cgcx. crate_types . iter ( ) {
79
81
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 ) ;
85
84
} else if * crate_type == CrateType :: Dylib {
86
85
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 ) ;
89
88
}
90
89
}
91
90
}
@@ -127,7 +126,10 @@ fn prepare_lto(
127
126
let module = SerializedModule :: FromRlib ( data. to_vec ( ) ) ;
128
127
upstream_modules. push ( ( module, CString :: new ( name) . unwrap ( ) ) ) ;
129
128
}
130
- Err ( msg) => return Err ( diag_handler. fatal ( & msg) ) ,
129
+ Err ( e) => {
130
+ diag_handler. emit_err ( e) ;
131
+ return Err ( FatalError ) ;
132
+ }
131
133
}
132
134
}
133
135
}
@@ -140,7 +142,7 @@ fn prepare_lto(
140
142
Ok ( ( symbols_below_threshold, upstream_modules) )
141
143
}
142
144
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 > {
144
146
let mut len = 0 ;
145
147
let data =
146
148
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> {
155
157
Ok ( bc)
156
158
} else {
157
159
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
+ } )
160
163
}
161
164
}
162
165
@@ -328,10 +331,9 @@ fn fat_lto(
328
331
} ) ;
329
332
info ! ( "linking {:?}" , name) ;
330
333
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 } ) ) ?;
335
337
serialized_bitcode. push ( bc_decoded) ;
336
338
}
337
339
drop ( linker) ;
@@ -489,7 +491,7 @@ fn thin_lto(
489
491
symbols_below_threshold. as_ptr ( ) ,
490
492
symbols_below_threshold. len ( ) as u32 ,
491
493
)
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 ) ) ?;
493
495
494
496
let data = ThinData ( data) ;
495
497
@@ -562,8 +564,7 @@ fn thin_lto(
562
564
// session, overwriting the previous serialized data (if any).
563
565
if let Some ( path) = key_map_path {
564
566
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 } ) ) ;
567
568
}
568
569
}
569
570
@@ -689,8 +690,7 @@ pub unsafe fn optimize_thin_module(
689
690
690
691
let module_name = & thin_module. shared . module_names [ thin_module. idx ] ;
691
692
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) ) ?;
694
694
695
695
// Right now the implementation we've got only works over serialized
696
696
// modules, so we create a fresh new LLVM context and parse the module
@@ -717,8 +717,7 @@ pub unsafe fn optimize_thin_module(
717
717
let mut cu2 = ptr:: null_mut ( ) ;
718
718
llvm:: LLVMRustThinLTOGetDICompileUnit ( llmod, & mut cu1, & mut cu2) ;
719
719
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 ) ) ;
722
721
}
723
722
724
723
// Up next comes the per-module local analyses that we do for Thin LTO.
@@ -733,8 +732,7 @@ pub unsafe fn optimize_thin_module(
733
732
let _timer =
734
733
cgcx. prof . generic_activity_with_arg ( "LLVM_thin_lto_rename" , thin_module. name ( ) ) ;
735
734
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 ) ) ;
738
736
}
739
737
save_temp_bitcode ( cgcx, & module, "thin-lto-after-rename" ) ;
740
738
}
@@ -744,8 +742,7 @@ pub unsafe fn optimize_thin_module(
744
742
. prof
745
743
. generic_activity_with_arg ( "LLVM_thin_lto_resolve_weak" , thin_module. name ( ) ) ;
746
744
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 ) ) ;
749
746
}
750
747
save_temp_bitcode ( cgcx, & module, "thin-lto-after-resolve" ) ;
751
748
}
@@ -755,8 +752,7 @@ pub unsafe fn optimize_thin_module(
755
752
. prof
756
753
. generic_activity_with_arg ( "LLVM_thin_lto_internalize" , thin_module. name ( ) ) ;
757
754
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 ) ) ;
760
756
}
761
757
save_temp_bitcode ( cgcx, & module, "thin-lto-after-internalize" ) ;
762
758
}
@@ -765,8 +761,7 @@ pub unsafe fn optimize_thin_module(
765
761
let _timer =
766
762
cgcx. prof . generic_activity_with_arg ( "LLVM_thin_lto_import" , thin_module. name ( ) ) ;
767
763
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 ) ) ;
770
765
}
771
766
save_temp_bitcode ( cgcx, & module, "thin-lto-after-import" ) ;
772
767
}
@@ -886,11 +881,7 @@ pub fn parse_module<'a>(
886
881
diag_handler : & Handler ,
887
882
) -> Result < & ' a llvm:: Module , FatalError > {
888
883
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 ) )
895
886
}
896
887
}
0 commit comments