[clang] [clang][ptrauth] add support for options parameter to __ptrauth (PR #136828)

Oliver Hunt via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 23 03:20:50 PDT 2025


================
@@ -8374,20 +8376,212 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
   IsInvalid |= !S.checkPointerAuthDiscriminatorArg(
       ExtraDiscriminatorArg, Sema::PADAK_ExtraDiscPtrAuth, ExtraDiscriminator);
 
-  if (IsInvalid) {
-    Attr.setInvalid();
-    return;
+  std::optional<PointerAuthenticationMode> AuthenticationMode = std::nullopt;
+  SourceRange AuthenticationModeRange;
+
+  if (AuthenticationOptionsArg && !AuthenticationOptionsArg->containsErrors()) {
+    std::string OptionsString;
+    bool IsInitialized = false;
+    const StringLiteral *OptionsStringLiteral =
+        dyn_cast<StringLiteral>(AuthenticationOptionsArg);
+    auto ReportEvaluationOfExpressionIfNeeded = [&]() {
+      if (OptionsStringLiteral || !IsInitialized)
+        return;
+      S.Diag(AuthenticationOptionsArg->getBeginLoc(),
+             diag::note_ptrauth_evaluating_options)
+          << OptionsString << AuthenticationOptionsArg->getSourceRange();
+    };
+    auto DiagnoseInvalidOptionsParameter = [&](llvm::StringRef Reason,
+                                               std::optional<char> InvalidCh,
+                                               auto Location) {
+      S.Diag(AuthenticationOptionsArg->getExprLoc(),
+             diag::err_ptrauth_invalid_option)
+          << AttrName << Reason << Location << !!InvalidCh
+          << (InvalidCh ? *InvalidCh : '\0');
+      Attr.setInvalid();
+      ReportEvaluationOfExpressionIfNeeded();
+    };
+    if (AuthenticationOptionsArg->isValueDependent() ||
+        AuthenticationOptionsArg->isTypeDependent()) {
+      DiagnoseInvalidOptionsParameter(
+          "is dependent", std::nullopt,
+          AuthenticationOptionsArg->getSourceRange());
+      return;
----------------
ojhunt wrote:

I added this somewhat ad hoc, the behavior I was upstreaming basically just did `if (StringLiteral) { ... } else if (const eval produces a char* + length)  { ... }`, which just happens to exclude dependent values, but EvaluateString has an assertion that the values are not dependent. That might be something we want to fix in future, but it seemed that the sensible thing at the moment was just adding a dependent value/type check as we have no support for dependent ptrauth qualifiers :-/

https://github.com/llvm/llvm-project/pull/136828


More information about the cfe-commits mailing list