Skip to content

Commit 474d998

Browse files
committed
rustllvm: Use target alignment for atomic load/store
1 parent 26babaa commit 474d998

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

src/librustc/lib/llvm.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,13 +1571,15 @@ pub mod llvm {
15711571
pub unsafe fn LLVMBuildAtomicLoad(B: BuilderRef,
15721572
PointerVal: ValueRef,
15731573
Name: *c_char,
1574-
Order: AtomicOrdering)
1574+
Order: AtomicOrdering,
1575+
Alignment: c_uint)
15751576
-> ValueRef;
15761577

15771578
pub unsafe fn LLVMBuildAtomicStore(B: BuilderRef,
15781579
Val: ValueRef,
15791580
Ptr: ValueRef,
1580-
Order: AtomicOrdering)
1581+
Order: AtomicOrdering,
1582+
Alignment: c_uint)
15811583
-> ValueRef;
15821584

15831585
pub unsafe fn LLVMBuildAtomicCmpXchg(B: BuilderRef,

src/librustc/middle/trans/build.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use lib::llvm::{Opcode, IntPredicate, RealPredicate, False};
1414
use lib::llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef, ModuleRef};
1515
use lib;
1616
use middle::trans::common::*;
17+
use middle::trans::machine::llalign_of_min;
1718
use syntax::codemap::span;
1819

1920
use core::hashmap::HashMap;
@@ -544,7 +545,8 @@ pub fn AtomicLoad(cx: block, PointerVal: ValueRef, order: AtomicOrdering) -> Val
544545
return llvm::LLVMGetUndef(ccx.int_type);
545546
}
546547
count_insn(cx, "load.atomic");
547-
return llvm::LLVMBuildAtomicLoad(B(cx), PointerVal, noname(), order);
548+
let align = llalign_of_min(*ccx, ccx.int_type);
549+
return llvm::LLVMBuildAtomicLoad(B(cx), PointerVal, noname(), order, align as c_uint);
548550
}
549551
}
550552
@@ -558,7 +560,6 @@ pub fn LoadRangeAssert(cx: block, PointerVal: ValueRef, lo: c_ulonglong,
558560
let min = llvm::LLVMConstInt(t, lo, signed);
559561
let max = llvm::LLVMConstInt(t, hi, signed);
560562
561-
562563
do vec::as_imm_buf([min, max]) |ptr, len| {
563564
llvm::LLVMSetMetadata(value, lib::llvm::MD_range as c_uint,
564565
llvm::LLVMMDNode(ptr, len as c_uint));
@@ -586,7 +587,8 @@ pub fn AtomicStore(cx: block, Val: ValueRef, Ptr: ValueRef, order: AtomicOrderin
586587
val_str(cx.ccx().tn, Val),
587588
val_str(cx.ccx().tn, Ptr));
588589
count_insn(cx, "store.atomic");
589-
llvm::LLVMBuildAtomicStore(B(cx), Val, Ptr, order);
590+
let align = llalign_of_min(cx.ccx(), cx.ccx().int_type);
591+
llvm::LLVMBuildAtomicStore(B(cx), Val, Ptr, order, align as c_uint);
590592
}
591593
}
592594

src/rustllvm/RustWrapper.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -548,22 +548,24 @@ extern "C" LLVMTypeRef LLVMMetadataType(void) {
548548
extern "C" LLVMValueRef LLVMBuildAtomicLoad(LLVMBuilderRef B,
549549
LLVMValueRef source,
550550
const char* Name,
551-
AtomicOrdering order) {
551+
AtomicOrdering order,
552+
unsigned alignment) {
552553
LoadInst* li = new LoadInst(unwrap(source),0);
553554
li->setVolatile(true);
554555
li->setAtomic(order);
555-
li->setAlignment(sizeof(intptr_t));
556+
li->setAlignment(alignment);
556557
return wrap(unwrap(B)->Insert(li, Name));
557558
}
558559

559560
extern "C" LLVMValueRef LLVMBuildAtomicStore(LLVMBuilderRef B,
560-
LLVMValueRef val,
561-
LLVMValueRef target,
562-
AtomicOrdering order) {
561+
LLVMValueRef val,
562+
LLVMValueRef target,
563+
AtomicOrdering order,
564+
unsigned alignment) {
563565
StoreInst* si = new StoreInst(unwrap(val),unwrap(target));
564566
si->setVolatile(true);
565567
si->setAtomic(order);
566-
si->setAlignment(sizeof(intptr_t));
568+
si->setAlignment(alignment);
567569
return wrap(unwrap(B)->Insert(si));
568570
}
569571

0 commit comments

Comments
 (0)