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

via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 23 01:52:13 PDT 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff HEAD~1 HEAD --extensions cpp,c,h -- clang/test/CodeGen/ptrauth-stripping.c clang/test/Sema/ptrauth-qualifier-options.c clang/include/clang/Basic/LangOptions.h clang/include/clang/Sema/Sema.h clang/lib/Parse/ParseDecl.cpp clang/lib/Sema/SemaType.cpp clang/test/Parser/ptrauth-qualifier.c clang/test/Sema/ptrauth-qualifier.c
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 469eec535..a379a271b 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -5691,7 +5691,11 @@ public:
   void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method);
   void ActOnFinishDelayedMemberInitializers(Decl *Record);
 
-  enum class StringEvaluationContext { StaticAssert = 0, Asm = 1, PtrauthOptions = 2 };
+  enum class StringEvaluationContext {
+    StaticAssert = 0,
+    Asm = 1,
+    PtrauthOptions = 2
+  };
 
   bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx,
                         StringEvaluationContext EvalContext,
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index fbb8a94e5..9aa548ef6 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -8379,37 +8379,52 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
   std::optional<PointerAuthenticationMode> AuthenticationMode = std::nullopt;
   SourceRange AuthenticationModeRange;
 
-  if (AuthenticationOptionsArg && !AuthenticationOptionsArg->containsErrors() ) {
+  if (AuthenticationOptionsArg && !AuthenticationOptionsArg->containsErrors()) {
     std::string OptionsString;
     bool IsInitialized = false;
-    const StringLiteral *OptionsStringLiteral = dyn_cast<StringLiteral>(AuthenticationOptionsArg);
-    auto ReportEvaluationOfExpressionIfNeeded = [&](){
+    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();
+             diag::note_ptrauth_evaluating_options)
+          << OptionsString << AuthenticationOptionsArg->getSourceRange();
     };
-    auto DiagnoseInvalidOptionsParameter = [&](llvm::StringRef Reason, std::optional<char> InvalidCh, auto Location) {
+    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');
+          << AttrName << Reason << Location << !!InvalidCh
+          << (InvalidCh ? *InvalidCh : '\0');
       Attr.setInvalid();
       ReportEvaluationOfExpressionIfNeeded();
     };
-    if (AuthenticationOptionsArg->isValueDependent() || AuthenticationOptionsArg->isTypeDependent()) {
-      DiagnoseInvalidOptionsParameter("is dependent", std::nullopt, AuthenticationOptionsArg->getSourceRange());
+    if (AuthenticationOptionsArg->isValueDependent() ||
+        AuthenticationOptionsArg->isTypeDependent()) {
+      DiagnoseInvalidOptionsParameter(
+          "is dependent", std::nullopt,
+          AuthenticationOptionsArg->getSourceRange());
       return;
     }
     if (OptionsStringLiteral) {
       if (OptionsStringLiteral->containsNonAsciiOrNull()) {
-        DiagnoseInvalidOptionsParameter("contains invalid characters", std::nullopt, AuthenticationOptionsArg->getSourceRange());
+        DiagnoseInvalidOptionsParameter(
+            "contains invalid characters", std::nullopt,
+            AuthenticationOptionsArg->getSourceRange());
         return;
       }
       OptionsString = OptionsStringLiteral->getString();
-    } else if (S.EvaluateAsString(AuthenticationOptionsArg, OptionsString, S.Context, Sema::StringEvaluationContext::PtrauthOptions, /*ErrorOnInvalidMessage=*/false)) {
+    } else if (S.EvaluateAsString(AuthenticationOptionsArg, OptionsString,
+                                  S.Context,
+                                  Sema::StringEvaluationContext::PtrauthOptions,
+                                  /*ErrorOnInvalidMessage=*/false)) {
       for (char Ch : OptionsString) {
         if (!Ch || !isascii(Ch)) {
-          DiagnoseInvalidOptionsParameter("contains invalid characters", Ch, AuthenticationOptionsArg->getSourceRange());
+          DiagnoseInvalidOptionsParameter(
+              "contains invalid characters", Ch,
+              AuthenticationOptionsArg->getSourceRange());
           return;
         }
       }
@@ -8423,14 +8438,16 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
 
     auto OptionStringIdxLocation = [&](unsigned Idx) {
       if (OptionsStringLiteral)
-        return OptionsStringLiteral->getLocationOfByte(Idx, Ctx.getSourceManager(), Ctx.getLangOpts(), Ctx.getTargetInfo());
+        return OptionsStringLiteral->getLocationOfByte(
+            Idx, Ctx.getSourceManager(), Ctx.getLangOpts(),
+            Ctx.getTargetInfo());
       return AuthenticationOptionsArg->getBeginLoc();
     };
     auto OptionStringRange = [&](unsigned StartIdx, unsigned EndIdx) {
       if (!OptionsStringLiteral)
         return AuthenticationOptionsArg->getSourceRange();
       return SourceRange(OptionStringIdxLocation(StartIdx),
-                        OptionStringIdxLocation(EndIdx));
+                         OptionStringIdxLocation(EndIdx));
     };
     auto NextOption = [&]() -> std::optional<std::pair<unsigned, unsigned>> {
       auto ConsumeChar = [&](auto Filter) -> char {
@@ -8448,7 +8465,7 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
         }
       };
       auto MatchCharacter = [](char MatchChar) {
-        return [MatchChar](char Ch){ return MatchChar == Ch; };
+        return [MatchChar](char Ch) { return MatchChar == Ch; };
       };
       SkipWhiteSpace();
       if (CurrentIdx == OptionsString.size())
@@ -8457,7 +8474,7 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
         if (!ConsumeChar(MatchCharacter(','))) {
           SourceLocation ErrorLocation = OptionStringIdxLocation(CurrentIdx);
           S.Diag(ErrorLocation, diag::err_ptrauth_option_missing_comma)
-            << AttrName << ErrorLocation;
+              << AttrName << ErrorLocation;
           ReportEvaluationOfExpressionIfNeeded();
           return std::nullopt;
         }
@@ -8478,7 +8495,8 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
       if (OptionStartIdx == OptionEndIdx) {
         StringRef ErrorString(&OptionsString[CurrentIdx], 1);
         SourceLocation ErrorLocation = OptionStringIdxLocation(OptionStartIdx);
-        S.Diag(ErrorLocation, diag::err_ptrauth_option_unexpected_token) << ErrorString << AttrName << ErrorLocation;
+        S.Diag(ErrorLocation, diag::err_ptrauth_option_unexpected_token)
+            << ErrorString << AttrName << ErrorLocation;
         ReportEvaluationOfExpressionIfNeeded();
         IsInvalid = true;
         return std::nullopt;
@@ -8487,7 +8505,8 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
     };
 
     auto OptionHandler = [&](StringRef TokenStr, SourceRange TokenRange,
-                             auto Value, auto *Option, SourceRange *OptionRange) {
+                             auto Value, auto *Option,
+                             SourceRange *OptionRange) {
       SourceRange DiagnosedRange = TokenRange;
       if (!OptionsStringLiteral)
         DiagnosedRange = AuthenticationOptionsArg->getSourceRange();
@@ -8497,40 +8516,42 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
         return true;
       }
       bool IsAuthenticationMode =
-        std::is_same_v<decltype(Value), PointerAuthenticationMode>;
-      S.Diag(OptionRange->getBegin(), diag::err_ptrauth_repeated_authentication_option)
+          std::is_same_v<decltype(Value), PointerAuthenticationMode>;
+      S.Diag(OptionRange->getBegin(),
+             diag::err_ptrauth_repeated_authentication_option)
           << AttrName << !IsAuthenticationMode << *OptionRange;
       IsInvalid = true;
       if (OptionsStringLiteral)
         S.Diag(OptionRange->getBegin(),
                diag::note_ptrauth_previous_authentication_option)
-               << AttrName << !IsAuthenticationMode << *OptionRange;
+            << AttrName << !IsAuthenticationMode << *OptionRange;
       return false;
     };
-    llvm::DenseMap<StringRef, std::function<bool(llvm::StringRef, SourceRange)>> OptionHandlers = {
-        {PointerAuthenticationOptionStrip,
-         [&](StringRef TokenStr, SourceRange Range) {
-           return OptionHandler(TokenStr, Range,
-                                PointerAuthenticationMode::Strip,
-                                &AuthenticationMode, &AuthenticationModeRange);
-         }},
-        {PointerAuthenticationOptionSignAndStrip,
-         [&](StringRef TokenStr, SourceRange Range) {
-           return OptionHandler(TokenStr, Range,
-                                PointerAuthenticationMode::SignAndStrip,
-                                &AuthenticationMode, &AuthenticationModeRange);
-         }},
-        {PointerAuthenticationOptionSignAndAuth,
-         [&](StringRef TokenStr, SourceRange Range) {
-           return OptionHandler(TokenStr, Range,
-                                PointerAuthenticationMode::SignAndAuth,
-                                &AuthenticationMode, &AuthenticationModeRange);
-         }}};
+    llvm::DenseMap<StringRef, std::function<bool(llvm::StringRef, SourceRange)>>
+        OptionHandlers = {
+            {PointerAuthenticationOptionStrip,
+             [&](StringRef TokenStr, SourceRange Range) {
+               return OptionHandler(
+                   TokenStr, Range, PointerAuthenticationMode::Strip,
+                   &AuthenticationMode, &AuthenticationModeRange);
+             }},
+            {PointerAuthenticationOptionSignAndStrip,
+             [&](StringRef TokenStr, SourceRange Range) {
+               return OptionHandler(
+                   TokenStr, Range, PointerAuthenticationMode::SignAndStrip,
+                   &AuthenticationMode, &AuthenticationModeRange);
+             }},
+            {PointerAuthenticationOptionSignAndAuth,
+             [&](StringRef TokenStr, SourceRange Range) {
+               return OptionHandler(
+                   TokenStr, Range, PointerAuthenticationMode::SignAndAuth,
+                   &AuthenticationMode, &AuthenticationModeRange);
+             }}};
     while (std::optional<std::pair<unsigned, unsigned>> Option = NextOption()) {
       StringRef OptionString(&OptionsString[Option->first],
                              Option->second - Option->first);
-      SourceRange OptionRange = OptionStringRange(Option->first,
-                                                  Option->second);
+      SourceRange OptionRange =
+          OptionStringRange(Option->first, Option->second);
       auto Handler = OptionHandlers.find(OptionString);
       if (Handler == OptionHandlers.end()) {
         S.Diag(OptionStringIdxLocation(Option->first),
@@ -8560,7 +8581,7 @@ static void HandlePtrAuthQualifier(ASTContext &Ctx, QualType &T,
 
   if (T.getPointerAuth()) {
     S.Diag(Attr.getLoc(), diag::err_ptrauth_qualifier_redundant)
-    << T << AttrName;
+        << T << AttrName;
     Attr.setInvalid();
     return;
   }

``````````

</details>


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


More information about the cfe-commits mailing list