diff --git a/Cargo.toml b/Cargo.toml
index 86347a006d7..e0a33638139 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -52,7 +52,7 @@ cranelift-simplejit = { git = "https://github.com/CraneStation/cranelift.git" }
 # By compiling dependencies with optimizations, performing tests gets much faster.
 opt-level = 3
 
-[profile.dev.overrides."rustc_codegen_cranelift"]
+[profile.dev.package.rustc_codegen_cranelift]
 # Disabling optimizations for cg_clif itself makes compilation after a change faster.
 opt-level = 0
 
@@ -62,14 +62,14 @@ opt-level = 0
 opt-level = 0
 debug = false
 
-[profile.dev.overrides.cranelift-codegen-meta]
+[profile.dev.package.cranelift-codegen-meta]
 opt-level = 0
 debug = false
 
-[profile.dev.overrides.syn]
+[profile.dev.package.syn]
 opt-level = 0
 debug = false
 
-[profile.dev.overrides.synstructure]
+[profile.dev.package.synstructure]
 opt-level = 0
 debug = false
diff --git a/example/mini_core.rs b/example/mini_core.rs
index a271cb6e62e..1d8942c6ab2 100644
--- a/example/mini_core.rs
+++ b/example/mini_core.rs
@@ -1,6 +1,6 @@
 #![feature(
     no_core, lang_items, intrinsics, unboxed_closures, type_ascription, extern_types,
-    untagged_unions, decl_macro, rustc_attrs
+    untagged_unions, decl_macro, rustc_attrs, transparent_unions
 )]
 #![no_core]
 #![allow(dead_code)]
@@ -448,10 +448,17 @@ pub trait Drop {
     fn drop(&mut self);
 }
 
-#[allow(unions_with_drop_fields)]
+#[lang = "manually_drop"]
+#[repr(transparent)]
+pub struct ManuallyDrop<T: ?Sized> {
+    pub value: T,
+}
+
+#[lang = "maybe_uninit"]
+#[repr(transparent)]
 pub union MaybeUninit<T> {
     pub uninit: (),
-    pub value: T,
+    pub value: ManuallyDrop<T>,
 }
 
 pub mod intrinsics {
diff --git a/example/mini_core_hello_world.rs b/example/mini_core_hello_world.rs
index 76387e8c036..fdc71af4437 100644
--- a/example/mini_core_hello_world.rs
+++ b/example/mini_core_hello_world.rs
@@ -196,7 +196,7 @@ fn main() {
         }
 
         unsafe fn uninitialized<T>() -> T {
-            MaybeUninit { uninit: () }.value
+            MaybeUninit { uninit: () }.value.value
         }
 
         zeroed::<(u8, u8)>();
diff --git a/patches/0017-Fix-libtest-compilation.patch b/patches/0017-Fix-libtest-compilation.patch
index b7a7267cd78..c76e2e2f8b4 100644
--- a/patches/0017-Fix-libtest-compilation.patch
+++ b/patches/0017-Fix-libtest-compilation.patch
@@ -12,18 +12,18 @@ index 8b76080..9e65de2 100644
 --- a/src/libtest/lib.rs
 +++ b/src/libtest/lib.rs
 @@ -52,7 +52,7 @@ use std::fmt;
- use std::fs::File;
- use std::io;
- use std::io::prelude::*;
--use std::panic::{self, catch_unwind, AssertUnwindSafe, PanicInfo};
-+use std::panic::{self, PanicInfo};
- use std::path::PathBuf;
- use std::process;
- use std::process::{ExitStatus, Command, Termination};
+     env,
+     io,
+     io::prelude::Write,
+-    panic::{self, catch_unwind, AssertUnwindSafe, PanicInfo},
++    panic::{self, PanicInfo},
+     process,
+     process::{Command, Termination},
+     sync::mpsc::{channel, Sender},
 @@ -1493,7 +1493,7 @@ pub fn run_test(
      fn run_test_inner(
          desc: TestDesc,
-         monitor_ch: Sender<MonitorMsg>,
+         monitor_ch: Sender<CompletedTest>,
 -        testfn: Box<dyn FnOnce() + Send>,
 +        testfn: Box<impl FnOnce() + Send + 'static>,
          opts: TestRunOpts,
@@ -65,8 +65,8 @@ index 8b76080..9e65de2 100644
      report_time: bool,
 -    testfn: Box<dyn FnOnce() + Send>,
 +    testfn: Box<impl FnOnce() + Send + 'static>,
-     monitor_ch: Sender<MonitorMsg>,
-     time_opts: Option<TestTimeOptions>,
+     monitor_ch: Sender<CompletedTest>,
+     time_opts: Option<time::TestTimeOptions>,
  ) {
      // Buffer for capturing standard I/O
      let data = Arc::new(Mutex::new(Vec::new()));
@@ -75,12 +75,12 @@ index 8b76080..9e65de2 100644
          None
      };
 -    let result = catch_unwind(AssertUnwindSafe(testfn));
-+    let result = Ok::<(), Box<dyn Any + Send>>(testfn());
++    let result = Ok::<(), Box<dyn std::any::Any + Send>>(testfn());
      let exec_time = start.map(|start| {
          let duration = start.elapsed();
          TestExecTime(duration)
 @@ -1688,10 +1676,10 @@ fn spawn_test_subprocess(desc: TestDesc, report_time: bool, monitor_ch: Sender<M
-     monitor_ch.send((desc.clone(), result, exec_time, test_output)).unwrap();
+     monitor_ch.send(message).unwrap();
  }
  
  fn run_test_in_spawned_subprocess(
diff --git a/prepare.sh b/prepare.sh
index 6795558422f..2d9d1d9f908 100755
--- a/prepare.sh
+++ b/prepare.sh
@@ -1,7 +1,7 @@
 #!/bin/bash --verbose
 set -e
 
-rustup component add rust-src
+rustup component add rust-src rustc-dev
 ./build_sysroot/prepare_sysroot_src.sh
 cargo install hyperfine || echo "Skipping hyperfine install"
 
diff --git a/src/common.rs b/src/common.rs
index ff38c71fde9..c3563dc0533 100644
--- a/src/common.rs
+++ b/src/common.rs
@@ -286,7 +286,9 @@ pub struct FunctionCx<'clif, 'tcx, B: Backend + 'static> {
     pub clif_comments: crate::pretty_clif::CommentWriter,
     pub constants_cx: &'clif mut crate::constant::ConstantCx,
     pub caches: &'clif mut Caches<'tcx>,
-    pub source_info_set: indexmap::IndexSet<SourceInfo>,
+
+    // FIXME switch back to `SourceInfo`, once it derives `Eq` and `Hash` again.
+    pub source_info_set: indexmap::IndexSet<(Span, mir::SourceScope)>,
 }
 
 impl<'tcx, B: Backend> LayoutOf for FunctionCx<'_, 'tcx, B> {
@@ -365,7 +367,7 @@ impl<'tcx, B: Backend + 'static> FunctionCx<'_, 'tcx, B> {
     }
 
     pub fn set_debug_loc(&mut self, source_info: mir::SourceInfo) {
-        let (index, _) = self.source_info_set.insert_full(source_info);
+        let (index, _) = self.source_info_set.insert_full((source_info.span, source_info.scope));
         self.bcx.set_srcloc(SourceLoc::new(index as u32));
     }
 }
diff --git a/src/debuginfo.rs b/src/debuginfo.rs
index 762fa8668bf..e6d133c6451 100644
--- a/src/debuginfo.rs
+++ b/src/debuginfo.rs
@@ -252,7 +252,7 @@ impl<'a, 'tcx> FunctionDebugContext<'a, 'tcx> {
         tcx: TyCtxt,
         context: &Context,
         isa: &dyn cranelift::codegen::isa::TargetIsa,
-        source_info_set: &indexmap::IndexSet<SourceInfo>,
+        source_info_set: &indexmap::IndexSet<(Span, mir::SourceScope)>,
     ) {
         let line_program = &mut self.debug_context.dwarf.unit.line_program;
 
@@ -292,7 +292,7 @@ impl<'a, 'tcx> FunctionDebugContext<'a, 'tcx> {
                 line_program.row().address_offset = offset as u64;
                 if !srcloc.is_default() {
                     let source_info = *source_info_set.get_index(srcloc.bits() as usize).unwrap();
-                    create_row_for_span(line_program, source_info.span);
+                    create_row_for_span(line_program, source_info.0);
                 } else {
                     create_row_for_span(line_program, self.mir_span);
                 }