Skip to content

Commit

Permalink
Overcome Sync issues with non-parallel compiler
Browse files Browse the repository at this point in the history
Per Mark's recommendation at:
#78963 (comment)
  • Loading branch information
richkadel committed Nov 12, 2020
1 parent bd0eb07 commit eb9f2bb
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
12 changes: 12 additions & 0 deletions compiler/rustc_middle/src/ty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -611,6 +611,18 @@ pub struct TyS<'tcx> {
outer_exclusive_binder: ty::DebruijnIndex,
}

impl<'tcx> TyS<'tcx> {
/// A constructor used only for internal testing.
#[allow(rustc::usage_of_ty_tykind)]
pub fn make_for_test(
kind: TyKind<'tcx>,
flags: TypeFlags,
outer_exclusive_binder: ty::DebruijnIndex,
) -> TyS<'tcx> {
TyS { kind, flags, outer_exclusive_binder }
}
}

// `TyS` is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(target_arch = "x86_64")]
static_assert_size!(TyS<'_>, 32);
Expand Down
19 changes: 10 additions & 9 deletions compiler/rustc_mir/src/transform/coverage/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,19 @@ use rustc_data_structures::graph::WithNumNodes;
use rustc_data_structures::graph::WithSuccessors;
use rustc_index::vec::{Idx, IndexVec};
use rustc_middle::mir::*;
use rustc_middle::ty::{self, TyS};
use rustc_middle::ty::{self, DebruijnIndex, TyS, TypeFlags};
use rustc_span::DUMMY_SP;

use std::lazy::SyncOnceCell;

fn dummy_ty<'tcx>() -> &'static TyS<'tcx> {
static DUMMY_TYS: SyncOnceCell<TyS<'_>> = SyncOnceCell::new();
fn dummy_ty() -> &'static TyS<'static> {
thread_local! {
static DUMMY_TYS: &'static TyS<'static> = Box::leak(box TyS::make_for_test(
ty::Bool,
TypeFlags::empty(),
DebruijnIndex::from_usize(0),
));
}

&DUMMY_TYS.get_or_init(|| {
let fake_type_bytes = vec![0 as u8; std::mem::size_of::<TyS<'_>>()];
unsafe { std::ptr::read_unaligned::<TyS<'_>>(fake_type_bytes.as_ptr() as *const TyS<'_>) }
})
&DUMMY_TYS.with(|tys| *tys)
}

struct MockBlocks<'tcx> {
Expand Down

0 comments on commit eb9f2bb

Please sign in to comment.