diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/APValue.cpp | 10 | ||||
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 13 |
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()); + } } } |