[clang] [CIR] Add functionality for inline functions (PR #167135)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Nov 8 04:50:05 PST 2025
https://github.com/rashmika0220 created https://github.com/llvm/llvm-project/pull/167135
None
>From 70f3a47062a01f3e05a7526243cc05f0562a8fb0 Mon Sep 17 00:00:00 2001
From: rashmika-shiny <shinywork006 at gmail.com>
Date: Sat, 8 Nov 2025 18:18:47 +0530
Subject: [PATCH] Add functionality for inline functions
---
clang/include/clang/CIR/Dialect/IR/CIROps.td | 3 ++-
clang/lib/CIR/CodeGen/CIRGenModule.cpp | 17 +++++++++++++++++
.../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 10 +++++-----
3 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 6f9a69e697cc3..707b5ff88a356 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -2521,7 +2521,8 @@ def CIR_FuncOp : CIR_Op<"func", [
OptionalAttr<DictArrayAttr>:$res_attrs,
OptionalAttr<FlatSymbolRefAttr>:$aliasee,
CIR_OptionalPriorityAttr:$global_ctor_priority,
- CIR_OptionalPriorityAttr:$global_dtor_priority);
+ CIR_OptionalPriorityAttr:$global_dtor_priority,
+ OptionalAttr<CIR_InlineAttr>:$inlining);
let regions = (region AnyRegion:$body);
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index 9f9b2db4771df..c4c260e9e5fe8 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -1928,6 +1928,23 @@ void CIRGenModule::setFunctionAttributes(GlobalDecl globalDecl,
"available body!");
assert(!cir::MissingFeatures::attributeNoBuiltin());
}
+
+ // Handle inline-related attributes (noinline, always_inline, inline hint)
+ // Check for explicit noinline attribute - this takes highest precedence
+ if (fd->hasAttr<NoInlineAttr>()) {
+ func.setInliningAttr(cir::InlineAttr::get(
+ builder.getContext(), cir::InlineKind::NoInline));
+ }
+ // Check for explicit always_inline attribute
+ else if (fd->hasAttr<AlwaysInlineAttr>()) {
+ func.setInliningAttr(cir::InlineAttr::get(
+ builder.getContext(), cir::InlineKind::AlwaysInline));
+ }
+ // Check for inline keyword (provides inline hint)
+ else if (fd->isInlined()) {
+ func.setInliningAttr(cir::InlineAttr::get(
+ builder.getContext(), cir::InlineKind::InlineHint));
+ }
}
void CIRGenModule::setCIRFunctionAttributesForDefinition(
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index ba967a43ce59a..84af42258e1ed 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -1800,7 +1800,7 @@ void CIRToLLVMFuncOpLowering::lowerFuncAttributes(
attr.getName() == getLinkageAttrNameString() ||
attr.getName() == func.getGlobalVisibilityAttrName() ||
attr.getName() == func.getDsoLocalAttrName() ||
- attr.getName() == func.getInlineKindAttrName() ||
+ attr.getName() == func.getInliningAttrName() ||
(filterArgAndResAttrs &&
(attr.getName() == func.getArgAttrsAttrName() ||
attr.getName() == func.getResAttrsAttrName())))
@@ -1885,10 +1885,10 @@ mlir::LogicalResult CIRToLLVMFuncOpLowering::matchAndRewrite(
assert(!cir::MissingFeatures::opFuncMultipleReturnVals());
- if (auto inlineKind = op.getInlineKind()) {
- fn.setNoInline(inlineKind == cir::InlineKind::NoInline);
- fn.setInlineHint(inlineKind == cir::InlineKind::InlineHint);
- fn.setAlwaysInline(inlineKind == cir::InlineKind::AlwaysInline);
+ if (auto inlining = op.getInlining()) {
+ fn.setNoInline(*inlining == cir::InlineKind::NoInline);
+ fn.setInlineHint(*inlining == cir::InlineKind::InlineHint);
+ fn.setAlwaysInline(*inlining == cir::InlineKind::AlwaysInline);
}
fn.setVisibility_Attr(mlir::LLVM::VisibilityAttr::get(
More information about the cfe-commits
mailing list