r315984 - [CodeGen] EmitPointerWithAlignment() to generate TBAA info along with LValue base info

Ivan Kosarev via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 22 06:00:57 PST 2017


Hello Alex,

I'm working on it.

Thanks,


On 22/12/17 00:07, Alex L wrote:
> Hi,
>
> This commit has caused a new regression in LLVM 6. I filed the 
> following PR: https://bugs.llvm.org/show_bug.cgi?id=35724 .
> Could you please take a look?
>
> Thanks,
> Alex
>
> On 17 October 2017 at 02:12, Ivan A. Kosarev via cfe-commits 
> <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
>
>     Author: kosarev
>     Date: Tue Oct 17 02:12:13 2017
>     New Revision: 315984
>
>     URL: http://llvm.org/viewvc/llvm-project?rev=315984&view=rev
>     <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
>     <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=diff
>     <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=315984&r1=315983&r2=315984&view=diff>
>     ==============================================================================
>     --- 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=315984&view=diff
>     <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=315984&r1=315983&r2=315984&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
>     <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
>     <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&view=diff
>     <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=315984&r1=315983&r2=315984&view=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&view=diff
>     <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.cpp?rev=315984&r1=315983&r2=315984&view=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&view=diff
>     <http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTBAA.h?rev=315984&r1=315983&r2=315984&view=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
>     <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 <mailto:cfe-commits at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>     <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171222/91f78173/attachment-0001.html>


More information about the cfe-commits mailing list