summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-09-21 23:40:48 +0000
committerChris Lattner <sabre@nondot.org>2010-09-21 23:40:48 +0000
commitb2f659b7a0b787a933c5bd6d665ea0299e5b7ad1 (patch)
treec35b270709d4db5dc9067c0d69548154c04612d0 /clang/lib/CodeGen
parentc9066d3072637bd638b31fbac168b87142e02874 (diff)
downloadbcm5719-llvm-b2f659b7a0b787a933c5bd6d665ea0299e5b7ad1.tar.gz
bcm5719-llvm-b2f659b7a0b787a933c5bd6d665ea0299e5b7ad1.zip
fix the rest of rdar://8461279 - clang miscompiles address-space qualified atomics
llvm-svn: 114503
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp21
1 files changed, 13 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index d00f1c1d794..9e7510461b6 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -85,15 +85,17 @@ static Value *EmitCallWithBarrier(CodeGenFunction &CGF, Value *Fn,
/// and the expression node.
static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
Intrinsic::ID Id, const CallExpr *E) {
+ llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
+ unsigned AddrSpace =
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getType()));
- const llvm::Type *PtrType = ValueType->getPointerTo();
+ const llvm::Type *PtrType = ValueType->getPointerTo(AddrSpace);
const llvm::Type *IntrinsicTypes[2] = { ValueType, PtrType };
Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes, 2);
- Value *Args[2] = { CGF.Builder.CreateBitCast(CGF.EmitScalarExpr(E->getArg(0)),
- PtrType),
+ Value *Args[2] = { CGF.Builder.CreateBitCast(DestPtr, PtrType),
EmitCastToInt(CGF, ValueType,
CGF.EmitScalarExpr(E->getArg(1))) };
return RValue::get(EmitCastFromInt(CGF, E->getType(),
@@ -107,15 +109,18 @@ static RValue EmitBinaryAtomic(CodeGenFunction &CGF,
static RValue EmitBinaryAtomicPost(CodeGenFunction &CGF,
Intrinsic::ID Id, const CallExpr *E,
Instruction::BinaryOps Op) {
+ llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
+ unsigned AddrSpace =
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
+
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getType()));
- const llvm::Type *PtrType = ValueType->getPointerTo();
+ const llvm::Type *PtrType = ValueType->getPointerTo(AddrSpace);
const llvm::Type *IntrinsicTypes[2] = { ValueType, PtrType };
Value *AtomF = CGF.CGM.getIntrinsic(Id, IntrinsicTypes, 2);
- Value *Args[2] = { CGF.Builder.CreateBitCast(CGF.EmitScalarExpr(E->getArg(0)),
- PtrType),
+ Value *Args[2] = { CGF.Builder.CreateBitCast(DestPtr, PtrType),
EmitCastToInt(CGF, ValueType,
CGF.EmitScalarExpr(E->getArg(1))) };
Value *Result = EmitCallWithBarrier(CGF, AtomF, Args, Args + 2);
@@ -790,7 +795,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
case Builtin::BI__sync_val_compare_and_swap_16: {
llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
unsigned AddrSpace =
- cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();;
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getType()));
@@ -816,7 +821,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
case Builtin::BI__sync_bool_compare_and_swap_16: {
llvm::Value *DestPtr = CGF.EmitScalarExpr(E->getArg(0));
unsigned AddrSpace =
- cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();;
+ cast<llvm::PointerType>(DestPtr->getType())->getAddressSpace();
const llvm::Type *ValueType =
llvm::IntegerType::get(CGF.getLLVMContext(),
CGF.getContext().getTypeSize(E->getArg(1)->getType()));
OpenPOWER on IntegriCloud