Pass type when creating atomic load
Instead of determining it from the pointer type, explicitly pass the type to load.
This commit is contained in:
parent
619c27a539
commit
33e9a6b565
5 changed files with 17 additions and 10 deletions
|
@ -448,15 +448,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
if ty.is_unsafe_ptr() {
|
||||
// Some platforms do not support atomic operations on pointers,
|
||||
// so we cast to integer first...
|
||||
let ptr_llty = bx.type_ptr_to(bx.type_isize());
|
||||
let llty = bx.type_isize();
|
||||
let ptr_llty = bx.type_ptr_to(llty);
|
||||
source = bx.pointercast(source, ptr_llty);
|
||||
}
|
||||
let result = bx.atomic_load(source, order, size);
|
||||
if ty.is_unsafe_ptr() {
|
||||
let result = bx.atomic_load(llty, source, order, size);
|
||||
// ... and then cast the result back to a pointer
|
||||
bx.inttoptr(result, bx.backend_type(layout))
|
||||
} else {
|
||||
result
|
||||
bx.atomic_load(bx.backend_type(layout), source, order, size)
|
||||
}
|
||||
} else {
|
||||
return invalid_monomorphization(ty);
|
||||
|
|
|
@ -139,7 +139,13 @@ pub trait BuilderMethods<'a, 'tcx>:
|
|||
|
||||
fn load(&mut self, ptr: Self::Value, align: Align) -> Self::Value;
|
||||
fn volatile_load(&mut self, ptr: Self::Value) -> Self::Value;
|
||||
fn atomic_load(&mut self, ptr: Self::Value, order: AtomicOrdering, size: Size) -> Self::Value;
|
||||
fn atomic_load(
|
||||
&mut self,
|
||||
ty: Self::Type,
|
||||
ptr: Self::Value,
|
||||
order: AtomicOrdering,
|
||||
size: Size,
|
||||
) -> Self::Value;
|
||||
fn load_operand(&mut self, place: PlaceRef<'tcx, Self::Value>)
|
||||
-> OperandRef<'tcx, Self::Value>;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue