================
@@ -2658,6 +2682,89 @@ std::optional<MemoryEffects> LLParser::parseMemoryAttr()
{
return std::nullopt;
}
+std::optional<DenormalMode> LLParser::parseDenormalFPEnvEntry() {
+ std::optional<DenormalMode::DenormalModeKind> OutputMode =
+ keywordToDenormalModeKind(Lex.getKind());
+ if (!OutputMode) {
+ tokError("expected denormal behavior kind (ieee, preservesign, "
+ "positivezero, dynamic)");
+ return {};
+ }
+
+ Lex.Lex();
+
+ std::optional<DenormalMode::DenormalModeKind> InputMode;
+ if (EatIfPresent(lltok::bar)) {
+ InputMode = keywordToDenormalModeKind(Lex.getKind());
+ if (!InputMode) {
+ tokError("expected denormal behavior kind (ieee, preservesign, "
+ "positivezero, dynamic)");
+ return {};
+ }
+
+ Lex.Lex();
+ } else {
+ // Single item, input == output mode
+ InputMode = OutputMode;
+ }
+
+ return DenormalMode(*OutputMode, *InputMode);
+}
+
+std::optional<DenormalFPEnv> LLParser::parseDenormalFPEnvAttr() {
+ // We use syntax like denormal_fpenv(float: preservesign), so the colon
should
+ // not be interpreted as a label terminator.
+ Lex.setIgnoreColonInIdentifiers(true);
+ llvm::scope_exit _([&] { Lex.setIgnoreColonInIdentifiers(false); });
+
+ Lex.Lex();
+
+ if (parseToken(lltok::lparen, "expected '('"))
+ return std::nullopt;
+
+ DenormalMode DefaultMode = DenormalMode::getIEEE();
+ DenormalMode F32Mode = DenormalMode::getInvalid();
+
+ bool HasDefaultSection = false;
+ if (Lex.getKind() != lltok::Type) {
+ std::optional<DenormalMode> ParsedDefaultMode = parseDenormalFPEnvEntry();
+ if (!ParsedDefaultMode)
+ return {};
+ DefaultMode = *ParsedDefaultMode;
+ HasDefaultSection = true;
+ }
+
+ bool HasComma = EatIfPresent(lltok::comma);
+ if (Lex.getKind() == lltok::Type) {
+ if (HasDefaultSection && !HasComma) {
+ tokError("expected ',' before float:");
+ return {};
+ }
+
+ Type *Ty = nullptr;
+ if (parseType(Ty) || !Ty->isFloatTy()) {
+ tokError("expected float:");
+ return {};
+ }
+
+ if (parseToken(lltok::colon, "expected ':' before float denormal_fpenv"))
+ return {};
+
+ std::optional<DenormalMode> ParsedF32Mode = parseDenormalFPEnvEntry();
+ if (!ParsedF32Mode)
+ return {};
+
+ F32Mode = *ParsedF32Mode;
+ }
+
+ if (!EatIfPresent(lltok::rparen)) {
----------------
nikic wrote:
Can use parseToken here as well.
https://github.com/llvm/llvm-project/pull/174293
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits