https://github.com/NotLebedev updated https://github.com/llvm/llvm-project/pull/189673
>From ed569737b5815056f6bbc976d308bb868aee5937 Mon Sep 17 00:00:00 2001 From: NotLebedev <[email protected]> Date: Tue, 31 Mar 2026 16:40:44 +0300 Subject: [PATCH 1/2] [CIR] Fix incorrect CIR_GlobalOp.global_visibility assembly format Use custom parser for CIR_VisibilityAttr in cir.global like cir.func does to avoid issues with attribute being incorrectly printed and not parsed --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 2 +- clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 8 +++- clang/test/CIR/CodeGen/attribute-visibility.c | 45 +++++++++++++++++++ clang/test/CIR/IR/attribute-visibility.cir | 28 ++++++++++++ 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 clang/test/CIR/CodeGen/attribute-visibility.c create mode 100644 clang/test/CIR/IR/attribute-visibility.cir diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index b15dc30ffb87d..89652cb392bfb 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -2849,7 +2849,7 @@ def CIR_GlobalOp : CIR_Op<"global", [ let assemblyFormat = [{ ($sym_visibility^)? - (`` $global_visibility^)? + (custom<VisibilityAttr>($global_visibility)^)? (`constant` $constant^)? $linkage (`comdat` $comdat^)? diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index eb322d135a804..1187fd5ddea5d 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -221,10 +221,16 @@ void printVisibilityAttr(OpAsmPrinter &printer, } } -void parseVisibilityAttr(OpAsmParser &parser, cir::VisibilityAttr &visibility) { +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(); } //===----------------------------------------------------------------------===// diff --git a/clang/test/CIR/CodeGen/attribute-visibility.c b/clang/test/CIR/CodeGen/attribute-visibility.c new file mode 100644 index 0000000000000..45098770d84ea --- /dev/null +++ b/clang/test/CIR/CodeGen/attribute-visibility.c @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll +// RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s + +int normal_var = 10; +// CIR: cir.global external @normal_var {{.*}} +// LLVM: @normal_var = global {{.*}} +// OGCG: @normal_var = global {{.*}} + +__attribute__((visibility("hidden"))) +int hidden_var = 10; +// CIR: cir.global hidden external @hidden_var {{.*}} +// LLVM: @hidden_var = hidden global {{.*}} +// OGCG: @hidden_var = hidden global {{.*}} + +static int normal_static_var = 10; +// CIR: cir.global "private" internal dso_local @normal_static_var {{.*}} +// LLVM: @normal_static_var = internal global {{.*}} +// OGCG: @normal_static_var = internal global {{.*}} + +__attribute__((visibility("hidden"))) +static int hidden_static_var = 10; +// CIR: cir.global "private" hidden internal dso_local @hidden_static_var {{.*}} +// LLVM: @hidden_static_var = internal hidden global {{.*}} +// OGCG: @hidden_static_var = internal global {{.*}} + +void normal_func() { + normal_var = 0; + normal_static_var = 0; +} +// CIR: cir.func no_inline no_proto dso_local @normal_func() {{.*}} { +// LLVM: define dso_local void @normal_func() {{.*}} +// OGCG: define dso_local void @normal_func() {{.*}} + +__attribute__((visibility("hidden"))) +void hidden_func() { + hidden_var = 0; + hidden_static_var = 0; +} +// CIR: cir.func no_inline no_proto hidden dso_local @hidden_func() {{.*}} { +// LLVM: define hidden void @hidden_func() {{.*}} +// OGCG: define hidden void @hidden_func() {{.*}} diff --git a/clang/test/CIR/IR/attribute-visibility.cir b/clang/test/CIR/IR/attribute-visibility.cir new file mode 100644 index 0000000000000..e4f09a9d657cf --- /dev/null +++ b/clang/test/CIR/IR/attribute-visibility.cir @@ -0,0 +1,28 @@ +// RUN: cir-opt %s --verify-roundtrip | FileCheck %s + +!s32i = !cir.int<s, 32> +module { + cir.global external dso_local @normal_var = #cir.int<10> : !s32i {alignment = 4 : i64} + // CHECK: cir.global external dso_local @normal_var = #cir.int<10> : !s32i {alignment = 4 : i64} + + cir.global hidden external dso_local @hidden_var = #cir.int<10> : !s32i {alignment = 4 : i64} + // CHECK: cir.global hidden external dso_local @hidden_var = #cir.int<10> : !s32i {alignment = 4 : i64} + + cir.global "private" internal dso_local @normal_static_var = #cir.int<10> : !s32i {alignment = 4 : i64} + // CHECK: cir.global "private" internal dso_local @normal_static_var = #cir.int<10> : !s32i {alignment = 4 : i64} + + cir.global "private" hidden internal dso_local @hidden_static_var = #cir.int<10> : !s32i {alignment = 4 : i64} + // CHECK: cir.global "private" hidden internal dso_local @hidden_static_var = #cir.int<10> : !s32i {alignment = 4 : i64} + + cir.func no_inline no_proto dso_local @normal_func() { + cir.return + } + // CHECK: cir.func no_inline no_proto dso_local @normal_func() + // CHECK: cir.return + + cir.func no_inline no_proto hidden dso_local @hidden_func() { + cir.return + } + // CHECK: cir.func no_inline no_proto hidden dso_local @hidden_func() + // CHECK: cir.return +} >From 94ed1cde3c90abee4e2a5219e9e3f28d819a4527 Mon Sep 17 00:00:00 2001 From: NotLebedev <[email protected]> Date: Thu, 2 Apr 2026 13:31:25 +0300 Subject: [PATCH 2/2] fixup! [CIR] Fix incorrect CIR_GlobalOp.global_visibility assembly format --- clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 5 +++-- clang/test/CIR/CodeGen/attribute-visibility.c | 7 ------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 1187fd5ddea5d..dbe064f03d119 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -223,10 +223,11 @@ void printVisibilityAttr(OpAsmPrinter &printer, void printVisibilityAttr(OpAsmPrinter &printer, cir::GlobalOp, cir::VisibilityAttr visibility) { - printVisibilityAttr(printer, visibility); + printVisibilityAttr(printer, visibility); } -mlir::OptionalParseResult parseVisibilityAttr(OpAsmParser &parser, cir::VisibilityAttr &visibility) { +mlir::OptionalParseResult parseVisibilityAttr(OpAsmParser &parser, + cir::VisibilityAttr &visibility) { cir::VisibilityKind visibilityKind = parseOptionalCIRKeyword(parser, cir::VisibilityKind::Default); visibility = cir::VisibilityAttr::get(parser.getContext(), visibilityKind); diff --git a/clang/test/CIR/CodeGen/attribute-visibility.c b/clang/test/CIR/CodeGen/attribute-visibility.c index 45098770d84ea..7d3ecd37ce248 100644 --- a/clang/test/CIR/CodeGen/attribute-visibility.c +++ b/clang/test/CIR/CodeGen/attribute-visibility.c @@ -21,12 +21,6 @@ static int normal_static_var = 10; // LLVM: @normal_static_var = internal global {{.*}} // OGCG: @normal_static_var = internal global {{.*}} -__attribute__((visibility("hidden"))) -static int hidden_static_var = 10; -// CIR: cir.global "private" hidden internal dso_local @hidden_static_var {{.*}} -// LLVM: @hidden_static_var = internal hidden global {{.*}} -// OGCG: @hidden_static_var = internal global {{.*}} - void normal_func() { normal_var = 0; normal_static_var = 0; @@ -38,7 +32,6 @@ void normal_func() { __attribute__((visibility("hidden"))) void hidden_func() { hidden_var = 0; - hidden_static_var = 0; } // CIR: cir.func no_inline no_proto hidden dso_local @hidden_func() {{.*}} { // LLVM: define hidden void @hidden_func() {{.*}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
