[flang-commits] [flang] [flang][FIR] Make global section an inherent attribute (PR #225963)

Mehdi Amini via flang-commits flang-commits at lists.llvm.org
Wed Sep 23 15:59:04 PDT 2026


https://github.com/joker-eph updated https://github.com/llvm/llvm-project/pull/225963

>From 709b67d8fbb5893f7ee64ccc4eada013ca9d63ef Mon Sep 17 00:00:00 2001
From: Mehdi Amini <joker.eph at gmail.com>
Date: Wed, 23 Sep 2026 15:31:35 -0700
Subject: [PATCH] [flang][FIR] Make global section an inherent attribute

Preserve the section when lowering fir.global to an LLVM global.

Set the CUDA managed-pointer section through the generated property setter.

Test inherent property storage and FIR-to-LLVM conversion.

Assisted-by: Codex
---
 flang/include/flang/Optimizer/Dialect/FIROps.td           | 1 +
 flang/lib/Optimizer/CodeGen/CodeGen.cpp                   | 2 ++
 flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp | 8 ++------
 flang/test/Fir/global-attributes.fir                      | 6 ++++++
 4 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index 215118f915e29..0ab176cba2c8e 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -2931,6 +2931,7 @@ def fir_GlobalOp : fir_Op<"global", [IsolatedFromAbove, SymbolName,
     OptionalAttr<fir_Linkage>:$linkage,
     OptionalAttr<cuf_DataAttributeAttr>:$data_attr,
     OptionalAttr<I64Attr>:$alignment,
+    OptionalAttr<StrAttr>:$section,
     OptionalAttr<StrAttr>:$sym_visibility
   );
 
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 8285de795118e..428118eeb2cbf 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3829,6 +3829,8 @@ struct GlobalOpConversion : public fir::FIROpConversion<fir::GlobalOp> {
 
     if (global.getAlignment() && *global.getAlignment() > 0)
       g.setAlignment(*global.getAlignment());
+    if (auto section = global.getSection())
+      g.setSection(*section);
 
     auto module = global->getParentOfType<mlir::ModuleOp>();
 
diff --git a/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp b/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
index 6d60868c57044..ee51703b62caf 100644
--- a/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
+++ b/flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
@@ -96,16 +96,12 @@ static fir::GlobalOp createManagedPointerGlobal(fir::FirOpBuilder &builder,
   mlir::OpBuilder::InsertionGuard guard(builder);
   builder.setInsertionPointAfter(globalOp);
 
-  llvm::SmallVector<mlir::NamedAttribute> attrs;
-  attrs.push_back(
-      mlir::NamedAttribute(mlir::StringAttr::get(ctx, "section"),
-                           mlir::StringAttr::get(ctx, "__nv_managed_data__")));
-
   mlir::DenseElementsAttr initAttr = {};
   auto ptrGlobal = fir::GlobalOp::create(
       builder, globalOp.getLoc(), ptrGlobalName, /*isConstant=*/false,
       /*isTarget=*/false, ptrTy, initAttr,
-      /*linkage=*/builder.createInternalLinkage(), attrs);
+      /*linkage=*/builder.createInternalLinkage());
+  ptrGlobal.setSectionAttr(builder.getStringAttr("__nv_managed_data__"));
 
   mlir::Region &region = ptrGlobal.getRegion();
   mlir::Block *block = builder.createBlock(&region);
diff --git a/flang/test/Fir/global-attributes.fir b/flang/test/Fir/global-attributes.fir
index 24442d671504f..1003804abc23a 100644
--- a/flang/test/Fir/global-attributes.fir
+++ b/flang/test/Fir/global-attributes.fir
@@ -2,6 +2,7 @@
 // RUN: tco --fir-to-llvm-ir %s | FileCheck %s
 // RUN: fir-opt %s | FileCheck %s --check-prefix=READ-OUT
 // RUN: tco --emit-fir %s | FileCheck %s --check-prefix=READ-OUT
+// RUN: fir-opt --mlir-print-op-generic %s | FileCheck %s --check-prefix=GENERIC
 
 // CHECK: llvm.mlir.global external @_QMtest_0Edata_int() {{{.*}}test = "string_attribute_maintained"{{.*}}} : i32 {
 // CHECK: [[CST0:%.*]] = llvm.mlir.constant(10 : i32) : i32
@@ -15,3 +16,8 @@ fir.global @_QMtest_0Edata_int {test = "string_attribute_maintained"} : i32 {
   %c10_i32 = arith.constant 10 : i32
   fir.has_value %c10_i32 : i32
 }
+
+// READ-OUT: fir.global @sectioned {section = ".my_section"} : i32
+// GENERIC: "fir.global"() <{section = ".my_section"
+// CHECK: llvm.mlir.global external @sectioned() {{{.*}}section = ".my_section"{{.*}}} : i32
+fir.global @sectioned {section = ".my_section"} : i32



More information about the flang-commits mailing list