[clang] 9434360 - Revert "[BPF] Add preserve_access_index attribute for record definition"

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Sat Nov 9 08:49:08 PST 2019


On Sat, Nov 9, 2019 at 11:33 AM Yonghong Song via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
>
> Author: Yonghong Song
> Date: 2019-11-09T08:32:44-08:00
> New Revision: 9434360401218ae02aaea1fbb53a42bc3af2bc76
>
> URL: https://github.com/llvm/llvm-project/commit/9434360401218ae02aaea1fbb53a42bc3af2bc76
> DIFF: https://github.com/llvm/llvm-project/commit/9434360401218ae02aaea1fbb53a42bc3af2bc76.diff
>
> LOG: Revert "[BPF] Add preserve_access_index attribute for record definition"
>
> This reverts commit 4a5aa1a7bf8b1714b817ede8e09cd28c0784228a.
>
> There are some other test failures. Investigate them first.

I also pointed out several other issues with the patch on the review
thread; sorry for not responding sooner (I've been at standards
meetings all week, so this landed before I could comment).

~Aaron

>
> Added:
>
>
> Modified:
>     clang/include/clang/Basic/Attr.td
>     clang/include/clang/Basic/AttrDocs.td
>     clang/include/clang/Basic/DiagnosticSemaKinds.td
>     clang/lib/CodeGen/CGExpr.cpp
>     clang/lib/Sema/SemaDeclAttr.cpp
>
> Removed:
>     clang/test/CodeGen/bpf-attr-preserve-access-index-1.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-2.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-3.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-4.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-5.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-6.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-7.c
>     clang/test/CodeGen/bpf-attr-preserve-access-index-8.c
>     clang/test/Sema/bpf-attr-preserve-access-index.c
>
>
> ################################################################################
> diff  --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
> index aef02b5a8e96..0d25e775e2af 100644
> --- a/clang/include/clang/Basic/Attr.td
> +++ b/clang/include/clang/Basic/Attr.td
> @@ -332,7 +332,6 @@ class TargetArch<list<string> arches> : TargetSpec {
>  }
>  def TargetARM : TargetArch<["arm", "thumb", "armeb", "thumbeb"]>;
>  def TargetAVR : TargetArch<["avr"]>;
> -def TargetBPF : TargetArch<["bpfel", "bpfeb"]>;
>  def TargetMips32 : TargetArch<["mips", "mipsel"]>;
>  def TargetAnyMips : TargetArch<["mips", "mipsel", "mips64", "mips64el"]>;
>  def TargetMSP430 : TargetArch<["msp430"]>;
> @@ -1579,12 +1578,6 @@ def AMDGPUNumVGPR : InheritableAttr {
>    let Subjects = SubjectList<[Function], ErrorDiag, "kernel functions">;
>  }
>
> -def BPFPreserveAccessIndex : InheritableAttr,
> -                             TargetSpecificAttr<TargetBPF>  {
> -  let Spellings = [Clang<"preserve_access_index">];
> -  let Documentation = [BPFPreserveAccessIndexDocs];
> -}
> -
>  def WebAssemblyImportModule : InheritableAttr,
>                                TargetSpecificAttr<TargetWebAssembly> {
>    let Spellings = [Clang<"import_module">];
>
> diff  --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td
> index 50e76bf080b4..3a9093124637 100644
> --- a/clang/include/clang/Basic/AttrDocs.td
> +++ b/clang/include/clang/Basic/AttrDocs.td
> @@ -1634,17 +1634,6 @@ The semantics are as follows:
>    }];
>  }
>
> -def BPFPreserveAccessIndexDocs : Documentation {
> -  let Category = DocCatFunction;
> -  let Content = [{
> -Clang supports the ``__attribute__((preserve_access_index))``
> -attribute for the BPF target. This attribute may be attached to a
> -struct or union declaration, where if -g is specified, it enables
> -preserving struct or union member access debuginfo indicies of this
> -struct or union, similar to clang ``__builtin_preserve_acceess_index()``.
> -  }];
> -}
> -
>  def MipsInterruptDocs : Documentation {
>    let Category = DocCatFunction;
>    let Heading = "interrupt (MIPS)";
>
> diff  --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
> index 33a0f9710856..88d73dc89b55 100644
> --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
> +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
> @@ -10065,7 +10065,6 @@ def err_preserve_field_info_not_field : Error<
>    "__builtin_preserve_field_info argument %0 not a field access">;
>  def err_preserve_field_info_not_const: Error<
>    "__builtin_preserve_field_info argument %0 not a constant">;
> -def err_preserve_access_index_wrong_type: Error<"%0 attribute only applies to %1">;
>
>  def err_bit_cast_non_trivially_copyable : Error<
>    "__builtin_bit_cast %select{source|destination}0 type must be trivially copyable">;
>
> diff  --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
> index e32db8c56df9..99406715cbf8 100644
> --- a/clang/lib/CodeGen/CGExpr.cpp
> +++ b/clang/lib/CodeGen/CGExpr.cpp
> @@ -3402,67 +3402,11 @@ static QualType getFixedSizeElementType(const ASTContext &ctx,
>    return eltType;
>  }
>
> -/// Given an array base, check whether its member access belongs to a record
> -/// with preserve_access_index attribute or not.
> -static bool IsPreserveAIArrayBase(CodeGenFunction &CGF, const Expr *ArrayBase) {
> -  if (!ArrayBase || !CGF.getDebugInfo())
> -    return false;
> -
> -  const auto *ImplicitCast = dyn_cast<ImplicitCastExpr>(ArrayBase);
> -  if (!ImplicitCast)
> -    return false;
> -
> -  // Only support base as either a MemberExpr or DeclRefExpr.
> -  // DeclRefExpr to cover cases like:
> -  //    struct s { int a; int b[10]; };
> -  //    struct s *p;
> -  //    p[1].a
> -  // p[1] will generate a DeclRefExpr and p[1].a is a MemberExpr.
> -  // p->b[5] is a MemberExpr example.
> -  const Expr *E = ImplicitCast->getSubExpr();
> -  const auto *MemberCast = dyn_cast<MemberExpr>(E);
> -  if (MemberCast)
> -    return MemberCast->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>();
> -
> -  const auto *DeclRefCast = dyn_cast<DeclRefExpr>(E);
> -  if (DeclRefCast) {
> -    const VarDecl *VarDef = dyn_cast<VarDecl>(DeclRefCast->getDecl());
> -    if (!VarDef)
> -      return false;
> -
> -    const auto *PtrT = dyn_cast<PointerType>(VarDef->getType().getTypePtr());
> -    if (!PtrT)
> -      return false;
> -    const auto *PointeeT = PtrT->getPointeeType().getTypePtr();
> -
> -    // Peel off typedef's
> -    const auto *TypedefT = dyn_cast<TypedefType>(PointeeT);
> -    while (TypedefT) {
> -      PointeeT = TypedefT->desugar().getTypePtr();
> -      TypedefT = dyn_cast<TypedefType>(PointeeT);
> -    }
> -
> -    // Not a typedef any more, it should be an elaborated type.
> -    const auto ElaborateT = dyn_cast<ElaboratedType>(PointeeT);
> -    if (!ElaborateT)
> -      return false;
> -
> -    const auto *RecT = dyn_cast<RecordType>(ElaborateT->desugar().getTypePtr());
> -    if (!RecT)
> -      return false;
> -
> -    return RecT->getDecl()->hasAttr<BPFPreserveAccessIndexAttr>();
> -  }
> -
> -  return false;
> -}
> -
>  static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
>                                       ArrayRef<llvm::Value *> indices,
>                                       QualType eltType, bool inbounds,
>                                       bool signedIndices, SourceLocation loc,
>                                       QualType *arrayType = nullptr,
> -                                     const Expr *Base = nullptr,
>                                       const llvm::Twine &name = "arrayidx") {
>    // All the indices except that last must be zero.
>  #ifndef NDEBUG
> @@ -3484,8 +3428,7 @@ static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
>
>    llvm::Value *eltPtr;
>    auto LastIndex = dyn_cast<llvm::ConstantInt>(indices.back());
> -  if (!LastIndex ||
> -      (!CGF.IsInPreservedAIRegion && !IsPreserveAIArrayBase(CGF, Base))) {
> +  if (!CGF.IsInPreservedAIRegion || !LastIndex) {
>      eltPtr = emitArraySubscriptGEP(
>          CGF, addr.getPointer(), indices, inbounds, signedIndices,
>          loc, name);
> @@ -3639,7 +3582,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
>      Addr = emitArraySubscriptGEP(
>          *this, ArrayLV.getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
>          E->getType(), !getLangOpts().isSignedOverflowDefined(), SignedIndices,
> -        E->getExprLoc(), &arrayType, E->getBase());
> +        E->getExprLoc(), &arrayType);
>      EltBaseInfo = ArrayLV.getBaseInfo();
>      EltTBAAInfo = CGM.getTBAAInfoForSubobject(ArrayLV, E->getType());
>    } else {
> @@ -3649,8 +3592,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
>      QualType ptrType = E->getBase()->getType();
>      Addr = emitArraySubscriptGEP(*this, Addr, Idx, E->getType(),
>                                   !getLangOpts().isSignedOverflowDefined(),
> -                                 SignedIndices, E->getExprLoc(), &ptrType,
> -                                 E->getBase());
> +                                 SignedIndices, E->getExprLoc(), &ptrType);
>    }
>
>    LValue LV = MakeAddrLValue(Addr, E->getType(), EltBaseInfo, EltTBAAInfo);
> @@ -4051,13 +3993,12 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
>      const CGBitFieldInfo &Info = RL.getBitFieldInfo(field);
>      Address Addr = base.getAddress();
>      unsigned Idx = RL.getLLVMFieldNo(field);
> -    const RecordDecl *rec = field->getParent();
> -    if (!IsInPreservedAIRegion &&
> -        (!getDebugInfo() || !rec->hasAttr<BPFPreserveAccessIndexAttr>())) {
> +    if (!IsInPreservedAIRegion) {
>        if (Idx != 0)
>          // For structs, we GEP to the field that the record layout suggests.
>          Addr = Builder.CreateStructGEP(Addr, Idx, field->getName());
>      } else {
> +      const RecordDecl *rec = field->getParent();
>        llvm::DIType *DbgInfo = getDebugInfo()->getOrCreateRecordType(
>            getContext().getRecordType(rec), rec->getLocation());
>        Addr = Builder.CreatePreserveStructAccessIndex(Addr, Idx,
> @@ -4140,8 +4081,7 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
>        addr = Address(Builder.CreateLaunderInvariantGroup(addr.getPointer()),
>                       addr.getAlignment());
>
> -    if (IsInPreservedAIRegion ||
> -        (getDebugInfo() && rec->hasAttr<BPFPreserveAccessIndexAttr>())) {
> +    if (IsInPreservedAIRegion) {
>        // Remember the original union field index
>        llvm::DIType *DbgInfo = getDebugInfo()->getOrCreateRecordType(
>            getContext().getRecordType(rec), rec->getLocation());
> @@ -4155,8 +4095,7 @@ LValue CodeGenFunction::EmitLValueForField(LValue base,
>        addr = Builder.CreateElementBitCast(
>            addr, CGM.getTypes().ConvertTypeForMem(FieldType), field->getName());
>    } else {
> -    if (!IsInPreservedAIRegion &&
> -        (!getDebugInfo() || !rec->hasAttr<BPFPreserveAccessIndexAttr>()))
> +    if (!IsInPreservedAIRegion)
>        // For structs, we GEP to the field that the record layout suggests.
>        addr = emitAddrOfFieldStorage(*this, addr, field);
>      else
>
> diff  --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
> index 526e61cdf9ee..7f68d2014916 100644
> --- a/clang/lib/Sema/SemaDeclAttr.cpp
> +++ b/clang/lib/Sema/SemaDeclAttr.cpp
> @@ -5700,59 +5700,6 @@ static void handleAVRSignalAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
>    handleSimpleAttribute<AVRSignalAttr>(S, D, AL);
>  }
>
> -static void handleBPFPreserveAIRecord(Sema &S, RecordDecl *RD,
> -    const BPFPreserveAccessIndexAttr &AL) {
> -  // Add preserve_access_index attribute to all fields and inner records.
> -  for (DeclContext::decl_iterator D = RD->decls_begin(), DEnd = RD->decls_end();
> -       D != DEnd; ++D) {
> -    // Any member or inner struct having attribute means done.
> -    if (D->hasAttr<BPFPreserveAccessIndexAttr>())
> -      return;
> -
> -    RecordDecl *Rec = dyn_cast<RecordDecl>(*D);
> -    if (Rec) {
> -      Rec->addAttr(::new (S.Context) BPFPreserveAccessIndexAttr(S.Context, AL));
> -      handleBPFPreserveAIRecord(S, Rec, AL);
> -    } else {
> -      D->addAttr(::new (S.Context) BPFPreserveAccessIndexAttr(S.Context, AL));
> -    }
> -  }
> -}
> -
> -static void handleBPFPreserveAIRecord(Sema &S, RecordDecl *RD,
> -    const ParsedAttr &AL) {
> -  // Add preserve_access_index attribute to all fields and inner records.
> -  for (DeclContext::decl_iterator D = RD->decls_begin(), DEnd = RD->decls_end();
> -       D != DEnd; ++D) {
> -    RecordDecl *Rec = dyn_cast<RecordDecl>(*D);
> -    if (Rec) {
> -      // Inner record may have been processed.
> -      if (!Rec->hasAttr<BPFPreserveAccessIndexAttr>()) {
> -        Rec->addAttr(::new (S.Context) BPFPreserveAccessIndexAttr(S.Context, AL));
> -        handleBPFPreserveAIRecord(S, Rec, AL);
> -      }
> -    } else {
> -      D->addAttr(::new (S.Context) BPFPreserveAccessIndexAttr(S.Context, AL));
> -    }
> -  }
> -}
> -
> -static void handleBPFPreserveAccessIndexAttr(Sema &S, Decl *D,
> -    const ParsedAttr &AL) {
> -  RecordDecl *Rec = dyn_cast<RecordDecl>(D);
> -  if (!Rec) {
> -    S.Diag(D->getLocation(), diag::err_preserve_access_index_wrong_type)
> -        << "preserve_addess_index" << "struct or union type";
> -    return;
> -  }
> -
> -  if (!checkAttributeNumArgs(S, AL, 0))
> -    return;
> -
> -  handleBPFPreserveAIRecord(S, Rec, AL);
> -  Rec->addAttr(::new (S.Context) BPFPreserveAccessIndexAttr(S.Context, AL));
> -}
> -
>  static void handleWebAssemblyImportModuleAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
>    if (!isFunctionOrMethod(D)) {
>      S.Diag(D->getLocation(), diag::warn_attribute_wrong_decl_type)
> @@ -6629,9 +6576,6 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
>    case ParsedAttr::AT_AVRSignal:
>      handleAVRSignalAttr(S, D, AL);
>      break;
> -  case ParsedAttr::AT_BPFPreserveAccessIndex:
> -    handleBPFPreserveAccessIndexAttr(S, D, AL);
> -    break;
>    case ParsedAttr::AT_WebAssemblyImportModule:
>      handleWebAssemblyImportModuleAttr(S, D, AL);
>      break;
> @@ -7381,8 +7325,7 @@ void Sema::ProcessDeclAttributeList(Scope *S, Decl *D,
>    }
>  }
>
> -// Helper for delayed processing TransparentUnion or BPFPreserveAccessIndexAttr
> -// attribute.
> +// Helper for delayed processing TransparentUnion attribute.
>  void Sema::ProcessDeclAttributeDelayed(Decl *D,
>                                         const ParsedAttributesView &AttrList) {
>    for (const ParsedAttr &AL : AttrList)
> @@ -7390,13 +7333,6 @@ void Sema::ProcessDeclAttributeDelayed(Decl *D,
>        handleTransparentUnionAttr(*this, D, AL);
>        break;
>      }
> -
> -  // For BPFPreserveAccessIndexAttr, we want to populate the attributes
> -  // to fields and inner records as well.
> -  if (D->hasAttr<BPFPreserveAccessIndexAttr>()) {
> -    handleBPFPreserveAIRecord(*this, cast<RecordDecl>(D),
> -        *D->getAttr<BPFPreserveAccessIndexAttr>());
> -  }
>  }
>
>  // Annotation attributes are the only attributes allowed after an access
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-1.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-1.c
> deleted file mode 100644
> index accf6ab2cf99..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-1.c
> +++ /dev/null
> @@ -1,23 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// test simple member access and initial struct with non-zero stride access
> -struct s1 {
> -  int a;
> -  union {
> -   int b;
> -   int c;
> -  };
> -} __reloc__;
> -typedef struct s1 __s1;
> -
> -int test(__s1 *arg) {
> -  return arg->a + arg[1].b;
> -}
> -
> -// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 1)
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 1, i32 1)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0)
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-2.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-2.c
> deleted file mode 100644
> index a136eeea9f1e..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-2.c
> +++ /dev/null
> @@ -1,24 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// test array access
> -struct s1 {
> -  int a[3];
> -  union {
> -   int b;
> -   int c[4];
> -  };
> -} __reloc__;
> -typedef struct s1 __s1;
> -
> -int test(__s1 *arg) {
> -  return arg->a[2] + arg->c[2];
> -}
> -
> -// CHECK: call [3 x i32]* @llvm.preserve.struct.access.index.p0a3i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0a3i32([3 x i32]* %{{[0-9a-z]+}}, i32 1, i32 2)
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 1, i32 1)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 1)
> -// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]* %{{[0-9a-z]+}}, i32 1, i32 2)
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-3.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-3.c
> deleted file mode 100644
> index 917b508704ae..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-3.c
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// chain of records, all with attributes
> -struct s1 {
> -  int c;
> -} __reloc__;
> -typedef struct s1 __s1;
> -
> -struct s2 {
> -  union {
> -    __s1 b[3];
> -  };
> -} __reloc__;
> -typedef struct s2 __s2;
> -
> -struct s3 {
> -  __s2 a;
> -} __reloc__;
> -typedef struct s3 __s3;
> -
> -int test(__s3 *arg) {
> -  return arg->a.b[2].c;
> -}
> -
> -// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2)
> -// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-4.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-4.c
> deleted file mode 100644
> index 5ec56d96de18..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-4.c
> +++ /dev/null
> @@ -1,33 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// chain of records, some do not have attributes.
> -struct s1 {
> -  int c;
> -};
> -typedef struct s1 __s1;
> -
> -struct s2 {
> -  union {
> -    __s1 b[3];
> -  };
> -} __reloc__;
> -typedef struct s2 __s2;
> -
> -struct s3 {
> -  __s2 a;
> -};
> -typedef struct s3 __s3;
> -
> -int test(__s3 *arg) {
> -  return arg->a.b[2].c;
> -}
> -
> -// CHECK: define dso_local i32 @test
> -// CHECK-NOT: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %a, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %1, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %b, i32 1, i32 2)
> -// CHECK-NOT: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-5.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-5.c
> deleted file mode 100644
> index 281bcdd782c8..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-5.c
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// chain of records, attribute may be in inner record.
> -struct s1 {
> -  int c;
> -} __reloc__;
> -typedef struct s1 __s1;
> -
> -struct s2 {
> -  union {
> -    __s1 b[3];
> -  } __reloc__;
> -};
> -typedef struct s2 __s2;
> -
> -struct s3 {
> -  __s2 a;
> -} __reloc__;
> -typedef struct s3 __s3;
> -
> -int test(__s3 *arg) {
> -  return arg->a.b[2].c;
> -}
> -
> -// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK-NOT: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2)
> -// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-6.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-6.c
> deleted file mode 100644
> index a763f28bcd61..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-6.c
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// chain of records, both inner and outer record have attributes.
> -struct s1 {
> -  int c;
> -} __reloc__;
> -typedef struct s1 __s1;
> -
> -struct s2 {
> -  union {
> -    __s1 b[3];
> -  } __reloc__;
> -} __reloc__;
> -typedef struct s2 __s2;
> -
> -struct s3 {
> -  __s2 a;
> -} __reloc__;
> -typedef struct s3 __s3;
> -
> -int test(__s3 *arg) {
> -  return arg->a.b[2].c;
> -}
> -
> -// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2)
> -// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-7.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-7.c
> deleted file mode 100644
> index 49f4a4d2b261..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-7.c
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// chain of records, all with attributes
> -struct __reloc__ s1;
> -struct __reloc__ s2;
> -struct __reloc__ s3;
> -
> -struct s1 {
> -  int c;
> -};
> -typedef struct s1 __s1;
> -
> -struct s2 {
> -  union {
> -    __s1 b[3];
> -  };
> -};
> -typedef struct s2 __s2;
> -
> -struct s3 {
> -  __s2 a;
> -};
> -typedef struct s3 __s3;
> -
> -int test(__s3 *arg) {
> -  return arg->a.b[2].c;
> -}
> -
> -// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2)
> -// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
>
> diff  --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-8.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-8.c
> deleted file mode 100644
> index 7febf7cbe2e7..000000000000
> --- a/clang/test/CodeGen/bpf-attr-preserve-access-index-8.c
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -// REQUIRES: bpf-registered-target
> -// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -
> -// chain of records, all with attributes
> -struct s1;
> -struct s2;
> -struct s3;
> -
> -struct s1 {
> -  int c;
> -} __reloc__;
> -typedef struct s1 __s1;
> -
> -struct s2 {
> -  union {
> -    __s1 b[3];
> -  };
> -} __reloc__;
> -typedef struct s2 __s2;
> -
> -struct s3 {
> -  __s2 a;
> -} __reloc__;
> -typedef struct s3 __s3;
> -
> -int test(__s3 *arg) {
> -  return arg->a.b[2].c;
> -}
> -
> -// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0)
> -// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0)
> -// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2)
> -// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0)
>
> diff  --git a/clang/test/Sema/bpf-attr-preserve-access-index.c b/clang/test/Sema/bpf-attr-preserve-access-index.c
> deleted file mode 100644
> index 472f778b6b57..000000000000
> --- a/clang/test/Sema/bpf-attr-preserve-access-index.c
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -// RUN: %clang_cc1 -x c -triple bpf-pc-linux-gnu -dwarf-version=4 -fsyntax-only -verify %s
> -
> -#define __reloc__ __attribute__((preserve_access_index))
> -#define __err_reloc__ __attribute__((preserve_access_index(0)))
> -
> -struct t1 {
> -  int a;
> -  int b[4];
> -  int c:1;
> -} __reloc__;
> -
> -union t2 {
> -  int a;
> -  int b[4];
> -  int c:1;
> -} __reloc__;
> -
> -struct t3 {
> -  int a;
> -} __err_reloc__; // expected-error {{'preserve_access_index' attribute takes no arguments}}
> -
> -struct t4 {
> -  union {
> -    int a;
> -    char b[5];
> -  };
> -  struct {
> -    int c:1;
> -  } __reloc__;
> -  int d;
> -} __reloc__;
> -
> -struct __reloc__ p;
> -struct __reloc__ q;
> -struct p {
> -  int a;
> -};
> -
> -int a __reloc__; // expected-error {{preserve_addess_index attribute only applies to struct or union type}}
> -struct s *p __reloc__; // expected-error {{preserve_addess_index attribute only applies to struct or union type}}
> -
> -void invalid1(const int __reloc__ *arg) {} // expected-error {{preserve_addess_index attribute only applies to struct or union type}}
> -void invalid2() { const int __reloc__ *arg; } // expected-error {{preserve_addess_index attribute only applies to struct or union type}}
> -int valid3(struct t4 *arg) { return arg->a + arg->b[3] + arg->c + arg->d; }
> -int valid4(void *arg) {
> -  struct local_t { int a; int b; } __reloc__;
> -  return ((struct local_t *)arg)->b;
> -}
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list