|
@@ -916,7 +916,8 @@ void CodeGenModule::EmitExplicitCastExprType(const ExplicitCastExpr *E,
|
|
|
/// EmitPointerWithAlignment - Given an expression of pointer type, try to
|
|
|
/// derive a more accurate bound on the alignment of the pointer.
|
|
|
Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|
|
- LValueBaseInfo *BaseInfo) {
|
|
|
+ LValueBaseInfo *BaseInfo,
|
|
|
+ TBAAAccessInfo *TBAAInfo) {
|
|
|
// We allow this with ObjC object pointers because of fragile ABIs.
|
|
|
assert(E->getType()->isPointerType() ||
|
|
|
E->getType()->isObjCObjectPointerType());
|
|
@@ -936,19 +937,28 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|
|
if (PtrTy->getPointeeType()->isVoidType())
|
|
|
break;
|
|
|
|
|
|
- LValueBaseInfo InnerInfo;
|
|
|
- Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), &InnerInfo);
|
|
|
- if (BaseInfo) *BaseInfo = InnerInfo;
|
|
|
+ LValueBaseInfo InnerBaseInfo;
|
|
|
+ TBAAAccessInfo InnerTBAAInfo;
|
|
|
+ Address Addr = EmitPointerWithAlignment(CE->getSubExpr(),
|
|
|
+ &InnerBaseInfo,
|
|
|
+ &InnerTBAAInfo);
|
|
|
+ if (BaseInfo) *BaseInfo = InnerBaseInfo;
|
|
|
+ if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
|
|
|
|
|
|
// If this is an explicit bitcast, and the source l-value is
|
|
|
// opaque, honor the alignment of the casted-to type.
|
|
|
if (isa<ExplicitCastExpr>(CE) &&
|
|
|
- InnerInfo.getAlignmentSource() != AlignmentSource::Decl) {
|
|
|
- LValueBaseInfo ExpInfo;
|
|
|
+ InnerBaseInfo.getAlignmentSource() != AlignmentSource::Decl) {
|
|
|
+ LValueBaseInfo TargetTypeBaseInfo;
|
|
|
+ TBAAAccessInfo TargetTypeTBAAInfo;
|
|
|
CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(),
|
|
|
- &ExpInfo);
|
|
|
+ &TargetTypeBaseInfo,
|
|
|
+ &TargetTypeTBAAInfo);
|
|
|
if (BaseInfo)
|
|
|
- BaseInfo->mergeForCast(ExpInfo);
|
|
|
+ BaseInfo->mergeForCast(TargetTypeBaseInfo);
|
|
|
+ if (TBAAInfo)
|
|
|
+ *TBAAInfo = CGM.mergeTBAAInfoForCast(*TBAAInfo,
|
|
|
+ TargetTypeTBAAInfo);
|
|
|
Addr = Address(Addr.getPointer(), Align);
|
|
|
}
|
|
|
|
|
@@ -969,12 +979,13 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|
|
|
|
|
// Array-to-pointer decay.
|
|
|
case CK_ArrayToPointerDecay:
|
|
|
- return EmitArrayToPointerDecay(CE->getSubExpr(), BaseInfo);
|
|
|
+ return EmitArrayToPointerDecay(CE->getSubExpr(), BaseInfo, TBAAInfo);
|
|
|
|
|
|
// Derived-to-base conversions.
|
|
|
case CK_UncheckedDerivedToBase:
|
|
|
case CK_DerivedToBase: {
|
|
|
- Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), BaseInfo);
|
|
|
+ Address Addr = EmitPointerWithAlignment(CE->getSubExpr(), BaseInfo,
|
|
|
+ TBAAInfo);
|
|
|
auto Derived = CE->getSubExpr()->getType()->getPointeeCXXRecordDecl();
|
|
|
return GetAddressOfBaseClass(Addr, Derived,
|
|
|
CE->path_begin(), CE->path_end(),
|
|
@@ -994,6 +1005,7 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|
|
if (UO->getOpcode() == UO_AddrOf) {
|
|
|
LValue LV = EmitLValue(UO->getSubExpr());
|
|
|
if (BaseInfo) *BaseInfo = LV.getBaseInfo();
|
|
|
+ if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
|
|
|
return LV.getAddress();
|
|
|
}
|
|
|
}
|
|
@@ -1001,7 +1013,8 @@ Address CodeGenFunction::EmitPointerWithAlignment(const Expr *E,
|
|
|
// TODO: conditional operators, comma.
|
|
|
|
|
|
// Otherwise, use the alignment of the type.
|
|
|
- CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), BaseInfo);
|
|
|
+ CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(), BaseInfo,
|
|
|
+ TBAAInfo);
|
|
|
return Address(EmitScalarExpr(E), Align);
|
|
|
}
|
|
|
|
|
@@ -2447,8 +2460,10 @@ LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
|
|
|
assert(!T.isNull() && "CodeGenFunction::EmitUnaryOpLValue: Illegal type");
|
|
|
|
|
|
LValueBaseInfo BaseInfo;
|
|
|
- Address Addr = EmitPointerWithAlignment(E->getSubExpr(), &BaseInfo);
|
|
|
- LValue LV = MakeAddrLValue(Addr, T, BaseInfo, CGM.getTBAAAccessInfo(T));
|
|
|
+ TBAAAccessInfo TBAAInfo;
|
|
|
+ Address Addr = EmitPointerWithAlignment(E->getSubExpr(), &BaseInfo,
|
|
|
+ &TBAAInfo);
|
|
|
+ LValue LV = MakeAddrLValue(Addr, T, BaseInfo, TBAAInfo);
|
|
|
LV.getQuals().setAddressSpace(ExprTy.getAddressSpace());
|
|
|
|
|
|
// We should not generate __weak write barrier on indirect reference
|
|
@@ -3048,7 +3063,8 @@ llvm::CallInst *CodeGenFunction::EmitTrapCall(llvm::Intrinsic::ID IntrID) {
|
|
|
}
|
|
|
|
|
|
Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
|
|
|
- LValueBaseInfo *BaseInfo) {
|
|
|
+ LValueBaseInfo *BaseInfo,
|
|
|
+ TBAAAccessInfo *TBAAInfo) {
|
|
|
assert(E->getType()->isArrayType() &&
|
|
|
"Array to pointer decay must have array source type!");
|
|
|
|
|
@@ -3056,6 +3072,7 @@ Address CodeGenFunction::EmitArrayToPointerDecay(const Expr *E,
|
|
|
LValue LV = EmitLValue(E);
|
|
|
Address Addr = LV.getAddress();
|
|
|
if (BaseInfo) *BaseInfo = LV.getBaseInfo();
|
|
|
+ if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
|
|
|
|
|
|
// If the array type was an incomplete type, we need to make sure
|
|
|
// the decay ends up being the right type.
|
|
@@ -3216,13 +3233,14 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
|
|
}
|
|
|
|
|
|
LValueBaseInfo BaseInfo;
|
|
|
+ TBAAAccessInfo TBAAInfo;
|
|
|
Address Addr = Address::invalid();
|
|
|
if (const VariableArrayType *vla =
|
|
|
getContext().getAsVariableArrayType(E->getType())) {
|
|
|
// The base must be a pointer, which is not an aggregate. Emit
|
|
|
// it. It needs to be emitted first in case it's what captures
|
|
|
// the VLA bounds.
|
|
|
- Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo);
|
|
|
+ Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, &TBAAInfo);
|
|
|
auto *Idx = EmitIdxAfterBase(/*Promote*/true);
|
|
|
|
|
|
// The element count here is the total number of non-VLA elements.
|
|
@@ -3246,7 +3264,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
|
|
// Indexing over an interface, as in "NSString *P; P[4];"
|
|
|
|
|
|
// Emit the base pointer.
|
|
|
- Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo);
|
|
|
+ Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, &TBAAInfo);
|
|
|
auto *Idx = EmitIdxAfterBase(/*Promote*/true);
|
|
|
|
|
|
CharUnits InterfaceSize = getContext().getTypeSizeInChars(OIT);
|
|
@@ -3294,19 +3312,17 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
|
|
E->getType(), !getLangOpts().isSignedOverflowDefined(), SignedIndices,
|
|
|
E->getExprLoc());
|
|
|
BaseInfo = ArrayLV.getBaseInfo();
|
|
|
+ TBAAInfo = CGM.getTBAAAccessInfo(E->getType());
|
|
|
} else {
|
|
|
// The base must be a pointer; emit it with an estimate of its alignment.
|
|
|
- Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo);
|
|
|
+ Addr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, &TBAAInfo);
|
|
|
auto *Idx = EmitIdxAfterBase(/*Promote*/true);
|
|
|
Addr = emitArraySubscriptGEP(*this, Addr, Idx, E->getType(),
|
|
|
!getLangOpts().isSignedOverflowDefined(),
|
|
|
SignedIndices, E->getExprLoc());
|
|
|
}
|
|
|
|
|
|
- LValue LV = MakeAddrLValue(Addr, E->getType(), BaseInfo,
|
|
|
- CGM.getTBAAAccessInfo(E->getType()));
|
|
|
-
|
|
|
- // TODO: Preserve/extend path TBAA metadata?
|
|
|
+ LValue LV = MakeAddrLValue(Addr, E->getType(), BaseInfo, TBAAInfo);
|
|
|
|
|
|
if (getLangOpts().ObjC1 &&
|
|
|
getLangOpts().getGC() != LangOptions::NonGC) {
|
|
@@ -3321,8 +3337,6 @@ static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
|
|
|
TBAAAccessInfo &TBAAInfo,
|
|
|
QualType BaseTy, QualType ElTy,
|
|
|
bool IsLowerBound) {
|
|
|
- TBAAInfo = CGF.CGM.getTBAAAccessInfo(ElTy);
|
|
|
-
|
|
|
LValue BaseLVal;
|
|
|
if (auto *ASE = dyn_cast<OMPArraySectionExpr>(Base->IgnoreParenImpCasts())) {
|
|
|
BaseLVal = CGF.EmitOMPArraySectionExpr(ASE, IsLowerBound);
|
|
@@ -3352,7 +3366,7 @@ static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base,
|
|
|
BaseInfo.mergeForCast(TypeInfo);
|
|
|
return Address(CGF.Builder.CreateLoad(BaseLVal.getAddress()), Align);
|
|
|
}
|
|
|
- return CGF.EmitPointerWithAlignment(Base, &BaseInfo);
|
|
|
+ return CGF.EmitPointerWithAlignment(Base, &BaseInfo, &TBAAInfo);
|
|
|
}
|
|
|
|
|
|
LValue CodeGenFunction::EmitOMPArraySectionExpr(const OMPArraySectionExpr *E,
|
|
@@ -3518,10 +3532,10 @@ EmitExtVectorElementExpr(const ExtVectorElementExpr *E) {
|
|
|
// If it is a pointer to a vector, emit the address and form an lvalue with
|
|
|
// it.
|
|
|
LValueBaseInfo BaseInfo;
|
|
|
- Address Ptr = EmitPointerWithAlignment(E->getBase(), &BaseInfo);
|
|
|
+ TBAAAccessInfo TBAAInfo;
|
|
|
+ Address Ptr = EmitPointerWithAlignment(E->getBase(), &BaseInfo, &TBAAInfo);
|
|
|
const PointerType *PT = E->getBase()->getType()->getAs<PointerType>();
|
|
|
- Base = MakeAddrLValue(Ptr, PT->getPointeeType(), BaseInfo,
|
|
|
- CGM.getTBAAAccessInfo(PT->getPointeeType()));
|
|
|
+ Base = MakeAddrLValue(Ptr, PT->getPointeeType(), BaseInfo, TBAAInfo);
|
|
|
Base.getQuals().removeObjCGCAttr();
|
|
|
} else if (E->getBase()->isGLValue()) {
|
|
|
// Otherwise, if the base is an lvalue ( as in the case of foo.x.x),
|
|
@@ -3577,7 +3591,8 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
|
|
|
LValue BaseLV;
|
|
|
if (E->isArrow()) {
|
|
|
LValueBaseInfo BaseInfo;
|
|
|
- Address Addr = EmitPointerWithAlignment(BaseExpr, &BaseInfo);
|
|
|
+ TBAAAccessInfo TBAAInfo;
|
|
|
+ Address Addr = EmitPointerWithAlignment(BaseExpr, &BaseInfo, &TBAAInfo);
|
|
|
QualType PtrTy = BaseExpr->getType()->getPointeeType();
|
|
|
SanitizerSet SkippedChecks;
|
|
|
bool IsBaseCXXThis = IsWrappedCXXThis(BaseExpr);
|
|
@@ -3587,8 +3602,7 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
|
|
|
SkippedChecks.set(SanitizerKind::Null, true);
|
|
|
EmitTypeCheck(TCK_MemberAccess, E->getExprLoc(), Addr.getPointer(), PtrTy,
|
|
|
/*Alignment=*/CharUnits::Zero(), SkippedChecks);
|
|
|
- BaseLV = MakeAddrLValue(Addr, PtrTy, BaseInfo,
|
|
|
- CGM.getTBAAAccessInfo(PtrTy));
|
|
|
+ BaseLV = MakeAddrLValue(Addr, PtrTy, BaseInfo, TBAAInfo);
|
|
|
} else
|
|
|
BaseLV = EmitCheckedLValue(BaseExpr, TCK_MemberAccess);
|
|
|
|