@@ -11,7 +11,7 @@ use rustc_metadata::find_native_static_library;
1111use rustc_metadata:: fs:: { emit_metadata, METADATA_FILENAME } ;
1212use rustc_middle:: middle:: dependency_format:: Linkage ;
1313use rustc_middle:: middle:: exported_symbols:: SymbolExportKind ;
14- use rustc_session:: config:: { self , CFGuard , CrateType , DebugInfo , LdImpl , Strip } ;
14+ use rustc_session:: config:: { self , CFGuard , CrateType , DebugInfo , LdImpl , Lto , Strip } ;
1515use rustc_session:: config:: { OutputFilenames , OutputType , PrintRequest , SplitDwarfKind } ;
1616use rustc_session:: cstore:: DllImport ;
1717use rustc_session:: output:: { check_file_is_writeable, invalid_output_for_target, out_filename} ;
@@ -39,6 +39,7 @@ use cc::windows_registry;
3939use regex:: Regex ;
4040use tempfile:: Builder as TempFileBuilder ;
4141
42+ use itertools:: Itertools ;
4243use std:: borrow:: Borrow ;
4344use std:: cell:: OnceCell ;
4445use std:: collections:: BTreeSet ;
@@ -208,11 +209,26 @@ pub fn link_binary<'a>(
208209}
209210
210211pub fn each_linked_rlib (
212+ sess : & Session ,
211213 info : & CrateInfo ,
212214 f : & mut dyn FnMut ( CrateNum , & Path ) ,
213215) -> Result < ( ) , errors:: LinkRlibError > {
214216 let crates = info. used_crates . iter ( ) ;
215217 let mut fmts = None ;
218+
219+ let lto_active = matches ! ( sess. lto( ) , Lto :: Fat | Lto :: Thin ) ;
220+ if lto_active {
221+ for combination in info. dependency_formats . iter ( ) . combinations ( 2 ) {
222+ let ( ty1, list1) = combination[ 0 ] ;
223+ let ( ty2, list2) = combination[ 1 ] ;
224+ if list1 != list2 {
225+ return Err ( format ! (
226+ "{ty1:?} and {ty2:?} do not have equivalent dependency formats (`{list1:?}` vs `{list2:?}`)"
227+ ) ) ;
228+ }
229+ }
230+ }
231+
216232 for ( ty, list) in info. dependency_formats . iter ( ) {
217233 match ty {
218234 CrateType :: Executable
@@ -222,6 +238,10 @@ pub fn each_linked_rlib(
222238 fmts = Some ( list) ;
223239 break ;
224240 }
241+ CrateType :: Dylib if lto_active => {
242+ fmts = Some ( list) ;
243+ break ;
244+ }
225245 _ => { }
226246 }
227247 }
@@ -490,7 +510,7 @@ fn link_staticlib<'a>(
490510 ) ?;
491511 let mut all_native_libs = vec ! [ ] ;
492512
493- let res = each_linked_rlib ( & codegen_results. crate_info , & mut |cnum, path| {
513+ let res = each_linked_rlib ( sess , & codegen_results. crate_info , & mut |cnum, path| {
494514 let name = codegen_results. crate_info . crate_name [ & cnum] ;
495515 let native_libs = & codegen_results. crate_info . native_libraries [ & cnum] ;
496516
0 commit comments