r315984 - [CodeGen] EmitPointerWithAlignment() to generate TBAA info along with LValue base info
Ivan Kosarev via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 18 10:38:27 PDT 2017
Hello Douglas,
Sure, I'm on it. Thanks for reporting and sorry for the troubles.
On 18/10/17 20:24, Yung, Douglas wrote:
> Hi Ivan,
>
> This change caused a compiler crash in one of our tests. I have put the details in PR34992, can you take a look?
>
> Douglas Yung
>
>> -----Original Message-----
>> From: cfe-commits [mailto:cfe-commits-bounces at lists.llvm.org] On Behalf Of
>> Ivan A. Kosarev via cfe-commits
>> Sent: Tuesday, October 17, 2017 2:12
>> To: cfe-commits at lists.llvm.org
>> Subject: r315984 - [CodeGen] EmitPointerWithAlignment() to generate TBAA info
>> along with LValue base info
>>
>> Author: kosarev
>> Date: Tue Oct 17 02:12:13 2017
>> New Revision: 315984
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=315984&view=rev
>> Log:
>> [CodeGen] EmitPointerWithAlignment() to generate TBAA info along with LValue
>> base info
>>
>> Differential Revision: https://reviews.llvm.org/D38796
>>
>> Added:
>> cfe/trunk/test/CodeGen/tbaa-cast.cpp
>> Modified:
>> cfe/trunk/lib/CodeGen/CGExpr.cpp
>> cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>> cfe/trunk/lib/CodeGen/CodeGenFunction.h
>> cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>> cfe/trunk/lib/CodeGen/CodeGenModule.h
>> cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp
>> cfe/trunk/lib/CodeGen/CodeGenTBAA.h
>>
>> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=315984&r1=315983&r2=315984&view=d
>> iff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Oct 17 02:12:13 2017
>> @@ -916,7 +916,8 @@ void CodeGenModule::EmitExplicitCastExpr
>> /// 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,20 +937,30 @@ Address CodeGenFunction::EmitPointerWith
>> if (PtrTy->getPointeeType()->isVoidType())
>> break;
>>
>> - LValueBaseInfo InnerInfo;
>> - Address Addr = EmitPointerWithAlignment(CE->getSubExpr(),
>> &InnerInfo);
>> - if (BaseInfo) *BaseInfo = InnerInfo;
>> -
>> - // 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;
>> + LValueBaseInfo InnerBaseInfo;
>> + TBAAAccessInfo InnerTBAAInfo;
>> + Address Addr = EmitPointerWithAlignment(CE->getSubExpr(),
>> + &InnerBaseInfo,
>> + &InnerTBAAInfo);
>> + if (BaseInfo) *BaseInfo = InnerBaseInfo;
>> + if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
>> +
>> + if (isa<ExplicitCastExpr>(CE)) {
>> + LValueBaseInfo TargetTypeBaseInfo;
>> + TBAAAccessInfo TargetTypeTBAAInfo;
>> CharUnits Align = getNaturalPointeeTypeAlignment(E->getType(),
>> - &ExpInfo);
>> - if (BaseInfo)
>> - BaseInfo->mergeForCast(ExpInfo);
>> - Addr = Address(Addr.getPointer(), Align);
>> +
>> &TargetTypeBaseInfo,
>> +
>> &TargetTypeTBAAInfo);
>> + if (TBAAInfo)
>> + *TBAAInfo = CGM.mergeTBAAInfoForCast(*TBAAInfo,
>> + TargetTypeTBAAInfo);
>> + // If the source l-value is opaque, honor the alignment of the
>> + // casted-to type.
>> + if (InnerBaseInfo.getAlignmentSource() != AlignmentSource::Decl) {
>> + if (BaseInfo)
>> + BaseInfo->mergeForCast(TargetTypeBaseInfo);
>> + Addr = Address(Addr.getPointer(), Align);
>> + }
>> }
>>
>> if (SanOpts.has(SanitizerKind::CFIUnrelatedCast) && @@ -969,12
>> +980,13 @@ Address CodeGenFunction::EmitPointerWith
>>
>> // 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 +1006,7 @@ Address CodeGenFunction::EmitPointerWith
>> 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 +1014,8 @@ Address CodeGenFunction::EmitPointerWith
>> // 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 +2461,10 @@ LValue CodeGenFunction::EmitUnaryOpLValu
>> 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 +3064,8 @@ llvm::CallInst *CodeGenFunction::EmitTra }
>>
>> 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 +3073,7 @@ Address CodeGenFunction::EmitArrayToPoin
>> 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 +3234,14 @@ LValue CodeGenFunction::EmitArraySubscri
>> }
>>
>> 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 +3265,7 @@ LValue CodeGenFunction::EmitArraySubscri
>> // 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 +3313,17 @@ LValue CodeGenFunction::EmitArraySubscri
>> 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 +3338,6 @@
>> static Address emitOMPArraySectionBase(C
>> 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
>> +3367,7 @@ static Address emitOMPArraySectionBase(C
>> 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 +3533,10 @@ EmitExtVectorElementExpr(const ExtVector
>> // 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 +3592,8 @@ LValue CodeGenFunction::EmitMemberExpr(c
>> 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 +3603,7 @@
>> LValue CodeGenFunction::EmitMemberExpr(c
>> 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);
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=315984&r1=315983&r2=3159
>> 84&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Tue Oct 17 02:12:13 2017
>> @@ -118,9 +118,9 @@ CodeGenFunction::~CodeGenFunction() { }
>>
>> CharUnits CodeGenFunction::getNaturalPointeeTypeAlignment(QualType T,
>> - LValueBaseInfo *BaseInfo)
>> {
>> - return getNaturalTypeAlignment(T->getPointeeType(), BaseInfo,
>> - /* TBAAInfo= */ nullptr,
>> + LValueBaseInfo *BaseInfo,
>> + TBAAAccessInfo
>> + *TBAAInfo) { return getNaturalTypeAlignment(T->getPointeeType(),
>> + BaseInfo, TBAAInfo,
>> /* forPointeeType= */ true); }
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=315984&r1=315983&r2=315984
>> &view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Tue Oct 17 02:12:13 2017
>> @@ -1949,7 +1949,8 @@ public:
>> TBAAAccessInfo *TBAAInfo = nullptr,
>> bool forPointeeType = false);
>> CharUnits getNaturalPointeeTypeAlignment(QualType T,
>> - LValueBaseInfo *BaseInfo =
>> nullptr);
>> + LValueBaseInfo *BaseInfo =
>> nullptr,
>> + TBAAAccessInfo *TBAAInfo =
>> + nullptr);
>>
>> Address EmitLoadOfReference(Address Ref, const ReferenceType *RefTy,
>> LValueBaseInfo *BaseInfo = nullptr, @@ -3198,7
>> +3199,8 @@ public:
>> RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation
>> Loc);
>>
>> Address EmitArrayToPointerDecay(const Expr *Array,
>> - LValueBaseInfo *BaseInfo = nullptr);
>> + LValueBaseInfo *BaseInfo = nullptr,
>> + TBAAAccessInfo *TBAAInfo = nullptr);
>>
>> class ConstantEmission {
>> llvm::PointerIntPair<llvm::Constant*, 1, bool> ValueAndIsReference; @@ -
>> 3920,7 +3922,8 @@ public:
>> /// reasonable to just ignore the returned alignment when it isn't from an
>> /// explicit source.
>> Address EmitPointerWithAlignment(const Expr *Addr,
>> - LValueBaseInfo *BaseInfo = nullptr);
>> + LValueBaseInfo *BaseInfo = nullptr,
>> + TBAAAccessInfo *TBAAInfo = nullptr);
>>
>> void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK);
>>
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=315984&r1=315983&r2=315984
>> &view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue Oct 17 02:12:13 2017
>> @@ -612,6 +612,13 @@ TBAAAccessInfo CodeGenModule::getTBAAMay
>> return TBAA->getMayAliasAccessInfo(); }
>>
>> +TBAAAccessInfo CodeGenModule::mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo,
>> + TBAAAccessInfo
>> +TargetInfo) {
>> + if (!TBAA)
>> + return TBAAAccessInfo();
>> + return TBAA->mergeTBAAInfoForCast(SourceInfo, TargetInfo); }
>> +
>> void CodeGenModule::DecorateInstructionWithTBAA(llvm::Instruction *Inst,
>> TBAAAccessInfo TBAAInfo) {
>> if (llvm::MDNode *Tag = getTBAAAccessTagInfo(TBAAInfo))
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=315984&r1=315983&r2=315984&v
>> iew=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Tue Oct 17 02:12:13 2017
>> @@ -677,6 +677,11 @@ public:
>> /// may-alias accesses.
>> TBAAAccessInfo getTBAAMayAliasAccessInfo();
>>
>> + /// mergeTBAAInfoForCast - Get merged TBAA information for the
>> + purposes of /// type casts.
>> + TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo,
>> + TBAAAccessInfo TargetInfo);
>> +
>> bool isTypeConstant(QualType QTy, bool ExcludeCtorDtor);
>>
>> bool isPaddedAtomicType(QualType type);
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp?rev=315984&r1=315983&r2=315984&v
>> iew=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp Tue Oct 17 02:12:13 2017
>> @@ -309,3 +309,11 @@ llvm::MDNode *CodeGenTBAA::getAccessTagI TBAAAccessInfo
>> CodeGenTBAA::getMayAliasAccessInfo() {
>> return TBAAAccessInfo(getChar());
>> }
>> +
>> +TBAAAccessInfo CodeGenTBAA::mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo,
>> + TBAAAccessInfo
>> +TargetInfo) {
>> + TBAAAccessInfo MayAliasInfo = getMayAliasAccessInfo();
>> + if (SourceInfo == MayAliasInfo || TargetInfo == MayAliasInfo)
>> + return MayAliasInfo;
>> + return TargetInfo;
>> +}
>>
>> Modified: cfe/trunk/lib/CodeGen/CodeGenTBAA.h
>> URL: http://llvm.org/viewvc/llvm-
>> project/cfe/trunk/lib/CodeGen/CodeGenTBAA.h?rev=315984&r1=315983&r2=315984&vie
>> w=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CodeGenTBAA.h (original)
>> +++ cfe/trunk/lib/CodeGen/CodeGenTBAA.h Tue Oct 17 02:12:13 2017
>> @@ -47,6 +47,12 @@ struct TBAAAccessInfo {
>> : TBAAAccessInfo(/* AccessType= */ nullptr)
>> {}
>>
>> + bool operator==(const TBAAAccessInfo &Other) const {
>> + return BaseType == Other.BaseType &&
>> + AccessType == Other.AccessType &&
>> + Offset == Other.Offset;
>> + }
>> +
>> /// BaseType - The base/leading access type. May be null if this access
>> /// descriptor represents an access that is not considered to be an access
>> /// to an aggregate or union member.
>> @@ -136,6 +142,11 @@ public:
>> /// getMayAliasAccessInfo - Get TBAA information that represents may-alias
>> /// accesses.
>> TBAAAccessInfo getMayAliasAccessInfo();
>> +
>> + /// mergeTBAAInfoForCast - Get merged TBAA information for the
>> + purpose of /// type casts.
>> + TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo,
>> + TBAAAccessInfo TargetInfo);
>> };
>>
>> } // end namespace CodeGen
>>
>> Added: cfe/trunk/test/CodeGen/tbaa-cast.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/tbaa-
>> cast.cpp?rev=315984&view=auto
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/tbaa-cast.cpp (added)
>> +++ cfe/trunk/test/CodeGen/tbaa-cast.cpp Tue Oct 17 02:12:13 2017
>> @@ -0,0 +1,23 @@
>> +// RUN: %clang_cc1 -triple x86_64-linux -O1 -disable-llvm-passes %s \
>> +// RUN: -emit-llvm -o - | FileCheck %s
>> +//
>> +// Check that we generate correct TBAA information for lvalues
>> +constructed // with use of casts.
>> +
>> +struct V {
>> + unsigned n;
>> +};
>> +
>> +struct S {
>> + char bytes[4];
>> +};
>> +
>> +void foo(S *p) {
>> +// CHECK-LABEL: _Z3fooP1S
>> +// CHECK: store i32 5, {{.*}}, !tbaa [[TAG_V_n:!.*]]
>> + ((V*)p->bytes)->n = 5;
>> +}
>> +
>> +// CHECK-DAG: [[TAG_V_n]] = !{[[TYPE_V:!.*]], [[TYPE_int:!.*]], i64 0}
>> +// CHECK-DAG: [[TYPE_V]] = !{!"_ZTS1V", !{{.*}}, i64 0} // CHECK-DAG:
>> +[[TYPE_int]] = !{!"int", !{{.*}}, i64 0}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list