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-boun...@lists.llvm.org] On Behalf Of
Ivan A. Kosarev via cfe-commits
Sent: Tuesday, October 17, 2017 2:12
To: cfe-commits@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@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to