aboutsummaryrefslogtreecommitdiff
path: root/CodeGen/CGComplexExpr.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-08-21 18:02:02 +0000
committerChris Lattner <sabre@nondot.org>2007-08-21 18:02:02 +0000
commit76e8033b82f0d8921accf59f321c42d74a0f992f (patch)
tree81c752472e1e81cca13fe7650b5960f8e0007296 /CodeGen/CGComplexExpr.cpp
parent5508518a2702b00be3b15a26d772bde968972f54 (diff)
allow support for volatile lvalues even though it's still not right.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41239 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'CodeGen/CGComplexExpr.cpp')
-rw-r--r--CodeGen/CGComplexExpr.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/CodeGen/CGComplexExpr.cpp b/CodeGen/CGComplexExpr.cpp
index 0382796501..86b54ae8fa 100644
--- a/CodeGen/CGComplexExpr.cpp
+++ b/CodeGen/CGComplexExpr.cpp
@@ -44,16 +44,18 @@ public:
/// value l-value, this method emits the address of the l-value, then loads
/// and returns the result.
ComplexPairTy EmitLoadOfLValue(const Expr *E) {
- return EmitLoadOfComplex(CGF.EmitLValue(E).getAddress());
+ LValue LV = CGF.EmitLValue(E);
+ // FIXME: Volatile
+ return EmitLoadOfComplex(LV.getAddress(), false);
}
/// EmitLoadOfComplex - Given a pointer to a complex value, emit code to load
/// the real and imaginary pieces.
- ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr);
+ ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile);
/// EmitStoreOfComplex - Store the specified real/imag parts into the
/// specified value pointer.
- void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr);
+ void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr, bool isVol);
//===--------------------------------------------------------------------===//
// Visitor Methods
@@ -101,31 +103,31 @@ public:
/// EmitLoadOfComplex - Given an RValue reference for a complex, emit code to
/// load the real and imaginary pieces, returning them as Real/Imag.
-ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr) {
+ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr,
+ bool isVolatile) {
llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
llvm::Constant *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
// FIXME: It would be nice to make this "Ptr->getName()+realp"
llvm::Value *RealPtr = Builder.CreateGEP(SrcPtr, Zero, Zero, "realp");
llvm::Value *ImagPtr = Builder.CreateGEP(SrcPtr, Zero, One, "imagp");
- // FIXME: Handle volatility.
// FIXME: It would be nice to make this "Ptr->getName()+real"
- llvm::Value *Real = Builder.CreateLoad(RealPtr, "real");
- llvm::Value *Imag = Builder.CreateLoad(ImagPtr, "imag");
+ llvm::Value *Real = Builder.CreateLoad(RealPtr, isVolatile, "real");
+ llvm::Value *Imag = Builder.CreateLoad(ImagPtr, isVolatile, "imag");
return ComplexPairTy(Real, Imag);
}
/// EmitStoreOfComplex - Store the specified real/imag parts into the
/// specified value pointer.
-void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy V, llvm::Value *Ptr) {
+void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr,
+ bool isVolatile) {
llvm::Constant *Zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0);
llvm::Constant *One = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1);
llvm::Value *RealPtr = Builder.CreateGEP(Ptr, Zero, Zero, "real");
llvm::Value *ImagPtr = Builder.CreateGEP(Ptr, Zero, One, "imag");
- // FIXME: Handle volatility.
- Builder.CreateStore(V.first, RealPtr);
- Builder.CreateStore(V.second, ImagPtr);
+ Builder.CreateStore(Val.first, RealPtr, isVolatile);
+ Builder.CreateStore(Val.second, ImagPtr, isVolatile);
}
@@ -176,7 +178,7 @@ ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
// Store into it.
// FIXME: Volatility!
- EmitStoreOfComplex(Val, LHS.getAddress());
+ EmitStoreOfComplex(Val, LHS.getAddress(), false);
return Val;
}