Better handling of the aligned attribute.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47216 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp
index 61de36f..24013cd 100644
--- a/Sema/SemaDecl.cpp
+++ b/Sema/SemaDecl.cpp
@@ -1835,8 +1835,8 @@
Expr *sizeExpr = static_cast<Expr *>(rawAttr->getArg(0));
llvm::APSInt vecSize(32);
if (!sizeExpr->isIntegerConstantExpr(vecSize, Context)) {
- Diag(rawAttr->getAttributeLoc(), diag::err_attribute_vector_size_not_int,
- sizeExpr->getSourceRange());
+ Diag(rawAttr->getAttributeLoc(), diag::err_attribute_argument_not_int,
+ "ocu_vector_type", sizeExpr->getSourceRange());
return;
}
// unlike gcc's vector_size attribute, we do not allow vectors to be defined
@@ -1873,8 +1873,8 @@
Expr *sizeExpr = static_cast<Expr *>(rawAttr->getArg(0));
llvm::APSInt vecSize(32);
if (!sizeExpr->isIntegerConstantExpr(vecSize, Context)) {
- Diag(rawAttr->getAttributeLoc(), diag::err_attribute_vector_size_not_int,
- sizeExpr->getSourceRange());
+ Diag(rawAttr->getAttributeLoc(), diag::err_attribute_argument_not_int,
+ "vector_size", sizeExpr->getSourceRange());
return QualType();
}
// navigate to the base type - we need to provide for vector pointers,
@@ -1959,15 +1959,24 @@
return;
}
- // TODO: We probably need to actually do something with aligned attribute.
- if (rawAttr->getNumArgs() == 0)
+ unsigned Align = 0;
+
+ if (rawAttr->getNumArgs() == 0) {
+ // FIXME: This should be the target specific maximum alignment.
+ // (For now we just use 128 bits which is the maximum on X86.
+ Align = 128;
return;
+ } else {
+ Expr *alignmentExpr = static_cast<Expr *>(rawAttr->getArg(0));
+ llvm::APSInt alignment(32);
+ if (!alignmentExpr->isIntegerConstantExpr(alignment, Context)) {
+ Diag(rawAttr->getAttributeLoc(), diag::err_attribute_argument_not_int,
+ "aligned", alignmentExpr->getSourceRange());
+ return;
+ }
+
+ Align = alignment.getZExtValue() * 8;
+ }
- Expr *alignmentExpr = static_cast<Expr *>(rawAttr->getArg(0));
- llvm::APSInt alignment(32);
- if (!alignmentExpr->isIntegerConstantExpr(alignment, Context)) {
- Diag(rawAttr->getAttributeLoc(), diag::err_attribute_vector_size_not_int,
- alignmentExpr->getSourceRange());
- return;
- }
+ d->addAttr(new AlignedAttr(Align));
}