Author: Henrich Lauko Date: 2026-09-05T11:59:50+02:00 New Revision: ca7909df49541193c7e680554865082071252d35
URL: https://github.com/llvm/llvm-project/commit/ca7909df49541193c7e680554865082071252d35 DIFF: https://github.com/llvm/llvm-project/commit/ca7909df49541193c7e680554865082071252d35.diff LOG: [CIR] Migrate GlobalLinkageKind, CallingConv and SideEffect off IntegerAttr (#220887) GlobalLinkageKind, CallingConv and SideEffect generated IntegerAttr subclasses with no dialect spelling of their own. Each now sets genSpecializedAttr = 0 and gains a CIR_EnumAttr wrapper, and cir.global wraps $linkage in `enum()`. GlobalLinkageKind spells `#cir.linkage<internal>`, dropping both the `global_` prefix and the `_kind` suffix. cir.func and cir.call print all three by hand, but they stream stringifyGlobalLinkageKind(getLinkage()) and friends, which take the enum rather than the attribute, so those sites are unchanged. Operation syntax is unchanged. Added: Modified: clang/include/clang/CIR/Dialect/IR/CIRAttrs.td clang/include/clang/CIR/Dialect/IR/CIROps.td clang/test/CIR/IR/enum-attrs.cir Removed: ################################################################################ diff --git a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td index fc10268fba693..f08a127dcd192 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td @@ -1964,8 +1964,12 @@ def CIR_SideEffect : CIR_I32EnumAttr< %2 = cir.call @add(%0, %1) : (!s32i, !s32i) -> !s32i side_effect(const) ``` }]; + + let genSpecializedAttr = 0; } +def CIR_SideEffectAttr : CIR_EnumAttr<CIR_SideEffect, "side_effect">; + //===----------------------------------------------------------------------===// // StaticLocalGuardAttr //===----------------------------------------------------------------------===// diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 33ecf34b8f960..c9e5ecc69fa58 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -3345,7 +3345,12 @@ def CIR_GlobalLinkageKind : CIR_I32EnumAttr< I32EnumAttrCase<"ExternalWeakLinkage", 9, "extern_weak">, // Tentative definitions. I32EnumAttrCase<"CommonLinkage", 10, "common"> -]>; +]> { + let genSpecializedAttr = 0; +} + +def CIR_GlobalLinkageKindAttr + : CIR_EnumAttr<CIR_GlobalLinkageKind, "linkage">; // TODO(CIR): For starters, cir.global has only name and type. The other // properties of a global variable will be added over time as more of ClangIR @@ -3411,7 +3416,7 @@ def CIR_GlobalOp : CIR_RegionBranchOpBase<"global", [ >:$global_visibility, OptionalAttr<StrAttr>:$sym_visibility, TypeAttr:$sym_type, - CIR_GlobalLinkageKind:$linkage, + CIR_GlobalLinkageKindAttr:$linkage, OptionalAttr<MemorySpaceAttrInterface>:$addr_space, OptionalAttr<CIR_TLSModelAttr>:$tls_model, OptionalAttr<CIR_ThreadLocalGlobalWrapperInitAttr>:$tls_refs, @@ -3437,7 +3442,7 @@ def CIR_GlobalOp : CIR_RegionBranchOpBase<"global", [ ($sym_visibility^)? ($global_visibility^)? (`constant` $constant^)? - $linkage + enum($linkage) (`comdat` $comdat^)? (`tls_model` `=` enum($tls_model)^)? (`tls_refs` `=` $tls_refs^)? @@ -4202,7 +4207,11 @@ def CIR_CallingConv : CIR_I32EnumAttr<"CallingConv", "calling convention", [ I32EnumAttrCase<"SpirFunction", 2, "spir_function">, I32EnumAttrCase<"SpirKernel", 3, "spir_kernel">, I32EnumAttrCase<"AMDGPUKernel", 4, "amdgpu_kernel"> -]>; +]> { + let genSpecializedAttr = 0; +} + +def CIR_CallingConvAttr : CIR_EnumAttr<CIR_CallingConv, "calling_conv">; def CIR_FuncOp : CIR_Op<"func", [ AutomaticAllocationScope, CallableOpInterface, SymbolName, SymbolVisibility, @@ -4296,11 +4305,11 @@ def CIR_FuncOp : CIR_Op<"func", [ UnitAttr:$no_proto, UnitAttr:$dso_local, DefaultValuedAttr< - CIR_GlobalLinkageKind, + CIR_GlobalLinkageKindAttr, "cir::GlobalLinkageKind::ExternalLinkage" >:$linkage, DefaultValuedAttr< - CIR_CallingConv, + CIR_CallingConvAttr, "cir::CallingConv::C" >:$calling_conv, OptionalAttr<StrAttr>:$sym_visibility, @@ -4308,7 +4317,7 @@ def CIR_FuncOp : CIR_Op<"func", [ OptionalAttr<DictArrayAttr>:$arg_attrs, OptionalAttr<DictArrayAttr>:$res_attrs, OptionalAttr<FlatSymbolRefAttr>:$aliasee, - OptionalAttr<CIR_SideEffect>:$side_effect, + OptionalAttr<CIR_SideEffectAttr>:$side_effect, OptionalAttr<FlatSymbolRefAttr>:$personality, CIR_OptionalPriorityAttr:$global_ctor_priority, CIR_OptionalPriorityAttr:$global_dtor_priority, @@ -4612,7 +4621,7 @@ class CIR_CallOpBase<string mnemonic, list<Trait> extra_traits = []> UnitAttr:$nothrow, OptionalAttr<CIR_InlineKindAttr>:$inline_kind, UnitAttr:$musttail, - DefaultValuedAttr<CIR_SideEffect, "SideEffect::All">:$side_effect, + DefaultValuedAttr<CIR_SideEffectAttr, "SideEffect::All">:$side_effect, OptionalAttr<DictArrayAttr>:$arg_attrs, OptionalAttr<DictArrayAttr>:$res_attrs ); diff --git a/clang/test/CIR/IR/enum-attrs.cir b/clang/test/CIR/IR/enum-attrs.cir index 53983a5c2cf2c..2e675c2681b94 100644 --- a/clang/test/CIR/IR/enum-attrs.cir +++ b/clang/test/CIR/IR/enum-attrs.cir @@ -105,6 +105,28 @@ cir.func @asm_flavor_attr() { #cir.asm_flavor<x86_intel>]} } +// CHECK-LABEL: cir.func @linkage_attr() { +cir.func @linkage_attr() { + // CHECK: cir.return {cir.test = [#cir.linkage<external>, #cir.linkage<linkonce_odr>, #cir.linkage<cir_private>]} + cir.return {cir.test = [#cir.linkage<external>, + #cir.linkage<linkonce_odr>, + #cir.linkage<cir_private>]} +} + +// CHECK-LABEL: cir.func @calling_conv_attr() { +cir.func @calling_conv_attr() { + // CHECK: cir.return {cir.test = [#cir.calling_conv<c>, #cir.calling_conv<ptx_kernel>, #cir.calling_conv<amdgpu_kernel>]} + cir.return {cir.test = [#cir.calling_conv<c>, #cir.calling_conv<ptx_kernel>, + #cir.calling_conv<amdgpu_kernel>]} +} + +// CHECK-LABEL: cir.func @side_effect_attr() { +cir.func @side_effect_attr() { + // CHECK: cir.return {cir.test = [#cir.side_effect<all>, #cir.side_effect<pure>, #cir.side_effect<const>]} + cir.return {cir.test = [#cir.side_effect<all>, #cir.side_effect<pure>, + #cir.side_effect<const>]} +} + // The operations themselves keep printing a bare keyword. // CHECK-LABEL: cir.func @mem_order_sync_scope_ops(%arg0: !cir.ptr<!s32i>) { @@ -116,4 +138,10 @@ cir.func @mem_order_sync_scope_ops(%arg0: !cir.ptr<!s32i>) { cir.return } +// cir.global's linkage is the one bare keyword that cannot be checked from +// inside a function. + +// CHECK-LABEL: cir.global "private" internal @g = #cir.int<0> : !s32i +cir.global "private" internal @g = #cir.int<0> : !s32i + } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
