@@ -220,6 +220,41 @@ void parseVisibilityAttr(OpAsmParser &parser, cir::VisibilityAttr &visibility) {
220220 visibility = cir::VisibilityAttr::get (parser.getContext (), visibilityKind);
221221}
222222
223+ // ===----------------------------------------------------------------------===//
224+ // InlineKindAttr (FIXME: remove once FuncOp uses assembly format)
225+ // ===----------------------------------------------------------------------===//
226+
227+ ParseResult parseInlineKindAttr (OpAsmParser &parser,
228+ cir::InlineKindAttr &inlineKindAttr) {
229+ // Static list of possible inline kind keywords
230+ static constexpr llvm::StringRef keywords[] = {" no_inline" , " always_inline" ,
231+ " inline_hint" };
232+
233+ // Parse the inline kind keyword (optional)
234+ llvm::StringRef keyword;
235+ if (parser.parseOptionalKeyword (&keyword, keywords).failed ()) {
236+ // Not an inline kind keyword, leave inlineKindAttr empty
237+ return success ();
238+ }
239+
240+ // Parse the enum value from the keyword
241+ auto inlineKindResult = ::cir::symbolizeEnum<::cir::InlineKind>(keyword);
242+ if (!inlineKindResult) {
243+ return parser.emitError (parser.getCurrentLocation (), " expected one of [" )
244+ << llvm::join (llvm::ArrayRef (keywords), " , " )
245+ << " ] for inlineKind, got: " << keyword;
246+ }
247+
248+ inlineKindAttr =
249+ ::cir::InlineKindAttr::get (parser.getContext(), *inlineKindResult);
250+ return success ();
251+ }
252+
253+ void printInlineKindAttr (OpAsmPrinter &p, cir::InlineKindAttr inlineKindAttr) {
254+ if (inlineKindAttr) {
255+ p << " " << stringifyInlineKind (inlineKindAttr.getValue ());
256+ }
257+ }
223258// ===----------------------------------------------------------------------===//
224259// CIR Custom Parsers/Printers
225260// ===----------------------------------------------------------------------===//
@@ -1753,6 +1788,7 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
17531788
17541789 mlir::StringAttr builtinNameAttr = getBuiltinAttrName (state.name );
17551790 mlir::StringAttr coroutineNameAttr = getCoroutineAttrName (state.name );
1791+ mlir::StringAttr inlineKindNameAttr = getInlineKindAttrName (state.name );
17561792 mlir::StringAttr lambdaNameAttr = getLambdaAttrName (state.name );
17571793 mlir::StringAttr noProtoNameAttr = getNoProtoAttrName (state.name );
17581794 mlir::StringAttr visNameAttr = getSymVisibilityAttrName (state.name );
@@ -1765,6 +1801,14 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
17651801 if (::mlir::succeeded (
17661802 parser.parseOptionalKeyword (coroutineNameAttr.strref ())))
17671803 state.addAttribute (coroutineNameAttr, parser.getBuilder ().getUnitAttr ());
1804+
1805+ // Parse optional inline kind attribute
1806+ cir::InlineKindAttr inlineKindAttr;
1807+ if (failed (parseInlineKindAttr (parser, inlineKindAttr)))
1808+ return failure ();
1809+ if (inlineKindAttr)
1810+ state.addAttribute (inlineKindNameAttr, inlineKindAttr);
1811+
17681812 if (::mlir::succeeded (parser.parseOptionalKeyword (lambdaNameAttr.strref ())))
17691813 state.addAttribute (lambdaNameAttr, parser.getBuilder ().getUnitAttr ());
17701814 if (parser.parseOptionalKeyword (noProtoNameAttr).succeeded ())
@@ -1890,36 +1934,6 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
18901934 }).failed ())
18911935 return failure ();
18921936
1893- // Parse optional inline kind: inline(never|always|hint)
1894- if (parser.parseOptionalKeyword (" inline" ).succeeded ()) {
1895- if (parser.parseLParen ().failed ())
1896- return failure ();
1897-
1898- llvm::StringRef inlineKindStr;
1899- const std::array<llvm::StringRef, cir::getMaxEnumValForInlineKind ()>
1900- allowedInlineKindStrs{
1901- cir::stringifyInlineKind (cir::InlineKind::NoInline),
1902- cir::stringifyInlineKind (cir::InlineKind::AlwaysInline),
1903- cir::stringifyInlineKind (cir::InlineKind::InlineHint),
1904- };
1905- if (parser.parseOptionalKeyword (&inlineKindStr, allowedInlineKindStrs)
1906- .failed ())
1907- return parser.emitError (parser.getCurrentLocation (),
1908- " expected 'never', 'always', or 'hint'" );
1909-
1910- std::optional<InlineKind> inlineKind =
1911- cir::symbolizeInlineKind (inlineKindStr);
1912- if (!inlineKind)
1913- return parser.emitError (parser.getCurrentLocation (),
1914- " invalid inline kind" );
1915-
1916- state.addAttribute (getInlineKindAttrName (state.name ),
1917- cir::InlineAttr::get (builder.getContext (), *inlineKind));
1918-
1919- if (parser.parseRParen ().failed ())
1920- return failure ();
1921- }
1922-
19231937 // Parse the rest of the attributes.
19241938 NamedAttrList parsedAttrs;
19251939 if (parser.parseOptionalAttrDictWithKeyword (parsedAttrs))
@@ -2028,6 +2042,8 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
20282042 if (getCoroutine ())
20292043 p << " coroutine" ;
20302044
2045+ printInlineKindAttr (p, getInlineKindAttr ());
2046+
20312047 if (getLambda ())
20322048 p << " lambda" ;
20332049
@@ -2083,10 +2099,6 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
20832099 p << " (" << globalDtorPriority.value () << " )" ;
20842100 }
20852101
2086- if (cir::InlineAttr inlineAttr = getInlineKindAttr ()) {
2087- p << " inline(" << cir::stringifyInlineKind (inlineAttr.getValue ()) << " )" ;
2088- }
2089-
20902102 function_interface_impl::printFunctionAttributes (
20912103 p, *this , cir::FuncOp::getAttributeNames ());
20922104
0 commit comments