[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