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

via flang-commits flang-commits at lists.llvm.org
Wed Sep 23 18:20:40 PDT 2026


Author: Mehdi Amini
Date: 2026-09-24T01:20:34Z
New Revision: 15c447ea081640069246bb22147ed3cc4ab4e1d3

URL: https://github.com/llvm/llvm-project/commit/15c447ea081640069246bb22147ed3cc4ab4e1d3
DIFF: https://github.com/llvm/llvm-project/commit/15c447ea081640069246bb22147ed3cc4ab4e1d3.diff

LOG: [flang][FIR] Make global section an inherent attribute (#225963)

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

Assisted-by: Codex

Added: 
    

Modified: 
    flang/include/flang/Optimizer/Dialect/FIROps.td
    flang/lib/Optimizer/CodeGen/CodeGen.cpp
    flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp
    flang/test/Fir/global-attributes.fir

Removed: 
    


################################################################################
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 cb9f49f217851..a8f70e9453b75 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3830,6 +3830,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