summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_metadata/src/rmeta/encoder.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_metadata/src/rmeta/encoder.rs')
-rw-r--r--compiler/rustc_metadata/src/rmeta/encoder.rs107
1 files changed, 63 insertions, 44 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs
index a4ba94327..2042863d1 100644
--- a/compiler/rustc_metadata/src/rmeta/encoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/encoder.rs
@@ -525,9 +525,17 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
// the remapped version -- as is necessary for reproducible builds.
let mut source_file = match source_file.name {
FileName::Real(ref original_file_name) => {
- let adapted_file_name = source_map
- .path_mapping()
- .to_embeddable_absolute_path(original_file_name.clone(), working_directory);
+ let adapted_file_name = if self.tcx.sess.should_prefer_remapped_for_codegen() {
+ source_map.path_mapping().to_embeddable_absolute_path(
+ original_file_name.clone(),
+ working_directory,
+ )
+ } else {
+ source_map.path_mapping().to_local_embeddable_absolute_path(
+ original_file_name.clone(),
+ working_directory,
+ )
+ };
if adapted_file_name != *original_file_name {
let mut adapted: SourceFile = (**source_file).clone();
@@ -848,7 +856,7 @@ fn should_encode_span(def_kind: DefKind) -> bool {
| DefKind::Field
| DefKind::Impl { .. }
| DefKind::Closure
- | DefKind::Generator => true,
+ | DefKind::Coroutine => true,
DefKind::ForeignMod | DefKind::GlobalAsm => false,
}
}
@@ -889,7 +897,7 @@ fn should_encode_attrs(def_kind: DefKind) -> bool {
| DefKind::OpaqueTy
| DefKind::LifetimeParam
| DefKind::GlobalAsm
- | DefKind::Generator => false,
+ | DefKind::Coroutine => false,
}
}
@@ -925,7 +933,7 @@ fn should_encode_expn_that_defined(def_kind: DefKind) -> bool {
| DefKind::LifetimeParam
| DefKind::GlobalAsm
| DefKind::Closure
- | DefKind::Generator => false,
+ | DefKind::Coroutine => false,
}
}
@@ -960,7 +968,7 @@ fn should_encode_visibility(def_kind: DefKind) -> bool {
| DefKind::GlobalAsm
| DefKind::Impl { .. }
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ExternCrate => false,
}
}
@@ -996,7 +1004,7 @@ fn should_encode_stability(def_kind: DefKind) -> bool {
| DefKind::InlineConst
| DefKind::GlobalAsm
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ExternCrate => false,
}
}
@@ -1046,14 +1054,14 @@ fn should_encode_mir(
|| (tcx.sess.opts.output_types.should_codegen()
&& reachable_set.contains(&def_id)
&& (generics.requires_monomorphization(tcx)
- || tcx.codegen_fn_attrs(def_id).requests_inline()));
+ || tcx.cross_crate_inlinable(def_id)));
// The function has a `const` modifier or is in a `#[const_trait]`.
let is_const_fn = tcx.is_const_fn_raw(def_id.to_def_id())
|| tcx.is_const_default_method(def_id.to_def_id());
(is_const_fn, opt)
}
- // Generators require optimized MIR to compute layout.
- DefKind::Generator => (false, true),
+ // Coroutines require optimized MIR to compute layout.
+ DefKind::Coroutine => (false, true),
// The others don't have MIR.
_ => (false, false),
}
@@ -1089,7 +1097,7 @@ fn should_encode_variances<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, def_kind: Def
| DefKind::InlineConst
| DefKind::GlobalAsm
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ExternCrate => false,
DefKind::TyAlias => tcx.type_alias_is_lazy(def_id),
}
@@ -1119,7 +1127,7 @@ fn should_encode_generics(def_kind: DefKind) -> bool {
| DefKind::Field
| DefKind::TyParam
| DefKind::Closure
- | DefKind::Generator => true,
+ | DefKind::Coroutine => true,
DefKind::Mod
| DefKind::ForeignMod
| DefKind::ConstParam
@@ -1148,14 +1156,15 @@ fn should_encode_type(tcx: TyCtxt<'_>, def_id: LocalDefId, def_kind: DefKind) ->
| DefKind::AssocFn
| DefKind::AssocConst
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ConstParam
| DefKind::AnonConst
| DefKind::InlineConst => true,
DefKind::OpaqueTy => {
let origin = tcx.opaque_type_origin(def_id);
- if let hir::OpaqueTyOrigin::FnReturn(fn_def_id) | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin
+ if let hir::OpaqueTyOrigin::FnReturn(fn_def_id)
+ | hir::OpaqueTyOrigin::AsyncFn(fn_def_id) = origin
&& let hir::Node::TraitItem(trait_item) = tcx.hir().get_by_def_id(fn_def_id)
&& let (_, hir::TraitFn::Required(..)) = trait_item.expect_fn()
{
@@ -1208,7 +1217,7 @@ fn should_encode_fn_sig(def_kind: DefKind) -> bool {
| DefKind::Impl { .. }
| DefKind::AssocConst
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ConstParam
| DefKind::AnonConst
| DefKind::InlineConst
@@ -1247,7 +1256,7 @@ fn should_encode_constness(def_kind: DefKind) -> bool {
| DefKind::OpaqueTy
| DefKind::Impl { of_trait: false }
| DefKind::ForeignTy
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ConstParam
| DefKind::InlineConst
| DefKind::AssocTy
@@ -1282,7 +1291,7 @@ fn should_encode_const(def_kind: DefKind) -> bool {
| DefKind::Impl { .. }
| DefKind::AssocFn
| DefKind::Closure
- | DefKind::Generator
+ | DefKind::Coroutine
| DefKind::ConstParam
| DefKind::AssocTy
| DefKind::TyParam
@@ -1357,7 +1366,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
if should_encode_expn_that_defined(def_kind) {
record!(self.tables.expn_that_defined[def_id] <- self.tcx.expn_that_defined(def_id));
}
- if should_encode_span(def_kind) && let Some(ident_span) = tcx.def_ident_span(def_id) {
+ if should_encode_span(def_kind)
+ && let Some(ident_span) = tcx.def_ident_span(def_id)
+ {
record!(self.tables.def_ident_span[def_id] <- ident_span);
}
if def_kind.has_codegen_attrs() {
@@ -1435,9 +1446,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
self.encode_info_for_assoc_item(def_id);
}
}
- if let DefKind::Generator = def_kind {
- let data = self.tcx.generator_kind(def_id).unwrap();
- record!(self.tables.generator_kind[def_id] <- data);
+ if let DefKind::Coroutine = def_kind {
+ let data = self.tcx.coroutine_kind(def_id).unwrap();
+ record!(self.tables.coroutine_kind[def_id] <- data);
}
if let DefKind::Enum | DefKind::Struct | DefKind::Union = def_kind {
self.encode_info_for_adt(local_id);
@@ -1612,13 +1623,16 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
debug!("EntryBuilder::encode_mir({:?})", def_id);
if encode_opt {
record!(self.tables.optimized_mir[def_id.to_def_id()] <- tcx.optimized_mir(def_id));
+ self.tables
+ .cross_crate_inlinable
+ .set(def_id.to_def_id().index, Some(self.tcx.cross_crate_inlinable(def_id)));
record!(self.tables.closure_saved_names_of_captured_variables[def_id.to_def_id()]
<- tcx.closure_saved_names_of_captured_variables(def_id));
- if let DefKind::Generator = self.tcx.def_kind(def_id)
- && let Some(witnesses) = tcx.mir_generator_witnesses(def_id)
+ if let DefKind::Coroutine = self.tcx.def_kind(def_id)
+ && let Some(witnesses) = tcx.mir_coroutine_witnesses(def_id)
{
- record!(self.tables.mir_generator_witnesses[def_id.to_def_id()] <- witnesses);
+ record!(self.tables.mir_coroutine_witnesses[def_id.to_def_id()] <- witnesses);
}
}
if encode_const {
@@ -1642,10 +1656,10 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
}
record!(self.tables.promoted_mir[def_id.to_def_id()] <- tcx.promoted_mir(def_id));
- if let DefKind::Generator = self.tcx.def_kind(def_id)
- && let Some(witnesses) = tcx.mir_generator_witnesses(def_id)
+ if let DefKind::Coroutine = self.tcx.def_kind(def_id)
+ && let Some(witnesses) = tcx.mir_coroutine_witnesses(def_id)
{
- record!(self.tables.mir_generator_witnesses[def_id.to_def_id()] <- witnesses);
+ record!(self.tables.mir_coroutine_witnesses[def_id.to_def_id()] <- witnesses);
}
let instance = ty::InstanceDef::Item(def_id.to_def_id());
@@ -1958,8 +1972,11 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
record!(self.tables.impl_trait_ref[def_id] <- trait_ref);
let trait_ref = trait_ref.instantiate_identity();
- let simplified_self_ty =
- fast_reject::simplify_type(self.tcx, trait_ref.self_ty(), TreatParams::AsCandidateKey);
+ let simplified_self_ty = fast_reject::simplify_type(
+ self.tcx,
+ trait_ref.self_ty(),
+ TreatParams::AsCandidateKey,
+ );
fx_hash_map
.entry(trait_ref.def_id)
.or_default()
@@ -2369,30 +2386,32 @@ pub fn rendered_const<'tcx>(tcx: TyCtxt<'tcx>, body: hir::BodyId) -> String {
}
}
- let classification = classify(value);
-
- if classification == Literal
- && !value.span.from_expansion()
- && let Ok(snippet) = tcx.sess.source_map().span_to_snippet(value.span) {
- // For literals, we avoid invoking the pretty-printer and use the source snippet instead to
- // preserve certain stylistic choices the user likely made for the sake legibility like
+ match classify(value) {
+ // For non-macro literals, we avoid invoking the pretty-printer and use the source snippet
+ // instead to preserve certain stylistic choices the user likely made for the sake of
+ // legibility, like:
//
// * hexadecimal notation
// * underscores
// * character escapes
//
// FIXME: This passes through `-/*spacer*/0` verbatim.
- snippet
- } else if classification == Simple {
+ Literal if !value.span.from_expansion()
+ && let Ok(snippet) = tcx.sess.source_map().span_to_snippet(value.span) => {
+ snippet
+ }
+
// Otherwise we prefer pretty-printing to get rid of extraneous whitespace, comments and
// other formatting artifacts.
- id_to_string(&hir, body.hir_id)
- } else if tcx.def_kind(hir.body_owner_def_id(body).to_def_id()) == DefKind::AnonConst {
+ Literal | Simple => id_to_string(&hir, body.hir_id),
+
// FIXME: Omit the curly braces if the enclosing expression is an array literal
// with a repeated element (an `ExprKind::Repeat`) as in such case it
// would not actually need any disambiguation.
- "{ _ }".to_owned()
- } else {
- "_".to_owned()
+ Complex => if tcx.def_kind(hir.body_owner_def_id(body).to_def_id()) == DefKind::AnonConst {
+ "{ _ }".to_owned()
+ } else {
+ "_".to_owned()
+ }
}
}