[clang] be72670 - [CIR] Enable AppendingLinkage in GlobalLinkage enum (#182228)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 20 10:47:42 PST 2026
Author: Chaitanya
Date: 2026-02-20T10:47:38-08:00
New Revision: be7267002357a3955d225da84d7fcf6c7e3540b3
URL: https://github.com/llvm/llvm-project/commit/be7267002357a3955d225da84d7fcf6c7e3540b3
DIFF: https://github.com/llvm/llvm-project/commit/be7267002357a3955d225da84d7fcf6c7e3540b3.diff
LOG: [CIR] Enable AppendingLinkage in GlobalLinkage enum (#182228)
Upstreaming clangIR PR: https://github.com/llvm/clangir/pull/2098
This PR enables AppendingLinkage in CIR_GlobalLinkageKind.
Added:
clang/test/CIR/IR/invalid-linkage.cir
clang/test/CIR/Lowering/global-var-linkage.cir
Modified:
clang/include/clang/CIR/Dialect/IR/CIROps.td
clang/include/clang/CIR/Dialect/IR/CIROpsEnums.h
clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
clang/test/CIR/IR/global-var-linkage.cir
Removed:
################################################################################
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index ebc4d78563d9f..99d0d7e457b50 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -2345,9 +2345,8 @@ def CIR_GlobalLinkageKind : CIR_I32EnumAttr<
I32EnumAttrCase<"WeakAnyLinkage", 4, "weak">,
// Same, but only replaced by something equivalent.
I32EnumAttrCase<"WeakODRLinkage", 5, "weak_odr">,
- // TODO: should we add something like appending linkage too?
// Special purpose, only applies to global arrays
- // I32EnumAttrCase<"AppendingLinkage", 6, "appending">,
+ I32EnumAttrCase<"AppendingLinkage", 6, "appending">,
// Rename collisions when linking (static functions).
I32EnumAttrCase<"InternalLinkage", 7, "internal">,
// Like Internal, but omit from symbol table, prefix it with
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROpsEnums.h b/clang/include/clang/CIR/Dialect/IR/CIROpsEnums.h
index dbd030446a6fc..6429ac8d5e93b 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROpsEnums.h
+++ b/clang/include/clang/CIR/Dialect/IR/CIROpsEnums.h
@@ -57,6 +57,9 @@ static bool isExternalWeakLinkage(GlobalLinkageKind linkage) {
[[maybe_unused]] static bool isCommonLinkage(GlobalLinkageKind linkage) {
return linkage == GlobalLinkageKind::CommonLinkage;
}
+[[maybe_unused]] static bool isAppendingLinkage(GlobalLinkageKind linkage) {
+ return linkage == GlobalLinkageKind::AppendingLinkage;
+}
[[maybe_unused]] static bool
isValidDeclarationLinkage(GlobalLinkageKind linkage) {
return isExternalWeakLinkage(linkage) || isExternalLinkage(linkage);
@@ -79,6 +82,7 @@ isValidDeclarationLinkage(GlobalLinkageKind linkage) {
// The above three cannot be overridden but can be de-refined.
case GlobalLinkageKind::ExternalLinkage:
+ case GlobalLinkageKind::AppendingLinkage:
case GlobalLinkageKind::InternalLinkage:
case GlobalLinkageKind::PrivateLinkage:
return false;
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 85f2e7952b557..3318638b8a03d 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -152,6 +152,8 @@ mlir::LLVM::Linkage convertLinkage(cir::GlobalLinkageKind linkage) {
using LLVM = mlir::LLVM::Linkage;
switch (linkage) {
+ case CIR::AppendingLinkage:
+ return LLVM::Appending;
case CIR::AvailableExternallyLinkage:
return LLVM::AvailableExternally;
case CIR::CommonLinkage:
diff --git a/clang/test/CIR/IR/global-var-linkage.cir b/clang/test/CIR/IR/global-var-linkage.cir
index df74e3825e967..4376b96fbc67f 100644
--- a/clang/test/CIR/IR/global-var-linkage.cir
+++ b/clang/test/CIR/IR/global-var-linkage.cir
@@ -8,6 +8,7 @@ module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
cir.global linkonce_odr @cccc = #cir.int<0> : !s32i
cir.global internal @ffff = #cir.int<0> : !s32i
cir.global weak_odr @dddd = #cir.int<0> : !s32i
+ cir.global appending @eeee = #cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i]> : !cir.array<!s32i x 2>
}
// CHECK: module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
@@ -16,4 +17,5 @@ module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
// CHECK: cir.global linkonce_odr @cccc = #cir.int<0> : !s32i
// CHECK: cir.global internal @ffff = #cir.int<0> : !s32i
// CHECK: cir.global weak_odr @dddd = #cir.int<0> : !s32i
+// CHECK: cir.global appending @eeee = #cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i]> : !cir.array<!s32i x 2>
// CHECK: }
diff --git a/clang/test/CIR/IR/invalid-linkage.cir b/clang/test/CIR/IR/invalid-linkage.cir
new file mode 100644
index 0000000000000..23771b14fcac9
--- /dev/null
+++ b/clang/test/CIR/IR/invalid-linkage.cir
@@ -0,0 +1,8 @@
+// Test that cir.global requires a valid linkage attribute
+// RUN: cir-opt %s -verify-diagnostics
+
+!u32i = !cir.int<u, 32>
+module {
+ // expected-error at +1 {{expected string or keyword containing one of the following enum values for attribute 'linkage' [external, available_externally, linkonce, linkonce_odr, weak, weak_odr, appending, internal, cir_private, extern_weak, common]}}
+ cir.global @a = #cir.const_array<[0 : !u8i, -23 : !u8i, 33 : !u8i] : !cir.array<!u32i x 3>>
+}
diff --git a/clang/test/CIR/Lowering/global-var-linkage.cir b/clang/test/CIR/Lowering/global-var-linkage.cir
new file mode 100644
index 0000000000000..370784e23920a
--- /dev/null
+++ b/clang/test/CIR/Lowering/global-var-linkage.cir
@@ -0,0 +1,20 @@
+// RUN: cir-opt %s -cir-to-llvm -o %t.mlir
+// RUN: FileCheck --input-file=%t.mlir %s
+
+// Test that various linkage types are correctly lowered from CIR to LLVM dialect.
+
+!s32i = !cir.int<s, 32>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+ cir.global external @aaaa = #cir.int<0> : !s32i
+ cir.global internal @bbbb = #cir.int<0> : !s32i
+ cir.global linkonce_odr @cccc = #cir.int<0> : !s32i
+ cir.global weak_odr @dddd = #cir.int<0> : !s32i
+ cir.global appending @eeee = #cir.const_array<[#cir.int<1> : !s32i, #cir.int<2> : !s32i]> : !cir.array<!s32i x 2>
+}
+
+// CHECK: llvm.mlir.global external @aaaa
+// CHECK: llvm.mlir.global internal @bbbb
+// CHECK: llvm.mlir.global linkonce_odr @cccc
+// CHECK: llvm.mlir.global weak_odr @dddd
+// CHECK: llvm.mlir.global appending @eeee
More information about the cfe-commits
mailing list