[flang-commits] [compiler-rt] [flang] [clang] [clang-tools-extra] [llvm] [clang] Add support for new loop attribute [[clang::code_align()]] (PR #70762)
Erich Keane via flang-commits
flang-commits at lists.llvm.org
Thu Nov 16 12:07:42 PST 2023
================
@@ -322,6 +322,71 @@ static Attr *handleUnlikely(Sema &S, Stmt *St, const ParsedAttr &A,
return ::new (S.Context) UnlikelyAttr(S.Context, A);
}
+CodeAlignAttr *Sema::BuildCodeAlignAttr(const AttributeCommonInfo &CI,
+ Expr *E) {
+ if (!E->isValueDependent()) {
+ llvm::APSInt ArgVal;
+ ExprResult Res = VerifyIntegerConstantExpression(E, &ArgVal);
+ if (Res.isInvalid())
+ return nullptr;
+ E = Res.get();
+
+ // This attribute requires an integer argument which is a constant power of
+ // two between 1 and 4096 inclusive.
+ if (ArgVal < CodeAlignAttr::MinimumAlignment ||
+ ArgVal > CodeAlignAttr::MaximumAlignment ||
+ (ArgVal < CodeAlignAttr::MaximumAlignment && !ArgVal.isPowerOf2())) {
+ if (std::optional<int64_t> Value = ArgVal.trySExtValue())
+ Diag(CI.getLoc(), diag::err_attribute_power_of_two_in_range)
+ << CI << CodeAlignAttr::MinimumAlignment
+ << CodeAlignAttr::MaximumAlignment << Value.value();
+ else
+ Diag(CI.getLoc(), diag::err_attribute_power_of_two_in_range)
+ << CI << CodeAlignAttr::MinimumAlignment
+ << CodeAlignAttr::MaximumAlignment << E;
+ return nullptr;
+ }
+ }
+ return new (Context) CodeAlignAttr(Context, CI, E);
+}
+
+static Attr *handleCodeAlignAttr(Sema &S, Stmt *St, const ParsedAttr &A) {
+
+ Expr *E = A.getArgAsExpr(0);
+ return S.BuildCodeAlignAttr(A, E);
+}
+
+// Emit duplicate error for [[clang::code_align()]] attribute.
+static void CheckForDuplicateCodeAlignAttrs(Sema &S,
+ ArrayRef<const Attr *> Attrs) {
+ // Create a list of CodeAlign attributes only.
+ SmallVector<const CodeAlignAttr *, 8> OnlyCodeAlignAttrs;
----------------
erichkeane wrote:
Also note, if we do NOT diagnose duplicates, we likely have to make sure that we guarantee we pick the first (or last) lexically (likely by not adding them anyway), the `Attrs` collections have changed ordering a few times, so I would hate to try to correct something like that and cause a silent breakage.
https://github.com/llvm/llvm-project/pull/70762
More information about the flang-commits
mailing list