[clang] [CIR] Convert global_visibility from attribute to property (PR #190488)
Henrich Lauko via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 4 14:02:14 PDT 2026
https://github.com/xlauko created https://github.com/llvm/llvm-project/pull/190488
Replace CIR_VisibilityAttr with DefaultValuedProp<EnumProp<CIR_VisibilityKind>>
for global_visibility on GlobalOp and FuncOp. This removes the need for custom
parse/print functions and simplifies callers to use direct enum values instead
of wrapping/unwrapping VisibilityAttr.
>From 2c6dfac41e30ad8de93ebc80e274825ddcd51821 Mon Sep 17 00:00:00 2001
From: xlauko <xlauko at mail.muni.cz>
Date: Sat, 4 Apr 2026 22:48:18 +0200
Subject: [PATCH] [CIR] Convert global_visibility from attribute to property
Replace CIR_VisibilityAttr with DefaultValuedProp<EnumProp<CIR_VisibilityKind>>
for global_visibility on GlobalOp and FuncOp. This removes the need for custom
parse/print functions and simplifies callers to use direct enum values instead
of wrapping/unwrapping VisibilityAttr.
---
clang/include/clang/CIR/Dialect/IR/CIROps.td | 13 +++---
clang/lib/CIR/CodeGen/CIRGenModule.cpp | 4 +-
clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 45 ++-----------------
.../CIR/Dialect/Transforms/EHABILowering.cpp | 3 +-
.../Dialect/Transforms/LoweringPrepare.cpp | 3 +-
.../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 5 +--
6 files changed, 18 insertions(+), 55 deletions(-)
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 55d919ae84a20..f72d891ecd941 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -2827,9 +2827,9 @@ def CIR_GlobalOp : CIR_Op<"global", [
// TODO: sym_visibility can possibly be represented by implementing the
// necessary Symbol's interface in terms of linkage instead.
let arguments = (ins SymbolNameAttr:$sym_name,
- DefaultValuedAttr<
- CIR_VisibilityAttr,
- "VisibilityKind::Default"
+ DefaultValuedProp<
+ EnumProp<CIR_VisibilityKind>,
+ "cir::VisibilityKind::Default"
>:$global_visibility,
OptionalAttr<StrAttr>:$sym_visibility,
TypeAttr:$sym_type,
@@ -2851,7 +2851,7 @@ def CIR_GlobalOp : CIR_Op<"global", [
let assemblyFormat = [{
($sym_visibility^)?
- (custom<VisibilityAttr>($global_visibility)^)?
+ ($global_visibility^)?
(`constant` $constant^)?
$linkage
(`comdat` $comdat^)?
@@ -3667,7 +3667,10 @@ def CIR_FuncOp : CIR_Op<"func", [
let arguments = (ins
SymbolNameAttr:$sym_name,
- CIR_VisibilityAttr:$global_visibility,
+ DefaultValuedProp<
+ EnumProp<CIR_VisibilityKind>,
+ "cir::VisibilityKind::Default"
+ >:$global_visibility,
TypeAttrOf<CIR_FuncType>:$function_type,
UnitAttr:$builtin,
UnitAttr:$coroutine,
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index 2f4990cdc9add..fe0900c42a9cb 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -1016,7 +1016,7 @@ CIRGenModule::getOrCreateCIRGlobal(StringRef mangledName, mlir::Type ty,
if (const SectionAttr *sa = d->getAttr<SectionAttr>())
gv.setSectionAttr(builder.getStringAttr(sa->getName()));
}
- gv.setGlobalVisibilityAttr(getGlobalVisibilityAttrFromDecl(d));
+ gv.setGlobalVisibility(getGlobalVisibilityAttrFromDecl(d).getValue());
// Handle XCore specific ABI requirements.
if (getTriple().getArch() == llvm::Triple::xcore)
@@ -2612,7 +2612,7 @@ void CIRGenModule::setFunctionAttributes(GlobalDecl globalDecl,
// recompute it here. This is a minimal fix for now.
if (!isLocalLinkage(getFunctionLinkage(globalDecl))) {
const Decl *decl = globalDecl.getDecl();
- func.setGlobalVisibilityAttr(getGlobalVisibilityAttrFromDecl(decl));
+ func.setGlobalVisibility(getGlobalVisibilityAttrFromDecl(decl).getValue());
}
// If we plan on emitting this inline builtin, we can't treat it as a builtin.
diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index dbe064f03d119..8ccc83a25537b 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -207,33 +207,6 @@ static bool omitRegionTerm(mlir::Region &r) {
return singleNonEmptyBlock && yieldsNothing();
}
-void printVisibilityAttr(OpAsmPrinter &printer,
- cir::VisibilityAttr &visibility) {
- switch (visibility.getValue()) {
- case cir::VisibilityKind::Hidden:
- printer << "hidden";
- break;
- case cir::VisibilityKind::Protected:
- printer << "protected";
- break;
- case cir::VisibilityKind::Default:
- break;
- }
-}
-
-void printVisibilityAttr(OpAsmPrinter &printer, cir::GlobalOp,
- cir::VisibilityAttr visibility) {
- printVisibilityAttr(printer, visibility);
-}
-
-mlir::OptionalParseResult parseVisibilityAttr(OpAsmParser &parser,
- cir::VisibilityAttr &visibility) {
- cir::VisibilityKind visibilityKind =
- parseOptionalCIRKeyword(parser, cir::VisibilityKind::Default);
- visibility = cir::VisibilityAttr::get(parser.getContext(), visibilityKind);
- return mlir::success();
-}
-
//===----------------------------------------------------------------------===//
// InlineKindAttr (FIXME: remove once FuncOp uses assembly format)
//===----------------------------------------------------------------------===//
@@ -1795,9 +1768,6 @@ void cir::GlobalOp::build(
odsBuilder.createBlock(dtorRegion);
dtorBuilder(odsBuilder, odsState.location);
}
-
- odsState.addAttribute(getGlobalVisibilityAttrName(odsState.name),
- cir::VisibilityAttr::get(odsBuilder.getContext()));
}
/// Given the region at `index`, or the parent operation if `index` is None,
@@ -2061,8 +2031,6 @@ void cir::FuncOp::build(OpBuilder &builder, OperationState &result,
result.addAttribute(
getLinkageAttrNameString(),
GlobalLinkageKindAttr::get(builder.getContext(), linkage));
- result.addAttribute(getGlobalVisibilityAttrName(result.name),
- cir::VisibilityAttr::get(builder.getContext()));
}
ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
@@ -2076,7 +2044,6 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
mlir::StringAttr noProtoNameAttr = getNoProtoAttrName(state.name);
mlir::StringAttr comdatNameAttr = getComdatAttrName(state.name);
mlir::StringAttr visNameAttr = getSymVisibilityAttrName(state.name);
- mlir::StringAttr visibilityNameAttr = getGlobalVisibilityAttrName(state.name);
mlir::StringAttr dsoLocalNameAttr = getDsoLocalAttrName(state.name);
mlir::StringAttr specialMemberAttr = getCxxSpecialMemberAttrName(state.name);
@@ -2115,9 +2082,8 @@ ParseResult cir::FuncOp::parse(OpAsmParser &parser, OperationState &state) {
parser.getBuilder().getStringAttr(visAttrStr));
}
- cir::VisibilityAttr cirVisibilityAttr;
- parseVisibilityAttr(parser, cirVisibilityAttr);
- state.addAttribute(visibilityNameAttr, cirVisibilityAttr);
+ state.getOrAddProperties<cir::FuncOp::Properties>().global_visibility =
+ parseOptionalCIRKeyword(parser, cir::VisibilityKind::Default);
if (parser.parseOptionalKeyword(dsoLocalNameAttr).succeeded())
state.addAttribute(dsoLocalNameAttr, parser.getBuilder().getUnitAttr());
@@ -2392,11 +2358,8 @@ void cir::FuncOp::print(OpAsmPrinter &p) {
if (vis != mlir::SymbolTable::Visibility::Public)
p << ' ' << vis;
- cir::VisibilityAttr cirVisibilityAttr = getGlobalVisibilityAttr();
- if (!cirVisibilityAttr.isDefault()) {
- p << ' ';
- printVisibilityAttr(p, cirVisibilityAttr);
- }
+ if (getGlobalVisibility() != cir::VisibilityKind::Default)
+ p << ' ' << stringifyVisibilityKind(getGlobalVisibility());
if (getDsoLocal())
p << " dso_local";
diff --git a/clang/lib/CIR/Dialect/Transforms/EHABILowering.cpp b/clang/lib/CIR/Dialect/Transforms/EHABILowering.cpp
index 14f7aca2bc136..abdc32951f857 100644
--- a/clang/lib/CIR/Dialect/Transforms/EHABILowering.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/EHABILowering.cpp
@@ -200,8 +200,7 @@ void ItaniumEHLowering::ensureClangCallTerminate(mlir::Location loc) {
auto funcOp =
cir::FuncOp::create(builder, loc, "__clang_call_terminate", funcTy);
funcOp.setLinkage(cir::GlobalLinkageKind::LinkOnceODRLinkage);
- funcOp.setGlobalVisibilityAttr(
- cir::VisibilityAttr::get(ctx, cir::VisibilityKind::Hidden));
+ funcOp.setGlobalVisibility(cir::VisibilityKind::Hidden);
mlir::Block *entryBlock = funcOp.addEntryBlock();
builder.setInsertionPointToStart(entryBlock);
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index a67ce9850a838..4d0c7b179f260 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -320,8 +320,7 @@ cir::GlobalOp LoweringPreparePass::buildRuntimeVariable(
cir::GlobalLinkageKindAttr::get(builder.getContext(), linkage));
mlir::SymbolTable::setSymbolVisibility(
g, mlir::SymbolTable::Visibility::Private);
- g.setGlobalVisibilityAttr(
- cir::VisibilityAttr::get(builder.getContext(), visibility));
+ g.setGlobalVisibility(visibility);
}
return g;
}
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 40ee341afdc12..119269447ec37 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -2151,7 +2151,6 @@ void CIRToLLVMFuncOpLowering::lowerFuncAttributes(
if (attr.getName() == mlir::SymbolTable::getSymbolAttrName() ||
attr.getName() == func.getFunctionTypeAttrName() ||
attr.getName() == getLinkageAttrNameString() ||
- attr.getName() == func.getGlobalVisibilityAttrName() ||
attr.getName() == func.getDsoLocalAttrName() ||
attr.getName() == func.getInlineKindAttrName() ||
attr.getName() == func.getSideEffectAttrName() ||
@@ -2329,8 +2328,8 @@ CIRToLLVMGlobalOpLowering::lowerGlobalAttributes(
attributes.push_back(rewriter.getNamedAttr("section", sectionAttr));
mlir::LLVM::VisibilityAttr visibility = mlir::LLVM::VisibilityAttr::get(
- getContext(), lowerCIRVisibilityToLLVMVisibility(
- op.getGlobalVisibilityAttr().getValue()));
+ getContext(),
+ lowerCIRVisibilityToLLVMVisibility(op.getGlobalVisibility()));
attributes.push_back(rewriter.getNamedAttr("visibility_", visibility));
if (op->getAttr(CUDAExternallyInitializedAttr::getMnemonic()))
More information about the cfe-commits
mailing list