]> git.lizzy.rs Git - rust.git/commitdiff
Require #[repr(C)] on MiriFrame
authorAaron Hill <aa1ronham@gmail.com>
Sat, 26 Sep 2020 18:40:41 +0000 (14:40 -0400)
committerAaron Hill <aa1ronham@gmail.com>
Mon, 28 Sep 2020 17:44:46 +0000 (13:44 -0400)
README.md
src/shims/backtrace.rs
tests/run-pass/backtrace-api.rs
tests/run-pass/backtrace-api.stderr
tests/run-pass/backtrace-api.stdout

index 1ebacfc26bef0e9eea9fbfbaabe89539b7348e17..b84102598c1555c8a9d18e03a1143c705fd6149c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -277,6 +277,7 @@ extern "Rust" {
     /// and `MiriFrame` should be declared as follows:
     ///
     /// ```rust
+    /// #[repr(C)]
     /// struct MiriFrame {
     ///     // The name of the function being executed, encoded in UTF-8
     ///     name: Box<[u8]>,
index 57d59dd4c098bb20e49082e586bdb62b50f609cc..75cd61b0f59e7e7eeae0de3e23d50e0b4653867a 100644 (file)
@@ -1,6 +1,6 @@
 use crate::*;
 use helpers::check_arg_count;
-use rustc_middle::ty::TypeAndMut;
+use rustc_middle::ty::{self, TypeAndMut};
 use rustc_ast::ast::Mutability;
 use rustc_span::BytePos;
 use rustc_target::abi::Size;
@@ -105,7 +105,12 @@ fn handle_miri_resolve_frame(
         let lineno_alloc = Scalar::from_u32(lineno);
         let colno_alloc = Scalar::from_u32(colno);
 
-        let dest = this.force_allocation_maybe_sized(dest, MemPlaceMeta::None)?.0;
+        let dest = this.force_allocation(dest)?;
+        if let ty::Adt(adt, _) = dest.layout.ty.kind() {
+            if !adt.repr.c() {
+                throw_ub_format!("miri_resolve_frame must be declared with a `#[repr(C)]` return type");
+            }
+        }
 
         this.write_immediate(name_alloc.to_ref(), this.mplace_field(dest, 0)?.into())?;
         this.write_immediate(filename_alloc.to_ref(), this.mplace_field(dest, 1)?.into())?;
index 1322e15fc9624f3b653c0e4bb9d1e2adf8d0d2d8..a58fb83d92f76d2b75dab9c85c6fa59eb412ab86 100644 (file)
@@ -7,6 +7,7 @@
 }
 
 #[derive(Debug)]
+#[repr(C)]
 struct MiriFrame {
     name: Box<[u8]>,
     filename: Box<[u8]>,
index d94a7ce4aec229b8df3fdeca3cecd8dcfaa78d2c..92c5331d6143a8f30f8b00778c448805ee5c941d 100644 (file)
@@ -1,7 +1,7 @@
-$DIR/backtrace-api.rs:19:59 (func_c)
-$DIR/backtrace-api.rs:18:53 (func_b::<u8>)
-$DIR/backtrace-api.rs:17:50 (func_a)
-$DIR/backtrace-api.rs:23:18 (main)
+$DIR/backtrace-api.rs:20:59 (func_c)
+$DIR/backtrace-api.rs:19:53 (func_b::<u8>)
+$DIR/backtrace-api.rs:18:50 (func_a)
+$DIR/backtrace-api.rs:24:18 (main)
 RUSTLIB/src/rust/library/core/src/ops/function.rs:LL:COL (<fn() as std::ops::FnOnce<()>>::call_once - shim(fn()))
 RUSTLIB/src/rust/library/std/src/sys_common/backtrace.rs:LL:COL (std::sys_common::backtrace::__rust_begin_short_backtrace::<fn(), ()>)
 RUSTLIB/src/rust/library/std/src/rt.rs:LL:COL (std::rt::lang_start::<()>::{{closure}}#0)
index 0353f98ed76a449351fdb6cb7d825499a608e525..e4130ade62e0859b73acf6cc35df1ffbf6fcbf6f 100644 (file)
@@ -1,4 +1,4 @@
-$DIR/backtrace-api.rs:19:59 (func_c)
-$DIR/backtrace-api.rs:18:53 (func_b::<u8>)
-$DIR/backtrace-api.rs:17:50 (func_a)
-$DIR/backtrace-api.rs:23:18 (main)
+$DIR/backtrace-api.rs:20:59 (func_c)
+$DIR/backtrace-api.rs:19:53 (func_b::<u8>)
+$DIR/backtrace-api.rs:18:50 (func_a)
+$DIR/backtrace-api.rs:24:18 (main)