aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2008-11-17 01:58:55 +0000
committerAnders Carlsson <andersca@mac.com>2008-11-17 01:58:55 +0000
commitaa432560efb1ff10aec504a68fe909cd9ae7c1a2 (patch)
tree276b35b968a8cf296263f29dcfc8a3688a350f4b /lib/CodeGen/CGExprConstant.cpp
parent529569e68d10b0fd3750fd2124faf742249b846b (diff)
More expr constant work. (Off by default).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59433 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r--lib/CodeGen/CGExprConstant.cpp33
1 files changed, 25 insertions, 8 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index 41379b5b4a..bfe43c3c87 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -106,7 +106,7 @@ public:
unsigned i = 0;
bool RewriteType = false;
for (; i < NumInitableElts; ++i) {
- llvm::Constant *C = Visit(ILE->getInit(i));
+ llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF);
RewriteType |= (C->getType() != ElemTy);
Elts.push_back(C);
}
@@ -130,7 +130,7 @@ public:
void InsertBitfieldIntoStruct(std::vector<llvm::Constant*>& Elts,
FieldDecl* Field, Expr* E) {
// Calculate the value to insert
- llvm::Constant *C = Visit(E);
+ llvm::Constant *C = CGM.EmitConstantExpr(E, CGF);
llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C);
if (!CI) {
CGM.ErrorUnsupported(E, "bitfield initialization");
@@ -213,7 +213,7 @@ public:
InsertBitfieldIntoStruct(Elts, curField, ILE->getInit(EltNo));
} else {
unsigned FieldNo = CGM.getTypes().getLLVMFieldNo(curField);
- llvm::Constant* C = Visit(ILE->getInit(EltNo));
+ llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(EltNo), CGF);
RewriteType |= (C->getType() != Elts[FieldNo]->getType());
Elts[FieldNo] = C;
}
@@ -261,7 +261,7 @@ public:
return llvm::ConstantArray::get(RetTy, Elts);
}
- llvm::Constant *C = Visit(ILE->getInit(0));
+ llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(0), CGF);
// Build a struct with the union sub-element as the first member,
// and padded to the appropriate size
@@ -296,7 +296,7 @@ public:
// Copy initializer elements.
unsigned i = 0;
for (; i < NumInitableElts; ++i) {
- llvm::Constant *C = Visit(ILE->getInit(i));
+ llvm::Constant *C = CGM.EmitConstantExpr(ILE->getInit(i), CGF);
Elts.push_back(C);
}
@@ -310,7 +310,7 @@ public:
if (ILE->getType()->isScalarType()) {
// We have a scalar in braces. Just use the first element.
if (ILE->getNumInits() > 0)
- return Visit(ILE->getInit(0));
+ return CGM.EmitConstantExpr(ILE->getInit(0), CGF);
const llvm::Type* RetTy = CGM.getTypes().ConvertType(ILE->getType());
return llvm::Constant::getNullValue(RetTy);
@@ -854,10 +854,19 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
V.getLValueOffset());
if (const Expr *LVBase = V.getLValueBase()) {
- llvm::Constant *Base =
+ llvm::Constant *C =
ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase));
- return llvm::ConstantExpr::getGetElementPtr(Base, &Offset, 1);
+ const llvm::Type *Type =
+ llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+ const llvm::Type *DestType = C->getType();
+
+ // FIXME: It's a little ugly that we need to cast to a pointer,
+ // apply the GEP and then cast back.
+ C = llvm::ConstantExpr::getBitCast(C, Type);
+ C = llvm::ConstantExpr::getGetElementPtr(C, &Offset, 1);
+
+ return llvm::ConstantExpr::getBitCast(C, DestType);
}
return llvm::ConstantExpr::getIntToPtr(Offset,
@@ -873,6 +882,14 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
return C;
case APValue::Float:
return llvm::ConstantFP::get(V.getFloat());
+ case APValue::ComplexFloat: {
+ llvm::Constant *Complex[2];
+
+ Complex[0] = llvm::ConstantFP::get(V.getComplexFloatReal());
+ Complex[1] = llvm::ConstantFP::get(V.getComplexFloatImag());
+
+ return llvm::ConstantStruct::get(Complex, 2);
+ }
}
}
#else