aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/APValue.cpp10
-rw-r--r--lib/CodeGen/CGExprConstant.cpp13
2 files changed, 23 insertions, 0 deletions
diff --git a/lib/AST/APValue.cpp b/lib/AST/APValue.cpp
index 38a89aa99e..87d9fc3442 100644
--- a/lib/AST/APValue.cpp
+++ b/lib/AST/APValue.cpp
@@ -23,6 +23,8 @@ const APValue &APValue::operator=(const APValue &RHS) {
MakeInt();
else if (RHS.isFloat())
MakeFloat();
+ else if (RHS.isVector())
+ MakeVector();
else if (RHS.isComplexInt())
MakeComplexInt();
else if (RHS.isComplexFloat())
@@ -34,6 +36,8 @@ const APValue &APValue::operator=(const APValue &RHS) {
setInt(RHS.getInt());
else if (isFloat())
setFloat(RHS.getFloat());
+ else if (isVector())
+ setVector(((Vec*)(void*)RHS.Data)->Elts, RHS.getVectorLength());
else if (isComplexInt())
setComplexInt(RHS.getComplexIntReal(), RHS.getComplexIntImag());
else if (isComplexFloat())
@@ -48,6 +52,8 @@ void APValue::MakeUninit() {
((APSInt*)(void*)Data)->~APSInt();
else if (Kind == Float)
((APFloat*)(void*)Data)->~APFloat();
+ else if (Kind == Vector)
+ ((Vec*)(void*)Data)->~Vec();
else if (Kind == ComplexInt)
((ComplexAPSInt*)(void*)Data)->~ComplexAPSInt();
else if (Kind == ComplexFloat)
@@ -55,6 +61,7 @@ void APValue::MakeUninit() {
else if (Kind == LValue) {
((LV*)(void*)Data)->~LV();
}
+ Kind = Uninitialized;
}
void APValue::dump() const {
@@ -83,6 +90,9 @@ void APValue::print(llvm::raw_ostream &OS) const {
case Float:
OS << "Float: " << GetApproxValue(getFloat());
return;
+ case Vector:
+ OS << "Vector: <todo>";
+ return;
case ComplexInt:
OS << "ComplexInt: " << getComplexIntReal() << ", " << getComplexIntImag();
return;
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index 72674f77fb..b7c4f7fd39 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -697,6 +697,19 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
return llvm::ConstantStruct::get(Complex, 2);
}
+ case APValue::Vector: {
+ llvm::SmallVector<llvm::Constant *, 4> Inits;
+ unsigned NumElts = Result.Val.getVectorLength();
+
+ for (unsigned i = 0; i != NumElts; ++i) {
+ APValue &Elt = Result.Val.getVectorElt(i);
+ if (Elt.isInt())
+ Inits.push_back(llvm::ConstantInt::get(Elt.getInt()));
+ else
+ Inits.push_back(llvm::ConstantFP::get(Elt.getFloat()));
+ }
+ return llvm::ConstantVector::get(&Inits[0], Inits.size());
+ }
}
}