https://github.com/skc7 updated https://github.com/llvm/llvm-project/pull/182228
>From c0d391404b6ad3cd0c1dbb544f9aa1ebc6b81836 Mon Sep 17 00:00:00 2001 From: skc7 <[email protected]> Date: Thu, 19 Feb 2026 11:57:59 +0530 Subject: [PATCH 1/2] [CIR] Enable AppendingLinkage in GlobalLinkage enum --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 3 +-- clang/include/clang/CIR/Dialect/IR/CIROpsEnums.h | 4 ++++ clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 2 ++ clang/test/CIR/IR/invalid-linkage.cir | 8 ++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 clang/test/CIR/IR/invalid-linkage.cir 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/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@+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>> +} >From 44e5cc398266e20e20c573ee29cfbe55e8389556 Mon Sep 17 00:00:00 2001 From: skc7 <[email protected]> Date: Fri, 20 Feb 2026 11:06:07 +0530 Subject: [PATCH 2/2] Add test for appending linkage --- clang/test/CIR/IR/global-var-linkage.cir | 2 ++ .../test/CIR/Lowering/global-var-linkage.cir | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 clang/test/CIR/Lowering/global-var-linkage.cir 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/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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
