@@ -16,7 +16,7 @@ use schema::CrateRoot;
1616
1717use rustc:: hir:: def_id:: { CrateNum , DefIndex } ;
1818use rustc:: hir:: svh:: Svh ;
19- use rustc:: middle:: cstore:: LoadedMacros ;
19+ use rustc:: middle:: cstore:: { DepKind , LoadedMacros } ;
2020use rustc:: session:: { config, Session } ;
2121use rustc_back:: PanicStrategy ;
2222use rustc:: session:: search_paths:: PathKind ;
@@ -29,7 +29,7 @@ use std::cell::{RefCell, Cell};
2929use std:: ops:: Deref ;
3030use std:: path:: PathBuf ;
3131use std:: rc:: Rc ;
32- use std:: fs ;
32+ use std:: { cmp , fs } ;
3333
3434use syntax:: ast;
3535use syntax:: abi:: Abi ;
@@ -60,7 +60,7 @@ fn dump_crates(cstore: &CStore) {
6060 info ! ( " name: {}" , data. name( ) ) ;
6161 info ! ( " cnum: {}" , data. cnum) ;
6262 info ! ( " hash: {}" , data. hash( ) ) ;
63- info ! ( " reqd: {}" , data. explicitly_linked . get( ) ) ;
63+ info ! ( " reqd: {:? }" , data. dep_kind . get( ) ) ;
6464 let CrateSource { dylib, rlib } = data. source . clone ( ) ;
6565 dylib. map ( |dl| info ! ( " dylib: {}" , dl. 0 . display( ) ) ) ;
6666 rlib. map ( |rl| info ! ( " rlib: {}" , rl. 0 . display( ) ) ) ;
@@ -258,7 +258,7 @@ impl<'a> CrateLoader<'a> {
258258 name : & str ,
259259 span : Span ,
260260 lib : Library ,
261- explicitly_linked : bool )
261+ dep_kind : DepKind )
262262 -> ( CrateNum , Rc < cstore:: CrateMetadata > ) {
263263 info ! ( "register crate `extern crate {} as {}`" , name, ident) ;
264264 let crate_root = lib. metadata . get_root ( ) ;
@@ -299,7 +299,7 @@ impl<'a> CrateLoader<'a> {
299299 cnum_map : RefCell :: new ( cnum_map) ,
300300 cnum : cnum,
301301 codemap_import_info : RefCell :: new ( vec ! [ ] ) ,
302- explicitly_linked : Cell :: new ( explicitly_linked ) ,
302+ dep_kind : Cell :: new ( dep_kind ) ,
303303 source : cstore:: CrateSource {
304304 dylib : dylib,
305305 rlib : rlib,
@@ -317,7 +317,7 @@ impl<'a> CrateLoader<'a> {
317317 hash : Option < & Svh > ,
318318 span : Span ,
319319 kind : PathKind ,
320- explicitly_linked : bool )
320+ dep_kind : DepKind )
321321 -> ( CrateNum , Rc < cstore:: CrateMetadata > ) {
322322 info ! ( "resolving crate `extern crate {} as {}`" , name, ident) ;
323323 let result = match self . existing_match ( name, hash, kind) {
@@ -350,12 +350,11 @@ impl<'a> CrateLoader<'a> {
350350 match result {
351351 LoadResult :: Previous ( cnum) => {
352352 let data = self . cstore . get_crate_data ( cnum) ;
353- data. explicitly_linked . set ( explicitly_linked || data. explicitly_linked . get ( ) ) ;
353+ data. dep_kind . set ( cmp :: max ( data. dep_kind . get ( ) , dep_kind ) ) ;
354354 ( cnum, data)
355355 }
356356 LoadResult :: Loaded ( library) => {
357- self . register_crate ( root, ident, name, span, library,
358- explicitly_linked)
357+ self . register_crate ( root, ident, name, span, library, dep_kind)
359358 }
360359 }
361360 }
@@ -442,7 +441,7 @@ impl<'a> CrateLoader<'a> {
442441 Some ( & dep. hash ) ,
443442 span,
444443 PathKind :: Dependency ,
445- dep. explicitly_linked ) ;
444+ dep. kind ) ;
446445 ( CrateNum :: new ( crate_num + 1 ) , local_cnum)
447446 } ) . collect ( ) ;
448447
@@ -716,7 +715,7 @@ impl<'a> CrateLoader<'a> {
716715 // #![panic_runtime] crate.
717716 self . inject_dependency_if ( cnum, "a panic runtime" ,
718717 & |data| data. needs_panic_runtime ( ) ) ;
719- runtime_found = runtime_found || data. explicitly_linked . get ( ) ;
718+ runtime_found = runtime_found || data. dep_kind . get ( ) == DepKind :: Explicit ;
720719 }
721720 } ) ;
722721
@@ -745,8 +744,9 @@ impl<'a> CrateLoader<'a> {
745744 } ;
746745 info ! ( "panic runtime not found -- loading {}" , name) ;
747746
747+ let dep_kind = DepKind :: Implicit ;
748748 let ( cnum, data) =
749- self . resolve_crate ( & None , name, name, None , DUMMY_SP , PathKind :: Crate , false ) ;
749+ self . resolve_crate ( & None , name, name, None , DUMMY_SP , PathKind :: Crate , dep_kind ) ;
750750
751751 // Sanity check the loaded crate to ensure it is indeed a panic runtime
752752 // and the panic strategy is indeed what we thought it was.
@@ -780,7 +780,7 @@ impl<'a> CrateLoader<'a> {
780780 self . inject_dependency_if ( cnum, "an allocator" ,
781781 & |data| data. needs_allocator ( ) ) ;
782782 found_required_allocator = found_required_allocator ||
783- data. explicitly_linked . get ( ) ;
783+ data. dep_kind . get ( ) == DepKind :: Explicit ;
784784 }
785785 } ) ;
786786 if !needs_allocator || found_required_allocator { return }
@@ -826,8 +826,9 @@ impl<'a> CrateLoader<'a> {
826826 } else {
827827 & self . sess . target . target . options . exe_allocation_crate
828828 } ;
829+ let dep_kind = DepKind :: Implicit ;
829830 let ( cnum, data) =
830- self . resolve_crate ( & None , name, name, None , DUMMY_SP , PathKind :: Crate , false ) ;
831+ self . resolve_crate ( & None , name, name, None , DUMMY_SP , PathKind :: Crate , dep_kind ) ;
831832
832833 // Sanity check the crate we loaded to ensure that it is indeed an
833834 // allocator.
@@ -993,7 +994,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
993994 if let PMDSource :: Owned ( lib) = ekrate. metadata {
994995 if ekrate. target_only || config:: host_triple ( ) == self . sess . opts . target_triple {
995996 let ExternCrateInfo { ref ident, ref name, .. } = info;
996- self . register_crate ( & None , ident, name, item. span , lib, true ) ;
997+ self . register_crate ( & None , ident, name, item. span , lib, DepKind :: Explicit ) ;
997998 }
998999 }
9991000
@@ -1006,7 +1007,7 @@ impl<'a> middle::cstore::CrateLoader for CrateLoader<'a> {
10061007 } ;
10071008
10081009 let ( cnum, ..) = self . resolve_crate (
1009- & None , & info. ident , & info. name , None , item. span , PathKind :: Crate , true ,
1010+ & None , & info. ident , & info. name , None , item. span , PathKind :: Crate , DepKind :: Explicit ,
10101011 ) ;
10111012
10121013 let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
0 commit comments