summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclAttr.cpp
diff options
context:
space:
mode:
authorJohn Thompson <John.Thompson.JTSoftware@gmail.com>2009-12-04 21:51:28 +0000
committerJohn Thompson <John.Thompson.JTSoftware@gmail.com>2009-12-04 21:51:28 +0000
commit47981226d591ec2a8f49db1a6e0573814edd4cf7 (patch)
treef5e57194c1662c361d0c86b1fe9d5ca6d97c606b /clang/lib/Sema/SemaDeclAttr.cpp
parenteebf029d1dc50b702b4c2e5175e68bbb1dfcb196 (diff)
downloadbcm5719-llvm-47981226d591ec2a8f49db1a6e0573814edd4cf7.tar.gz
bcm5719-llvm-47981226d591ec2a8f49db1a6e0573814edd4cf7.zip
Fix for PR5650 - Revised vector_size attribute handling to be done earlier before declaration is finalized.
llvm-svn: 90600
Diffstat (limited to 'clang/lib/Sema/SemaDeclAttr.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp87
1 files changed, 1 insertions, 86 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index b2124fe0145..2e641d9041a 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -202,91 +202,6 @@ static void HandleExtVectorTypeAttr(Scope *scope, Decl *d,
}
}
-
-/// HandleVectorSizeAttribute - this attribute is only applicable to integral
-/// and float scalars, although arrays, pointers, and function return values are
-/// allowed in conjunction with this construct. Aggregates with this attribute
-/// are invalid, even if they are of the same size as a corresponding scalar.
-/// The raw attribute should contain precisely 1 argument, the vector size for
-/// the variable, measured in bytes. If curType and rawAttr are well formed,
-/// this routine will return a new vector type.
-static void HandleVectorSizeAttr(Decl *D, const AttributeList &Attr, Sema &S) {
- QualType CurType;
- if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
- CurType = VD->getType();
- else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(D))
- CurType = TD->getUnderlyingType();
- else {
- S.Diag(D->getLocation(), diag::err_attr_wrong_decl)
- << "vector_size" << SourceRange(Attr.getLoc(), Attr.getLoc());
- return;
- }
-
- // Check the attribute arugments.
- if (Attr.getNumArgs() != 1) {
- S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 1;
- return;
- }
- Expr *sizeExpr = static_cast<Expr *>(Attr.getArg(0));
- llvm::APSInt vecSize(32);
- if (!sizeExpr->isIntegerConstantExpr(vecSize, S.Context)) {
- S.Diag(Attr.getLoc(), diag::err_attribute_argument_not_int)
- << "vector_size" << sizeExpr->getSourceRange();
- return;
- }
- // navigate to the base type - we need to provide for vector pointers, vector
- // arrays, and functions returning vectors.
- if (CurType->isPointerType() || CurType->isArrayType() ||
- CurType->isFunctionType()) {
- S.Diag(Attr.getLoc(), diag::err_unsupported_vector_size) << CurType;
- return;
- /* FIXME: rebuild the type from the inside out, vectorizing the inner type.
- do {
- if (PointerType *PT = dyn_cast<PointerType>(canonType))
- canonType = PT->getPointeeType().getTypePtr();
- else if (ArrayType *AT = dyn_cast<ArrayType>(canonType))
- canonType = AT->getElementType().getTypePtr();
- else if (FunctionType *FT = dyn_cast<FunctionType>(canonType))
- canonType = FT->getResultType().getTypePtr();
- } while (canonType->isPointerType() || canonType->isArrayType() ||
- canonType->isFunctionType());
- */
- }
- // the base type must be integer or float, and can't already be a vector.
- if (CurType->isVectorType() ||
- (!CurType->isIntegerType() && !CurType->isRealFloatingType())) {
- S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType;
- 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);
-
- // the vector size needs to be an integral multiple of the type size.
- if (vectorSize % typeSize) {
- S.Diag(Attr.getLoc(), diag::err_attribute_invalid_size)
- << sizeExpr->getSourceRange();
- return;
- }
- if (vectorSize == 0) {
- S.Diag(Attr.getLoc(), diag::err_attribute_zero_size)
- << sizeExpr->getSourceRange();
- return;
- }
-
- // Success! Instantiate the vector type, the number of elements is > 0, and
- // not required to be a power of 2, unlike GCC.
- CurType = S.Context.getVectorType(CurType, vectorSize/typeSize);
-
- if (ValueDecl *VD = dyn_cast<ValueDecl>(D))
- VD->setType(CurType);
- else {
- // FIXME: preserve existing source info.
- DeclaratorInfo *DInfo = S.Context.getTrivialDeclaratorInfo(CurType);
- cast<TypedefDecl>(D)->setTypeDeclaratorInfo(DInfo);
- }
-}
-
static void HandlePackedAttr(Decl *d, const AttributeList &Attr, Sema &S) {
// check the attribute arguments.
if (Attr.getNumArgs() > 0) {
@@ -1964,6 +1879,7 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D,
case AttributeList::AT_IBOutlet: HandleIBOutletAttr (D, Attr, S); break;
case AttributeList::AT_address_space:
case AttributeList::AT_objc_gc:
+ case AttributeList::AT_vector_size:
// Ignore these, these are type attributes, handled by
// ProcessTypeAttributes.
break;
@@ -2013,7 +1929,6 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D,
case AttributeList::AT_unavailable: HandleUnavailableAttr (D, Attr, S); break;
case AttributeList::AT_unused: HandleUnusedAttr (D, Attr, S); break;
case AttributeList::AT_used: HandleUsedAttr (D, Attr, S); break;
- case AttributeList::AT_vector_size: HandleVectorSizeAttr (D, Attr, S); break;
case AttributeList::AT_visibility: HandleVisibilityAttr (D, Attr, S); break;
case AttributeList::AT_warn_unused_result: HandleWarnUnusedResult(D,Attr,S);
break;
OpenPOWER on IntegriCloud