@@ -9561,6 +9561,41 @@ class PointerExprEvaluator
95619561 return true;
95629562 }
95639563
9564+ bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E) {
9565+ // This is the only UETT we evaluate here.
9566+ assert(E->getKind() == UETT_PtrAuthSchemaOptions &&
9567+ "Unknown UnaryExprOrTypeTraitExpr");
9568+
9569+ // Note for review: there are other UETTs down the road
9570+ // that make a switch make sense, but for now this is the only
9571+ // one should this just be an
9572+ // if (E->getKind() != UETT_PtrAuthSchemaOptions)
9573+ // return false;
9574+ ASTContext &Ctx = Info.Ctx;
9575+ switch (E->getKind()) {
9576+ case UETT_PtrAuthSchemaOptions: {
9577+ auto ArgumentType = E->getArgumentType();
9578+ auto Qualifier = Ctx.getExplicitOrImplicitPointerAuth(ArgumentType);
9579+ if (!Qualifier)
9580+ return false;
9581+ if (!Qualifier->isPresent())
9582+ return false;
9583+ auto OptionsString = Ctx.getPointerAuthOptionsString(*Qualifier);
9584+ QualType StrTy =
9585+ Ctx.getStringLiteralArrayType(Ctx.CharTy, OptionsString.length());
9586+ StringLiteral *OptionsLit =
9587+ StringLiteral::Create(Ctx, OptionsString, StringLiteralKind::Ordinary,
9588+ /*Pascal=*/false, StrTy, SourceLocation());
9589+ APValue OptionsVal(OptionsLit, CharUnits::Zero(),
9590+ {APValue::LValuePathEntry::ArrayIndex(0)},
9591+ /*OnePastTheEnd=*/false);
9592+ return Success(OptionsVal, E);
9593+ }
9594+ default:
9595+ return false;
9596+ }
9597+ }
9598+
95649599 bool VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E) {
95659600 std::string ResultStr = E->ComputeName(Info.Ctx);
95669601
@@ -14878,6 +14913,43 @@ bool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr(
1487814913 return Success(
1487914914 Info.Ctx.getPointerAuthTypeDiscriminator(E->getArgumentType()), E);
1488014915 }
14916+ case UETT_PtrAuthHasAuthentication: {
14917+ auto ArgumentType = E->getArgumentType();
14918+ auto Qualifier = Info.Ctx.getExplicitOrImplicitPointerAuth(ArgumentType);
14919+ if (!Qualifier)
14920+ return false;
14921+ return Success(Qualifier->isPresent(), E);
14922+ }
14923+ case UETT_PtrAuthSchemaKey: {
14924+ auto ArgumentType = E->getArgumentType();
14925+ auto Qualifier = Info.Ctx.getExplicitOrImplicitPointerAuth(ArgumentType);
14926+ if (!Qualifier)
14927+ return false;
14928+ if (!Qualifier->isPresent())
14929+ return false;
14930+ return Success(Qualifier->getKey(), E);
14931+ }
14932+ case UETT_PtrAuthSchemaIsAddressDiscriminated: {
14933+ auto ArgumentType = E->getArgumentType();
14934+ auto Qualifier = Info.Ctx.getExplicitOrImplicitPointerAuth(ArgumentType);
14935+ if (!Qualifier)
14936+ return false;
14937+ if (!Qualifier->isPresent())
14938+ return false;
14939+ return Success(Qualifier->isAddressDiscriminated(), E);
14940+ }
14941+ case UETT_PtrAuthSchemaExtraDiscriminator: {
14942+ auto ArgumentType = E->getArgumentType();
14943+ auto Qualifier = Info.Ctx.getExplicitOrImplicitPointerAuth(ArgumentType);
14944+ if (!Qualifier)
14945+ return false;
14946+ if (!Qualifier->isPresent())
14947+ return false;
14948+ return Success(Qualifier->getExtraDiscriminator(), E);
14949+ }
14950+ case UETT_PtrAuthSchemaOptions:
14951+ llvm_unreachable(
14952+ "UETT_PtrAuthSchemaOptions should be evaluated as a pointer");
1488114953 case UETT_VecStep: {
1488214954 QualType Ty = E->getTypeOfArgument();
1488314955
0 commit comments