[flang-commits] [flang] [mlir] [flang][FIR] Represent fir.global linkage with a typed enum attribute (PR #220243)

via flang-commits flang-commits at lists.llvm.org
Tue Sep 1 06:14:49 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-fir-hlfir

Author: Scott Manley (rscottmanley)

<details>
<summary>Changes</summary>

Replace the string linkName on fir.global with fir::LinkageAttr / LinkageEnum so only the supported linkages can be used, and CodeGen can map them without string compares.

---

Patch is 36.48 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/220243.diff


18 Files Affected:

- (modified) flang/include/flang/Lower/ConvertConstant.h (+1-1) 
- (modified) flang/include/flang/Lower/ConvertVariable.h (+1-1) 
- (modified) flang/include/flang/Optimizer/Builder/FIRBuilder.h (+21-13) 
- (modified) flang/include/flang/Optimizer/Dialect/FIRAttr.td (+47) 
- (modified) flang/include/flang/Optimizer/Dialect/FIROps.td (+5-5) 
- (modified) flang/lib/Lower/ConvertConstant.cpp (+4-4) 
- (modified) flang/lib/Lower/ConvertVariable.cpp (+12-12) 
- (modified) flang/lib/Lower/IO.cpp (+2-2) 
- (modified) flang/lib/Lower/OpenMP/OpenMP.cpp (+1-1) 
- (modified) flang/lib/Optimizer/Builder/FIRBuilder.cpp (+2-2) 
- (modified) flang/lib/Optimizer/Builder/Runtime/EnvironmentDefaults.cpp (+1-1) 
- (modified) flang/lib/Optimizer/CodeGen/CodeGen.cpp (+12-10) 
- (modified) flang/lib/Optimizer/Dialect/FIROps.cpp (+16-17) 
- (modified) flang/lib/Optimizer/Transforms/CUDA/CUFAddConstructor.cpp (+1-1) 
- (modified) flang/lib/Optimizer/Transforms/CUDA/CUFComputeSharedMemoryOffsetsAndSize.cpp (+1-1) 
- (modified) flang/lib/Optimizer/Transforms/CUDA/CUFDeviceGlobal.cpp (+4-4) 
- (modified) flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp (+5-8) 
- (modified) mlir/lib/Dialect/OpenACC/Transforms/ACCDeclareGPUModuleInsertion.cpp (+1-1) 


``````````diff
diff --git a/flang/include/flang/Lower/ConvertConstant.h b/flang/include/flang/Lower/ConvertConstant.h
index dd19507d4c005..df903783471eb 100644
--- a/flang/include/flang/Lower/ConvertConstant.h
+++ b/flang/include/flang/Lower/ConvertConstant.h
@@ -63,7 +63,7 @@ fir::ExtendedValue convertConstant(Fortran::lower::AbstractConverter &converter,
 fir::GlobalOp tryCreatingDenseGlobal(fir::FirOpBuilder &builder,
                                      mlir::Location loc, mlir::Type symTy,
                                      llvm::StringRef globalName,
-                                     mlir::StringAttr linkage, bool isConst,
+                                     fir::LinkageAttr linkage, bool isConst,
                                      const Fortran::lower::SomeExpr &initExpr,
                                      cuf::DataAttributeAttr dataAttr = {},
                                      bool setDefaultAlignment = true);
diff --git a/flang/include/flang/Lower/ConvertVariable.h b/flang/include/flang/Lower/ConvertVariable.h
index a4ad984579410..c8f117e63040f 100644
--- a/flang/include/flang/Lower/ConvertVariable.h
+++ b/flang/include/flang/Lower/ConvertVariable.h
@@ -136,7 +136,7 @@ mlir::Value genInitialDataTarget(Fortran::lower::AbstractConverter &,
 /// Create the global op and its init if it has one
 fir::GlobalOp defineGlobal(Fortran::lower::AbstractConverter &converter,
                            const Fortran::lower::pft::Variable &var,
-                           llvm::StringRef globalName, mlir::StringAttr linkage,
+                           llvm::StringRef globalName, fir::LinkageAttr linkage,
                            cuf::DataAttributeAttr dataAttr = {});
 
 /// Generate address \p addr inside an initializer.
diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
index 22d0a6f7febbc..a29e3bf7063a5 100644
--- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
@@ -340,7 +340,7 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
   /// Create a global value.
   fir::GlobalOp createGlobal(mlir::Location loc, mlir::Type type,
                              llvm::StringRef name,
-                             mlir::StringAttr linkage = {},
+                             fir::LinkageAttr linkage = {},
                              mlir::Attribute value = {}, bool isConst = false,
                              bool isTarget = false,
                              cuf::DataAttributeAttr dataAttr = {},
@@ -349,14 +349,14 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
   fir::GlobalOp createGlobal(mlir::Location loc, mlir::Type type,
                              llvm::StringRef name, bool isConst, bool isTarget,
                              std::function<void(FirOpBuilder &)> bodyBuilder,
-                             mlir::StringAttr linkage = {},
+                             fir::LinkageAttr linkage = {},
                              cuf::DataAttributeAttr dataAttr = {},
                              bool setDefaultAlignment = true);
 
   /// Create a global constant (read-only) value.
   fir::GlobalOp createGlobalConstant(mlir::Location loc, mlir::Type type,
                                      llvm::StringRef name,
-                                     mlir::StringAttr linkage = {},
+                                     fir::LinkageAttr linkage = {},
                                      mlir::Attribute value = {}) {
     return createGlobal(loc, type, name, linkage, value, /*isConst=*/true,
                         /*isTarget=*/false);
@@ -366,7 +366,7 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
   createGlobalConstant(mlir::Location loc, mlir::Type type,
                        llvm::StringRef name,
                        std::function<void(FirOpBuilder &)> bodyBuilder,
-                       mlir::StringAttr linkage = {}) {
+                       fir::LinkageAttr linkage = {}) {
     return createGlobal(loc, type, name, /*isConst=*/true, /*isTarget=*/false,
                         bodyBuilder, linkage);
   }
@@ -383,24 +383,32 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener {
   // Linkage helpers (inline). The default linkage is external.
   //===--------------------------------------------------------------------===//
 
-  static mlir::StringAttr createCommonLinkage(mlir::MLIRContext *context) {
-    return mlir::StringAttr::get(context, "common");
+  static fir::LinkageAttr createCommonLinkage(mlir::MLIRContext *context) {
+    return fir::LinkageAttr::get(context, fir::LinkageEnum::Common);
   }
-  mlir::StringAttr createCommonLinkage() {
+  fir::LinkageAttr createCommonLinkage() {
     return createCommonLinkage(getContext());
   }
 
-  mlir::StringAttr createExternalLinkage() { return getStringAttr("external"); }
+  fir::LinkageAttr createExternalLinkage() {
+    return fir::LinkageAttr::get(getContext(), fir::LinkageEnum::External);
+  }
 
-  mlir::StringAttr createInternalLinkage() { return getStringAttr("internal"); }
+  fir::LinkageAttr createInternalLinkage() {
+    return fir::LinkageAttr::get(getContext(), fir::LinkageEnum::Internal);
+  }
 
-  mlir::StringAttr createLinkOnceLinkage() { return getStringAttr("linkonce"); }
+  fir::LinkageAttr createLinkOnceLinkage() {
+    return fir::LinkageAttr::get(getContext(), fir::LinkageEnum::Linkonce);
+  }
 
-  mlir::StringAttr createLinkOnceODRLinkage() {
-    return getStringAttr("linkonce_odr");
+  fir::LinkageAttr createLinkOnceODRLinkage() {
+    return fir::LinkageAttr::get(getContext(), fir::LinkageEnum::LinkonceODR);
   }
 
-  mlir::StringAttr createWeakLinkage() { return getStringAttr("weak"); }
+  fir::LinkageAttr createWeakLinkage() {
+    return fir::LinkageAttr::get(getContext(), fir::LinkageEnum::Weak);
+  }
 
   /// Get a function by name. If the function exists in the current module, it
   /// is returned. Otherwise, a null FuncOp is returned.
diff --git a/flang/include/flang/Optimizer/Dialect/FIRAttr.td b/flang/include/flang/Optimizer/Dialect/FIRAttr.td
index c53a2b869e968..cfe8e96e8e4a5 100644
--- a/flang/include/flang/Optimizer/Dialect/FIRAttr.td
+++ b/flang/include/flang/Optimizer/Dialect/FIRAttr.td
@@ -15,10 +15,57 @@
 
 include "flang/Optimizer/Dialect/FIRDialect.td"
 include "mlir/Dialect/OpenACC/OpenACCAttributes.td"
+include "mlir/IR/CommonAttrConstraints.td"
 include "mlir/IR/EnumAttr.td"
 
 class fir_Attr<string name> : AttrDef<FIROpsDialect, name>;
 
+//===----------------------------------------------------------------------===//
+// Linkage
+//===----------------------------------------------------------------------===//
+
+// Linkage attribute used on fir.global. This is a subset of LLVM linkage
+// types currently supported by FIR. The names match the keywords in the
+// custom assembly form of fir.global. External is the default when omitted.
+def FIR_LinkageExternal
+    : I64EnumAttrCase<"External", 0, "external">;
+def FIR_LinkageInternal
+    : I64EnumAttrCase<"Internal", 1, "internal">;
+def FIR_LinkageLinkonce
+    : I64EnumAttrCase<"Linkonce", 2, "linkonce">;
+def FIR_LinkageLinkonceODR
+    : I64EnumAttrCase<"LinkonceODR", 3, "linkonce_odr">;
+def FIR_LinkageWeak
+    : I64EnumAttrCase<"Weak", 4, "weak">;
+def FIR_LinkageCommon
+    : I64EnumAttrCase<"Common", 5, "common">;
+
+def fir_LinkageEnum : I64EnumAttr<
+    "LinkageEnum",
+    "FIR linkage types",
+    [FIR_LinkageExternal, FIR_LinkageInternal, FIR_LinkageLinkonce,
+     FIR_LinkageLinkonceODR, FIR_LinkageWeak, FIR_LinkageCommon]> {
+  let cppNamespace = "::fir";
+  let genSpecializedAttr = 0;
+}
+
+def fir_LinkageAttr : fir_Attr<"Linkage"> {
+  let mnemonic = "linkage";
+  let parameters = (ins "LinkageEnum":$linkage);
+  let assemblyFormat = "`<` $linkage `>`";
+}
+
+def fir_Linkage : DialectAttr<
+    FIROpsDialect,
+    CPred<"::llvm::isa<::fir::LinkageAttr>($_self)">,
+    "FIR linkage specification"> {
+  let storageType = "::fir::LinkageAttr";
+  let returnType = "::fir::LinkageEnum";
+  let convertFromStorage = "$_self.getLinkage()";
+  let constBuilderCall =
+          "::fir::LinkageAttr::get($_builder.getContext(), $0)";
+}
+
 def FIRnoAttributes  : I32BitEnumAttrCaseNone<"None">;
 def FIRallocatable  : I32BitEnumAttrCaseBit<"allocatable", 0>;
 def FIRasynchronous : I32BitEnumAttrCaseBit<"asynchronous", 1>;
diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index fd0b5b16c87ad..1a5c29a6e991e 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -2920,7 +2920,7 @@ def fir_GlobalOp : fir_Op<"global", [IsolatedFromAbove, SymbolName,
     OptionalAttr<AnyAttr>:$initVal,
     OptionalAttr<UnitAttr>:$constant,
     OptionalAttr<UnitAttr>:$target,
-    OptionalAttr<StrAttr>:$linkName,
+    OptionalAttr<fir_Linkage>:$linkage,
     OptionalAttr<cuf_DataAttributeAttr>:$data_attr,
     OptionalAttr<I64Attr>:$alignment,
     OptionalAttr<StrAttr>:$sym_visibility
@@ -2938,18 +2938,18 @@ def fir_GlobalOp : fir_Op<"global", [IsolatedFromAbove, SymbolName,
       "bool":$isTarget, "mlir::Type":$type,
       CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attrs)>,
     OpBuilder<(ins "llvm::StringRef":$name, "mlir::Type":$type,
-      CArg<"mlir::StringAttr", "{}">:$linkage,
+      CArg<"fir::LinkageAttr", "{}">:$linkage,
       CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attrs)>,
     OpBuilder<(ins "llvm::StringRef":$name, "bool":$isConstant,
       "bool":$isTarget,
-      "mlir::Type":$type, CArg<"mlir::StringAttr", "{}">:$linkage,
+      "mlir::Type":$type, CArg<"fir::LinkageAttr", "{}">:$linkage,
       CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attrs)>,
     OpBuilder<(ins "llvm::StringRef":$name, "mlir::Type":$type,
-      "mlir::Attribute":$initVal, CArg<"mlir::StringAttr", "{}">:$linkage,
+      "mlir::Attribute":$initVal, CArg<"fir::LinkageAttr", "{}">:$linkage,
       CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attrs)>,
     OpBuilder<(ins "llvm::StringRef":$name, "bool":$isConstant,
       "bool":$isTarget, "mlir::Type":$type, "mlir::Attribute":$initVal,
-      CArg<"mlir::StringAttr", "{}">:$linkage,
+      CArg<"fir::LinkageAttr", "{}">:$linkage,
       CArg<"llvm::ArrayRef<mlir::NamedAttribute>", "{}">:$attrs)>,
   ];
 
diff --git a/flang/lib/Lower/ConvertConstant.cpp b/flang/lib/Lower/ConvertConstant.cpp
index 6525ce50f9fdc..f48dc9931e627 100644
--- a/flang/lib/Lower/ConvertConstant.cpp
+++ b/flang/lib/Lower/ConvertConstant.cpp
@@ -104,7 +104,7 @@ class DenseGlobalBuilder {
 public:
   static fir::GlobalOp
   tryCreating(fir::FirOpBuilder &builder, mlir::Location loc, mlir::Type symTy,
-              llvm::StringRef globalName, mlir::StringAttr linkage,
+              llvm::StringRef globalName, fir::LinkageAttr linkage,
               bool isConst, const Fortran::lower::SomeExpr &initExpr,
               cuf::DataAttributeAttr dataAttr, bool setDefaultAlignment) {
     DenseGlobalBuilder globalBuilder;
@@ -130,7 +130,7 @@ class DenseGlobalBuilder {
   template <Fortran::common::TypeCategory TC, int KIND>
   static fir::GlobalOp tryCreating(
       fir::FirOpBuilder &builder, mlir::Location loc, mlir::Type symTy,
-      llvm::StringRef globalName, mlir::StringAttr linkage, bool isConst,
+      llvm::StringRef globalName, fir::LinkageAttr linkage, bool isConst,
       const Fortran::evaluate::Constant<Fortran::evaluate::Type<TC, KIND>>
           &constant,
       cuf::DataAttributeAttr dataAttr, bool setDefaultAlignment = true) {
@@ -202,7 +202,7 @@ class DenseGlobalBuilder {
   fir::GlobalOp tryCreatingGlobal(fir::FirOpBuilder &builder,
                                   mlir::Location loc, mlir::Type symTy,
                                   llvm::StringRef globalName,
-                                  mlir::StringAttr linkage, bool isConst,
+                                  fir::LinkageAttr linkage, bool isConst,
                                   cuf::DataAttributeAttr dataAttr,
                                   bool setDefaultAlignment) const {
     // Not a "trivial" intrinsic constant array, or empty array.
@@ -228,7 +228,7 @@ class DenseGlobalBuilder {
 
 fir::GlobalOp Fortran::lower::tryCreatingDenseGlobal(
     fir::FirOpBuilder &builder, mlir::Location loc, mlir::Type symTy,
-    llvm::StringRef globalName, mlir::StringAttr linkage, bool isConst,
+    llvm::StringRef globalName, fir::LinkageAttr linkage, bool isConst,
     const Fortran::lower::SomeExpr &initExpr, cuf::DataAttributeAttr dataAttr,
     bool setDefaultAlignment) {
   return DenseGlobalBuilder::tryCreating(builder, loc, symTy, globalName,
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index a808905850922..8438b39c990a9 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -198,7 +198,7 @@ static void attachAccDeclareAttribute(fir::FirOpBuilder &builder,
 static fir::GlobalOp declareGlobal(Fortran::lower::AbstractConverter &converter,
                                    const Fortran::lower::pft::Variable &var,
                                    llvm::StringRef globalName,
-                                   mlir::StringAttr linkage) {
+                                   fir::LinkageAttr linkage) {
   fir::FirOpBuilder &builder = converter.getFirOpBuilder();
   if (fir::GlobalOp global = builder.getNamedGlobal(globalName))
     return global;
@@ -497,7 +497,7 @@ createGlobalInitialization(fir::FirOpBuilder &builder, fir::GlobalOp global,
 fir::GlobalOp Fortran::lower::defineGlobal(
     Fortran::lower::AbstractConverter &converter,
     const Fortran::lower::pft::Variable &var, llvm::StringRef globalName,
-    mlir::StringAttr linkage, cuf::DataAttributeAttr dataAttr) {
+    fir::LinkageAttr linkage, cuf::DataAttributeAttr dataAttr) {
   fir::FirOpBuilder &builder = converter.getFirOpBuilder();
   const Fortran::semantics::Symbol &sym = var.getSymbol();
   mlir::Location loc = genLocation(converter, sym);
@@ -628,7 +628,7 @@ fir::GlobalOp Fortran::lower::defineGlobal(
       // with no other definitions, and to never link the resulting module
       // object file.
       if (sym.attrs().test(Fortran::semantics::Attr::BIND_C))
-        global.setLinkName(builder.createCommonLinkage());
+        global.setLinkageAttr(builder.createCommonLinkage());
       createGlobalInitialization(
           builder, global, [&](fir::FirOpBuilder &builder) {
             mlir::Value initValue;
@@ -647,7 +647,7 @@ fir::GlobalOp Fortran::lower::defineGlobal(
 }
 
 /// Return linkage attribute for \p var.
-static mlir::StringAttr
+static fir::LinkageAttr
 getLinkageAttribute(Fortran::lower::AbstractConverter &converter,
                     const Fortran::lower::pft::Variable &var) {
   fir::FirOpBuilder &builder = converter.getFirOpBuilder();
@@ -680,7 +680,7 @@ static void instantiateGlobal(Fortran::lower::AbstractConverter &converter,
   fir::FirOpBuilder &builder = converter.getFirOpBuilder();
   std::string globalName = converter.mangleName(sym);
   mlir::Location loc = genLocation(converter, sym);
-  mlir::StringAttr linkage = getLinkageAttribute(converter, var);
+  fir::LinkageAttr linkage = getLinkageAttribute(converter, var);
   fir::GlobalOp global;
 
   if (Fortran::evaluate::IsCoarray(sym)) {
@@ -905,7 +905,7 @@ genInlinedInitWithMemcpy(Fortran::lower::AbstractConverter &converter,
       (converter.mangleName(*declTy->AsDerived()) + fir::kNameSeparator +
        fir::kDerivedTypeInitSuffix)
           .str());
-  mlir::StringAttr linkage = builder.createInternalLinkage();
+  fir::LinkageAttr linkage = builder.createInternalLinkage();
   fir::GlobalOp global = builder.getNamedGlobal(globalName);
   if (!global && details->init()) {
     global = builder.createGlobal(symLoc, symTy, globalName, linkage,
@@ -1398,7 +1398,7 @@ getAggregateType(Fortran::lower::AbstractConverter &converter,
 static fir::GlobalOp defineGlobalAggregateStore(
     Fortran::lower::AbstractConverter &converter,
     const Fortran::lower::pft::Variable::AggregateStore &aggregate,
-    llvm::StringRef aggName, mlir::StringAttr linkage) {
+    llvm::StringRef aggName, fir::LinkageAttr linkage) {
   assert(aggregate.isGlobal() && "not a global interval");
   fir::FirOpBuilder &builder = converter.getFirOpBuilder();
   fir::GlobalOp global = builder.getNamedGlobal(aggName);
@@ -1443,7 +1443,7 @@ static fir::GlobalOp defineGlobalAggregateStore(
 static fir::GlobalOp declareGlobalAggregateStore(
     Fortran::lower::AbstractConverter &converter, mlir::Location loc,
     const Fortran::lower::pft::Variable::AggregateStore &aggregate,
-    llvm::StringRef aggName, mlir::StringAttr linkage) {
+    llvm::StringRef aggName, fir::LinkageAttr linkage) {
   assert(aggregate.isGlobal() && "not a global interval");
   fir::FirOpBuilder &builder = converter.getFirOpBuilder();
   if (fir::GlobalOp global = builder.getNamedGlobal(aggName))
@@ -1467,7 +1467,7 @@ instantiateAggregateStore(Fortran::lower::AbstractConverter &converter,
   if (var.isGlobal()) {
     fir::GlobalOp global;
     auto &aggregate = var.getAggregateStore();
-    mlir::StringAttr linkage = getLinkageAttribute(converter, var);
+    fir::LinkageAttr linkage = getLinkageAttribute(converter, var);
     if (var.isModuleOrSubmoduleVariable()) {
       // A module global was or will be defined when lowering the module. Emit
       // only a declaration if the global does not exist at that point.
@@ -1668,7 +1668,7 @@ declareCommonBlock(Fortran::lower::AbstractConverter &converter,
   Fortran::semantics::MutableSymbolVector cmnBlkMems =
       getCommonMembersWithInitAliases(common);
   mlir::Location loc = converter.genLocation(common.name());
-  mlir::StringAttr linkage = builder.createCommonLinkage();
+  fir::LinkageAttr linkage = builder.createCommonLinkage();
   const auto *details =
       common.detailsIf<Fortran::semantics::CommonBlockDetails>();
   assert(details && "Expect CommonBlockDetails on the common symbol");
@@ -2708,7 +2708,7 @@ void Fortran::lower::defineModuleVariable(
     AbstractConverter &converter, const Fortran::lower::pft::Variable &var) {
   // Use empty linkage for module variables, which makes them available
   // for use in another unit.
-  mlir::StringAttr linkage = getLinkageAttribute(converter, var);
+  fir::LinkageAttr linkage = getLinkageAttribute(converter, var);
   if (!var.isGlobal())
     fir::emitFatalError(converter.getCurrentLocation(),
                         "attempting to lower module variable as local");
@@ -2845,7 +2845,7 @@ void Fortran::lower::createRuntimeTypeInfoGlobal(
     const Fortran::semantics::Symbol &typeInfoSym) {
   std::string globalName = converter.mangleName(typeInfoSym);
   auto var = Fortran::lower::pft::Variable(typeInfoSym, /*global=*/true);
-  mlir::StringAttr linkage = getLinkageAttribute(converter, var);
+  fir::LinkageAttr linkage = getLinkageAttribute(converter, var);
   defineGlobal(converter, var, globalName, linkage);
 }
 
diff --git a/flang/lib/Lower/IO.cpp b/flang/lib/Lower/IO.cpp
index 490db8cc1d1ba..611b6918fc46c 100644
--- a/flang/lib/Lower/IO.cpp
+++ b/flang/lib/Lower/IO.cpp
@@ -262,7 +262,7 @@ getNonTbpDefinedIoTableAddr(Fortran::lower::AbstractConverter &converter,
                                                        table.resultType(),
                                                        table.getSymbol()));
 
-  mlir::StringAttr linkOnce = builder.createLinkOnceLinkage();
+  fir::LinkageAttr linkOnce = builder.createLinkOnceLinkage();
   mlir::Type idxTy = builder.getIndexType();
   mlir::Type sizeTy =
       fir::runtime::getModel<std::size_t>()(builder.getContext());
@@ -426,7 +426,7 @@ getNamelistGroup(Fortran::lower::AbstractConverter &converter,
   const auto &details =
       symbol.GetUltimate().get<Fortran::semantics::NamelistDetails>();
   mlir::MLIRContext *context = builder.getContext();
-  mlir::StringAttr linkOnce = builder.createLinkOnceLinkage();
+  fir::LinkageAttr linkOnce = builder.createLinkOnceLinkage();
   mlir::Type idxTy = builder.getIndexType();
   mlir::Type sizeTy =
       fir::runtime::getModel<std::size_t>()(builder.getContext());
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
i...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/220243


More information about the flang-commits mailing list