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