diff options
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 127 |
1 files changed, 0 insertions, 127 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index bf660b448c3..a0d004d315c 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -911,8 +911,6 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) { return EmitUnaryOpLValue(cast<UnaryOperator>(E)); case Expr::ArraySubscriptExprClass: return EmitArraySubscriptExpr(cast<ArraySubscriptExpr>(E)); - case Expr::OMPArraySectionExprClass: - return EmitOMPArraySectionExpr(cast<OMPArraySectionExpr>(E)); case Expr::ExtVectorElementExprClass: return EmitExtVectorElementExpr(cast<ExtVectorElementExpr>(E)); case Expr::MemberExprClass: @@ -2561,131 +2559,6 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E, return LV; } -LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E, - bool LowerBound) { - LValue Base; - if (auto *ASE = - dyn_cast<OMPArraySectionExpr>(E->getBase()->IgnoreParenImpCasts())) - Base = EmitOMPArraySectionExpr(ASE, LowerBound); - else - Base = EmitLValue(E->getBase()); - QualType BaseTy = Base.getType(); - llvm::Value *Idx; - QualType ResultExprTy; - if (auto *AT = getContext().getAsArrayType(BaseTy)) - ResultExprTy = AT->getElementType(); - else - ResultExprTy = BaseTy->getPointeeType(); - if (LowerBound) { - Idx = E->getLowerBound() - ? Builder.CreateIntCast(EmitScalarExpr(E->getLowerBound()), - IntPtrTy, - E->getLowerBound() - ->getType() - ->hasSignedIntegerRepresentation()) - : llvm::ConstantInt::getNullValue(IntPtrTy); - } else { - auto &C = CGM.getContext(); - auto *Length = E->getLength(); - if (Length || E->getColonLoc().isInvalid()) { - // Idx = LowerBound + Length - 1; - auto *One = llvm::ConstantInt::get(IntPtrTy, /*V=*/1); - if (Length) { - Idx = Builder.CreateIntCast( - EmitScalarExpr(Length), IntPtrTy, - Length->getType()->hasSignedIntegerRepresentation()); - } - auto *LowerBound = E->getLowerBound(); - llvm::APSInt ConstLowerBound; - if (LowerBound && LowerBound->isIntegerConstantExpr(ConstLowerBound, C)) - LowerBound = nullptr; - if (LowerBound && ConstLowerBound.getZExtValue() != 0) { - auto *LowerBoundVal = Builder.CreateIntCast( - EmitScalarExpr(LowerBound), IntPtrTy, - LowerBound->getType()->hasSignedIntegerRepresentation()); - if (E->getColonLoc().isValid()) { - if (getLangOpts().isSignedOverflowDefined()) - Idx = Builder.CreateAdd(Idx, LowerBoundVal); - else - Idx = Builder.CreateNSWAdd(Idx, LowerBoundVal); - } else - Idx = LowerBoundVal; - } - if (E->getColonLoc().isValid()) { - if (getLangOpts().isSignedOverflowDefined()) - Idx = Builder.CreateSub(Idx, One); - else - Idx = Builder.CreateNSWSub(Idx, One); - } - } else if (auto *VAT = C.getAsVariableArrayType(BaseTy)) { - // Idx = ArrSize - 1; - Length = VAT->getSizeExpr(); - Idx = Builder.CreateIntCast( - EmitScalarExpr(Length), IntPtrTy, - Length->getType()->hasSignedIntegerRepresentation()); - auto *One = llvm::ConstantInt::get(IntPtrTy, /*V=*/1); - if (getLangOpts().isSignedOverflowDefined()) - Idx = Builder.CreateSub(Idx, One); - else - Idx = Builder.CreateNSWSub(Idx, One); - } else { - // Idx = ArrSize - 1; - auto *CAT = C.getAsConstantArrayType(BaseTy); - Idx = llvm::ConstantInt::get(IntPtrTy, CAT->getSize().getZExtValue() - 1); - } - } - - llvm::Value *Address; - CharUnits ArrayAlignment; - if (auto *VLA = getContext().getAsVariableArrayType(ResultExprTy)) { - // The element count here is the total number of non-VLA elements. - llvm::Value *numElements = getVLASize(VLA).first; - - // Effectively, the multiply by the VLA size is part of the GEP. - // GEP indexes are signed, and scaling an index isn't permitted to - // signed-overflow, so we use the same semantics for our explicit - // multiply. We suppress this if overflow is not undefined behavior. - if (getLangOpts().isSignedOverflowDefined()) { - Idx = Builder.CreateMul(Idx, numElements); - Address = Builder.CreateGEP(Base.getAddress(), Idx, "arrayidx"); - } else { - Idx = Builder.CreateNSWMul(Idx, numElements); - Address = Builder.CreateInBoundsGEP(Base.getAddress(), Idx, "arrayidx"); - } - } else if (BaseTy->isConstantArrayType()) { - llvm::Value *ArrayPtr = Base.getAddress(); - llvm::Value *Zero = llvm::ConstantInt::getNullValue(IntPtrTy); - llvm::Value *Args[] = {Zero, Idx}; - - // Propagate the alignment from the array itself to the result. - ArrayAlignment = Base.getAlignment(); - - if (getLangOpts().isSignedOverflowDefined()) - Address = Builder.CreateGEP(ArrayPtr, Args, "arrayidx"); - else - Address = Builder.CreateInBoundsGEP(ArrayPtr, Args, "arrayidx"); - } else { - // The base must be a pointer, which is not an aggregate. Emit it. - if (getLangOpts().isSignedOverflowDefined()) - Address = Builder.CreateGEP(Base.getAddress(), Idx, "arrayidx"); - else - Address = Builder.CreateInBoundsGEP(Base.getAddress(), Idx, "arrayidx"); - } - - // Limit the alignment to that of the result type. - LValue LV; - if (!ArrayAlignment.isZero()) { - CharUnits Align = getContext().getTypeAlignInChars(ResultExprTy); - ArrayAlignment = std::min(Align, ArrayAlignment); - LV = MakeAddrLValue(Address, ResultExprTy, ArrayAlignment); - } else - LV = MakeNaturalAlignAddrLValue(Address, ResultExprTy); - - LV.getQuals().setAddressSpace(BaseTy.getAddressSpace()); - - return LV; -} - LValue CodeGenFunction:: EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { // Emit the base vector as an l-value. |