[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