Skip to content

Commit

Permalink
Auto merge of #32233 - Amanieu:volatile_store, r=eddyb
Browse files Browse the repository at this point in the history
Fix LLVM assert with write_volatile

Fixes #29663
  • Loading branch information
bors committed Mar 14, 2016
2 parents af8f85c + 86fd5a0 commit d19f1b6
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/librustc_trans/trans/intrinsic.rs
Expand Up @@ -609,7 +609,11 @@ pub fn trans_intrinsic_call<'a, 'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
(_, "volatile_store") => {
let tp_ty = *substs.types.get(FnSpace, 0);
let ptr = to_arg_ty_ptr(bcx, llargs[0], tp_ty);
let val = from_arg_ty(bcx, llargs[1], tp_ty);
let val = if type_is_immediate(bcx.ccx(), tp_ty) {
from_arg_ty(bcx, llargs[1], tp_ty)
} else {
Load(bcx, llargs[1])
};
let store = VolatileStore(bcx, val, ptr);
unsafe {
llvm::LLVMSetAlignment(store, type_of::align_of(ccx, tp_ty));
Expand Down
64 changes: 64 additions & 0 deletions src/test/run-pass/issue-29663.rs
@@ -0,0 +1,64 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// write_volatile causes an LLVM assert with composite types

#![feature(volatile)]
use std::ptr::{read_volatile, write_volatile};

#[derive(Debug, Eq, PartialEq)]
struct A(u32);
#[derive(Debug, Eq, PartialEq)]
struct B(u64);
#[derive(Debug, Eq, PartialEq)]
struct C(u32, u32);
#[derive(Debug, Eq, PartialEq)]
struct D(u64, u64);
#[derive(Debug, Eq, PartialEq)]
struct E([u64; 32]);

fn main() {
unsafe {
let mut x: u32 = 0;
write_volatile(&mut x, 1);
assert_eq!(read_volatile(&x), 1);
assert_eq!(x, 1);

let mut x: u64 = 0;
write_volatile(&mut x, 1);
assert_eq!(read_volatile(&x), 1);
assert_eq!(x, 1);

let mut x = A(0);
write_volatile(&mut x, A(1));
assert_eq!(read_volatile(&x), A(1));
assert_eq!(x, A(1));

let mut x = B(0);
write_volatile(&mut x, B(1));
assert_eq!(read_volatile(&x), B(1));
assert_eq!(x, B(1));

let mut x = C(0, 0);
write_volatile(&mut x, C(1, 1));
assert_eq!(read_volatile(&x), C(1, 1));
assert_eq!(x, C(1, 1));

let mut x = D(0, 0);
write_volatile(&mut x, D(1, 1));
assert_eq!(read_volatile(&x), D(1, 1));
assert_eq!(x, D(1, 1));

let mut x = E([0; 32]);
write_volatile(&mut x, E([1; 32]));
assert_eq!(read_volatile(&x), E([1; 32]));
assert_eq!(x, E([1; 32]));
}
}

0 comments on commit d19f1b6

Please sign in to comment.