[PATCH] fixing clang assertion failure when creating illegal vector types

Eli Friedman eli.friedman at gmail.com
Thu Jul 25 17:56:52 PDT 2013


Committed a slightly fixed-up version in r187176.

-Eli

On Wed, Jul 24, 2013 at 2:55 PM, Yunzhong Gao
<Yunzhong_Gao at playstation.sony.com> wrote:
> ygao added you to the CC list for the revision "fixing clang assertion failure when creating illegal vector types".
>
> Hi,
>
> When compiling the following test cases, clang hits assertion error:
> ```
> /* test1.c
>  * clang::ASTContext::getVectorType(): Assertion `vecType->isBuiltinType()' failed.
>  */
> enum { e } x __attribute__((__vector_size__(64))); // enum cannot be the element
>                                                    // type of a vector
> /* end of test1 */
> ```
>
> ```
> /* test2.c
>  * llvm::VectorType::get(): Assertion `NumElements > 0 &&
>  *    "#Elements of a VectorType must be greater than 0"' failed.
>  */
> __attribute__((__vector_size__(1024))) signed char a; // vector size too large
> /* end of test2 */
> ```
>
> Both of them are error cases, but it would be nicer for clang to issue an error message instead
> of assertion failures. My patch attempts to detect each case and issue error messages.
>
> Would appreciate it if someone could review and commit this for me.
>
> Many thanks,
> - Gao.
>
> http://llvm-reviews.chandlerc.com/D1214
>
> Files:
>   include/clang/AST/Type.h
>   lib/Sema/SemaType.cpp
>   test/Sema/types.c
>
> Index: include/clang/AST/Type.h
> ===================================================================
> --- include/clang/AST/Type.h
> +++ include/clang/AST/Type.h
> @@ -1315,6 +1315,8 @@
>
>      /// NumElements - The number of elements in the vector.
>      unsigned NumElements : 29 - NumTypeBits;
> +
> +    enum { MaxNumElements = (1 << (29 - NumTypeBits)) - 1 };
>    };
>
>    class AttributedTypeBitfields {
> @@ -2524,6 +2526,9 @@
>
>    QualType getElementType() const { return ElementType; }
>    unsigned getNumElements() const { return VectorTypeBits.NumElements; }
> +  static bool isVectorSizeTooLarge(unsigned NumElements) {
> +    return NumElements > VectorTypeBitfields::MaxNumElements;
> +  }
>
>    bool isSugared() const { return false; }
>    QualType desugar() const { return QualType(this, 0); }
> Index: lib/Sema/SemaType.cpp
> ===================================================================
> --- lib/Sema/SemaType.cpp
> +++ lib/Sema/SemaType.cpp
> @@ -4522,6 +4522,12 @@
>      Attr.setInvalid();
>      return;
>    }
> +  // The base type cannot be enum.
> +  if (!CurType->isBuiltinType()) {
> +    S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
> +    Attr.setInvalid();
> +    return;
> +  }
>    unsigned typeSize = static_cast<unsigned>(S.Context.getTypeSize(CurType));
>    // vecSize is specified in bytes - convert to bits.
>    unsigned vectorSize = static_cast<unsigned>(vecSize.getZExtValue() * 8);
> @@ -4533,6 +4539,12 @@
>      Attr.setInvalid();
>      return;
>    }
> +  if (VectorType::isVectorSizeTooLarge(vectorSize / typeSize)) {
> +    S.Diag(Attr.getLoc(), diag::err_attribute_size_too_large)
> +      << sizeExpr->getSourceRange();
> +    Attr.setInvalid();
> +    return;
> +  }
>    if (vectorSize == 0) {
>      S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
>        << sizeExpr->getSourceRange();
> Index: test/Sema/types.c
> ===================================================================
> --- test/Sema/types.c
> +++ test/Sema/types.c
> @@ -64,3 +64,9 @@
>  void test2(int i) {
>    char c = (char __attribute__((may_alias))) i;
>  }
> +
> +// vector size too large
> +int __attribute__ ((vector_size(8192))) x1; // expected-error {{vector size too large}}
> +
> +// no support for vector enum type
> +enum { e_2 } x2 __attribute__((vector_size(64))); // expected-error {{invalid vector element type}}
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



More information about the cfe-commits mailing list