@@ -449,7 +449,7 @@ void CIRGenModule::emitGlobalFunctionDefinition(clang::GlobalDecl gd,
449449 curCGF = nullptr ;
450450
451451 setNonAliasAttributes (gd, funcOp);
452- assert (! cir::MissingFeatures::opFuncAttributesForDefinition () );
452+ setCIRFunctionAttributesForDefinition (funcDecl, funcOp );
453453
454454 if (funcDecl->getAttr <ConstructorAttr>())
455455 errorNYI (funcDecl->getSourceRange (), " constructor attribute" );
@@ -1885,6 +1885,87 @@ void CIRGenModule::setFunctionAttributes(GlobalDecl globalDecl,
18851885 }
18861886}
18871887
1888+ void CIRGenModule::setCIRFunctionAttributesForDefinition (
1889+ const clang::FunctionDecl *decl, cir::FuncOp f) {
1890+ assert (!cir::MissingFeatures::opFuncUnwindTablesAttr ());
1891+ assert (!cir::MissingFeatures::stackProtector ());
1892+
1893+ auto existingInlineKind = f.getInlineKind ();
1894+ bool isNoInline =
1895+ existingInlineKind && *existingInlineKind == cir::InlineKind::NoInline;
1896+ bool isAlwaysInline = existingInlineKind &&
1897+ *existingInlineKind == cir::InlineKind::AlwaysInline;
1898+
1899+ if (!decl) {
1900+ assert (!cir::MissingFeatures::hlsl ());
1901+
1902+ if (!isAlwaysInline &&
1903+ codeGenOpts.getInlining () == CodeGenOptions::OnlyAlwaysInlining) {
1904+ // If we don't have a declaration to control inlining, the function isn't
1905+ // explicitly marked as alwaysinline for semantic reasons, and inlining is
1906+ // disabled, mark the function as noinline.
1907+ f.setInlineKindAttr (
1908+ cir::InlineAttr::get (&getMLIRContext (), cir::InlineKind::NoInline));
1909+ }
1910+
1911+ return ;
1912+ }
1913+
1914+ assert (!cir::MissingFeatures::opFuncArmStreamingAttr ());
1915+ assert (!cir::MissingFeatures::opFuncArmNewAttr ());
1916+ assert (!cir::MissingFeatures::opFuncOptNoneAttr ());
1917+ assert (!cir::MissingFeatures::opFuncMinSizeAttr ());
1918+ assert (!cir::MissingFeatures::opFuncNakedAttr ());
1919+ assert (!cir::MissingFeatures::opFuncNoDuplicateAttr ());
1920+ assert (!cir::MissingFeatures::hlsl ());
1921+
1922+ // Handle inline attributes
1923+ if (decl->hasAttr <NoInlineAttr>() && !isAlwaysInline) {
1924+ // Add noinline if the function isn't always_inline.
1925+ f.setInlineKindAttr (
1926+ cir::InlineAttr::get (&getMLIRContext (), cir::InlineKind::NoInline));
1927+ } else if (decl->hasAttr <AlwaysInlineAttr>() && !isNoInline) {
1928+ // (noinline wins over always_inline, and we can't specify both in IR)
1929+ f.setInlineKindAttr (
1930+ cir::InlineAttr::get (&getMLIRContext (), cir::InlineKind::AlwaysInline));
1931+ } else if (codeGenOpts.getInlining () == CodeGenOptions::OnlyAlwaysInlining) {
1932+ // If we're not inlining, then force everything that isn't always_inline
1933+ // to carry an explicit noinline attribute.
1934+ if (!isAlwaysInline) {
1935+ f.setInlineKindAttr (
1936+ cir::InlineAttr::get (&getMLIRContext (), cir::InlineKind::NoInline));
1937+ }
1938+ } else {
1939+ // Otherwise, propagate the inline hint attribute and potentially use its
1940+ // absence to mark things as noinline.
1941+ // Search function and template pattern redeclarations for inline.
1942+ if (auto *fd = dyn_cast<FunctionDecl>(decl)) {
1943+ auto checkForInline = [](const FunctionDecl *decl) {
1944+ auto checkRedeclForInline = [](const FunctionDecl *redecl) {
1945+ return redecl->isInlineSpecified ();
1946+ };
1947+ if (any_of (decl->redecls (), checkRedeclForInline))
1948+ return true ;
1949+ const FunctionDecl *pattern = decl->getTemplateInstantiationPattern ();
1950+ if (!pattern)
1951+ return false ;
1952+ return any_of (pattern->redecls (), checkRedeclForInline);
1953+ };
1954+ if (checkForInline (fd)) {
1955+ f.setInlineKindAttr (cir::InlineAttr::get (&getMLIRContext (),
1956+ cir::InlineKind::InlineHint));
1957+ } else if (codeGenOpts.getInlining () ==
1958+ CodeGenOptions::OnlyHintInlining &&
1959+ !fd->isInlined () && !isAlwaysInline) {
1960+ f.setInlineKindAttr (
1961+ cir::InlineAttr::get (&getMLIRContext (), cir::InlineKind::NoInline));
1962+ }
1963+ }
1964+ }
1965+
1966+ assert (!cir::MissingFeatures::opFuncColdHotAttr ());
1967+ }
1968+
18881969cir::FuncOp CIRGenModule::getOrCreateCIRFunction (
18891970 StringRef mangledName, mlir::Type funcType, GlobalDecl gd, bool forVTable,
18901971 bool dontDefer, bool isThunk, ForDefinition_t isForDefinition,
0 commit comments