@@ -647,19 +647,13 @@ fir::GlobalOp Fortran::lower::defineGlobal(
647647
648648// / Return linkage attribute for \p var.
649649static mlir::StringAttr
650- getLinkageAttribute (Fortran::lower::AbstractConverter &converter ,
650+ getLinkageAttribute (fir::FirOpBuilder &builder ,
651651 const Fortran::lower::pft::Variable &var) {
652- fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
653652 // Runtime type info for a same derived type is identical in each compilation
654653 // unit. It desired to avoid having to link against module that only define a
655654 // type. Therefore the runtime type info is generated everywhere it is needed
656- // with `linkonce_odr` LLVM linkage (unless the skipExternalRttiDefinition
657- // option is set, in which case one will need to link against objects of
658- // modules defining types). Builtin objects rtti is always generated because
659- // the builtin module is currently not compiled or part of the runtime.
660- if (var.isRuntimeTypeInfoData () &&
661- (!converter.getLoweringOptions ().getSkipExternalRttiDefinition () ||
662- Fortran::semantics::IsFromBuiltinModule (var.getSymbol ())))
655+ // with `linkonce_odr` LLVM linkage.
656+ if (var.isRuntimeTypeInfoData ())
663657 return builder.createLinkOnceODRLinkage ();
664658 if (var.isModuleOrSubmoduleVariable ())
665659 return {}; // external linkage
@@ -679,7 +673,7 @@ static void instantiateGlobal(Fortran::lower::AbstractConverter &converter,
679673 fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
680674 std::string globalName = converter.mangleName (sym);
681675 mlir::Location loc = genLocation (converter, sym);
682- mlir::StringAttr linkage = getLinkageAttribute (converter , var);
676+ mlir::StringAttr linkage = getLinkageAttribute (builder , var);
683677 fir::GlobalOp global;
684678 if (var.isModuleOrSubmoduleVariable ()) {
685679 // A non-intrinsic module global is defined when lowering the module.
@@ -1271,7 +1265,7 @@ instantiateAggregateStore(Fortran::lower::AbstractConverter &converter,
12711265 if (var.isGlobal ()) {
12721266 fir::GlobalOp global;
12731267 auto &aggregate = var.getAggregateStore ();
1274- mlir::StringAttr linkage = getLinkageAttribute (converter , var);
1268+ mlir::StringAttr linkage = getLinkageAttribute (builder , var);
12751269 if (var.isModuleOrSubmoduleVariable ()) {
12761270 // A module global was or will be defined when lowering the module. Emit
12771271 // only a declaration if the global does not exist at that point.
@@ -2476,7 +2470,8 @@ void Fortran::lower::defineModuleVariable(
24762470 AbstractConverter &converter, const Fortran::lower::pft::Variable &var) {
24772471 // Use empty linkage for module variables, which makes them available
24782472 // for use in another unit.
2479- mlir::StringAttr linkage = getLinkageAttribute (converter, var);
2473+ mlir::StringAttr linkage =
2474+ getLinkageAttribute (converter.getFirOpBuilder (), var);
24802475 if (!var.isGlobal ())
24812476 fir::emitFatalError (converter.getCurrentLocation (),
24822477 " attempting to lower module variable as local" );
@@ -2611,9 +2606,10 @@ void Fortran::lower::createIntrinsicModuleGlobal(
26112606void Fortran::lower::createRuntimeTypeInfoGlobal (
26122607 Fortran::lower::AbstractConverter &converter,
26132608 const Fortran::semantics::Symbol &typeInfoSym) {
2609+ fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
26142610 std::string globalName = converter.mangleName (typeInfoSym);
26152611 auto var = Fortran::lower::pft::Variable (typeInfoSym, /* global=*/ true );
2616- mlir::StringAttr linkage = getLinkageAttribute (converter , var);
2612+ mlir::StringAttr linkage = getLinkageAttribute (builder , var);
26172613 defineGlobal (converter, var, globalName, linkage);
26182614}
26192615
0 commit comments