incr.comp.: Fix ICE caused by trying to hash INVALID_CRATE_NUM. · rust-lang/rust@4961a8e (original) (raw)

`@@ -14,7 +14,7 @@ use std::sync::Arc;

`

14

14

`use base;

`

15

15

`use monomorphize::Instance;

`

16

16

`use rustc::hir::def_id::CrateNum;

`

17

``

`-

use rustc::hir::def_id::{DefId, LOCAL_CRATE, INVALID_CRATE, CRATE_DEF_INDEX};

`

``

17

`+

use rustc::hir::def_id::{DefId, LOCAL_CRATE};

`

18

18

`use rustc::middle::exported_symbols::SymbolExportLevel;

`

19

19

`use rustc::session::config;

`

20

20

`use rustc::ty::TyCtxt;

`

`@@ -24,7 +24,7 @@ use rustc_allocator::ALLOCATOR_METHODS;

`

24

24

``

25

25

`pub type ExportedSymbols = FxHashMap<

`

26

26

`CrateNum,

`

27

``

`-

Arc<Vec<(String, DefId, SymbolExportLevel)>>,

`

``

27

`+

Arc<Vec<(String, Option, SymbolExportLevel)>>,

`

28

28

`>;

`

29

29

``

30

30

`pub fn threshold(tcx: TyCtxt) -> SymbolExportLevel {

`

`@@ -65,11 +65,13 @@ pub fn provide_local(providers: &mut Providers) {

`

65

65

`Rc::new(tcx.exported_symbols(cnum)

`

66

66

`.iter()

`

67

67

`.filter_map(|&(_, id, level)| {

`

68

``

`-

if level.is_below_threshold(export_threshold) {

`

69

``

`-

Some(id)

`

70

``

`-

} else {

`

71

``

`-

None

`

72

``

`-

}

`

``

68

`+

id.and_then(|id| {

`

``

69

`+

if level.is_below_threshold(export_threshold) {

`

``

70

`+

Some(id)

`

``

71

`+

} else {

`

``

72

`+

None

`

``

73

`+

}

`

``

74

`+

})

`

73

75

`})

`

74

76

`.collect())

`

75

77

`};

`

`@@ -95,25 +97,20 @@ pub fn provide_local(providers: &mut Providers) {

`

95

97

`let name = tcx.symbol_name(Instance::mono(tcx, def_id));

`

96

98

`let export_level = export_level(tcx, def_id);

`

97

99

`debug!("EXPORTED SYMBOL (local): {} ({:?})", name, export_level);

`

98

``

`-

(str::to_owned(&name), def_id, export_level)

`

``

100

`+

(str::to_owned(&name), Some(def_id), export_level)

`

99

101

`})

`

100

102

`.collect();

`

101

103

``

102

``

`-

const INVALID_DEF_ID: DefId = DefId {

`

103

``

`-

krate: INVALID_CRATE,

`

104

``

`-

index: CRATE_DEF_INDEX,

`

105

``

`-

};

`

106

``

-

107

104

`if let Some(_) = *tcx.sess.entry_fn.borrow() {

`

108

105

` local_crate.push(("main".to_string(),

`

109

``

`-

INVALID_DEF_ID,

`

``

106

`+

None,

`

110

107

`SymbolExportLevel::C));

`

111

108

`}

`

112

109

``

113

110

`if tcx.sess.allocator_kind.get().is_some() {

`

114

111

`for method in ALLOCATOR_METHODS {

`

115

112

` local_crate.push((format!("_rust{}", method.name),

`

116

``

`-

INVALID_DEF_ID,

`

``

113

`+

None,

`

117

114

`SymbolExportLevel::Rust));

`

118

115

`}

`

119

116

`}

`

`@@ -123,12 +120,12 @@ pub fn provide_local(providers: &mut Providers) {

`

123

120

`let idx = def_id.index;

`

124

121

`let disambiguator = tcx.sess.local_crate_disambiguator();

`

125

122

`let registrar = tcx.sess.generate_derive_registrar_symbol(disambiguator, idx);

`

126

``

`-

local_crate.push((registrar, def_id, SymbolExportLevel::C));

`

``

123

`+

local_crate.push((registrar, Some(def_id), SymbolExportLevel::C));

`

127

124

`}

`

128

125

``

129

126

`if tcx.sess.crate_types.borrow().contains(&config::CrateTypeDylib) {

`

130

127

` local_crate.push((metadata_symbol_name(tcx),

`

131

``

`-

INVALID_DEF_ID,

`

``

128

`+

None,

`

132

129

`SymbolExportLevel::Rust));

`

133

130

`}

`

134

131

`Arc::new(local_crate)

`

`@@ -178,7 +175,7 @@ pub fn provide_extern(providers: &mut Providers) {

`

178

175

`export_level(tcx, def_id)

`

179

176

`};

`

180

177

`debug!("EXPORTED SYMBOL (re-export): {} ({:?})", name, export_level);

`

181

``

`-

(str::to_owned(&name), def_id, export_level)

`

``

178

`+

(str::to_owned(&name), Some(def_id), export_level)

`

182

179

`})

`

183

180

`.collect();

`

184

181

``