Add some #[repr(C)] annotations

This commit is contained in:
Richard Feldman 2022-02-02 18:47:02 -05:00
parent cd7b219764
commit dd8f63b1ab
No known key found for this signature in database
GPG key ID: 7E4127D1E4241798

View file

@ -47,6 +47,7 @@ macro_rules! run_jit_function {
use std::mem::MaybeUninit; use std::mem::MaybeUninit;
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
#[repr(C)]
struct Failure { struct Failure {
start_line: u32, start_line: u32,
end_line: u32, end_line: u32,
@ -60,9 +61,14 @@ macro_rules! run_jit_function {
.ok() .ok()
.ok_or(format!("Unable to JIT compile `{}`", $main_fn_name)) .ok_or(format!("Unable to JIT compile `{}`", $main_fn_name))
.expect("errored"); .expect("errored");
let get_expect_failures: libloading::Symbol<
unsafe extern "C" fn() -> (*const Failure, usize), #[repr(C)]
> = $lib struct Failures {
failures: *const Failure,
count: usize,
}
let get_expect_failures: libloading::Symbol<unsafe extern "C" fn() -> Failures> = $lib
.get(bitcode::UTILS_GET_EXPECT_FAILURES.as_bytes()) .get(bitcode::UTILS_GET_EXPECT_FAILURES.as_bytes())
.ok() .ok()
.ok_or(format!( .ok_or(format!(
@ -73,15 +79,13 @@ macro_rules! run_jit_function {
let mut main_result = MaybeUninit::uninit(); let mut main_result = MaybeUninit::uninit();
main(main_result.as_mut_ptr()); main(main_result.as_mut_ptr());
let (failures_ptr, num_failures) = get_expect_failures(); let failures = get_expect_failures();
let mut failures = std::vec::Vec::new();
for index in 0..num_failures { if failures.count > 0 {
failures.push(*failures_ptr.add(index)); let failures =
} unsafe { core::slice::from_raw_parts(failures.failures, failures.count) };
if (num_failures > 0) { panic!("Failed with {} failures. Failures: ", failures.len());
panic!("Failed with {} failures. Failures: ", num_failures);
} }
match main_result.assume_init().into() { match main_result.assume_init().into() {