================ @@ -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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits