[clang] Add clang atomic control options and attribute (PR #114841)
Yaxun Liu via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 23 17:02:23 PST 2025
================
@@ -625,6 +625,43 @@ static Attr *handleHLSLControlFlowHint(Sema &S, Stmt *St, const ParsedAttr &A,
return ::new (S.Context) HLSLControlFlowHintAttr(S.Context, A);
}
+static Attr *handleAtomicAttr(Sema &S, Stmt *St, const ParsedAttr &A,
+ SourceRange Range) {
+ if (!isa<CompoundStmt>(St)) {
+ S.Diag(St->getBeginLoc(), diag::err_attribute_wrong_decl_type)
+ << A << "compound statement";
+ return nullptr;
+ }
+
+ llvm::SmallVector<llvm::StringRef, 4> OptionStrings;
+ AtomicOptionsOverride AOO;
+
+ for (unsigned i = 0; i < A.getNumArgs(); ++i) {
+ IdentifierLoc *Arg = A.getArgAsIdent(i);
+ if (!Arg || !Arg->Ident) {
+ S.Diag(A.getLoc(), diag::err_attribute_argument_type)
+ << A << AANT_ArgumentIdentifier;
+ continue;
+ }
+ llvm::StringRef Option = Arg->Ident->getName();
+ bool value = false;
+ auto KindOpt = AtomicOptionsOverride::parseAtomicOverrideKey(Option, value);
+ if (KindOpt) {
+ AOO.setAtomicOverride(*KindOpt, value);
+ OptionStrings.push_back(Option);
+ } else {
+ S.Diag(Arg->Loc, diag::err_attribute_invalid_atomic_argument)
+ << Option << A;
+ return nullptr;
+ }
+ }
+
+ auto *AA = ::new (S.Context)
+ AtomicAttr(S.Context, A, OptionStrings.data(), OptionStrings.size());
+ AA->setAtomicOptionsOverride(AOO);
----------------
yxsamliu wrote:
Yes we no longer needs AtomicOptionsOverride since we could use AtomicAttr to override AtomicOptions during clang codegen. Will remove AtomicOptionsOverride
https://github.com/llvm/llvm-project/pull/114841
More information about the cfe-commits
mailing list