@@ -1413,6 +1413,7 @@ static void instantiateAlias(Fortran::lower::AbstractConverter &converter,
14131413 mlir::Value bytePtr = fir::CoordinateOp::create (
14141414 builder, loc, i8Ptr, storeAddr, mlir::ValueRange{offset});
14151415 mlir::Value typedPtr = castAliasToPointer (builder, loc, symType, bytePtr);
1416+ converter.bindSymbolStorage (sym, {storeAddr, off});
14161417 Fortran::lower::StatementContext stmtCtx;
14171418 mapSymbolAttributes (converter, var, symMap, stmtCtx, typedPtr);
14181419 // Default initialization is possible for equivalence members: see
@@ -1655,13 +1656,15 @@ void Fortran::lower::defineCommonBlocks(
16551656
16561657mlir::Value Fortran::lower::genCommonBlockMember (
16571658 Fortran::lower::AbstractConverter &converter, mlir::Location loc,
1658- const Fortran::semantics::Symbol &sym, mlir::Value commonValue) {
1659+ const Fortran::semantics::Symbol &sym, mlir::Value commonValue,
1660+ std::size_t commonSize) {
16591661 fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
16601662
16611663 std::size_t byteOffset = sym.GetUltimate ().offset ();
16621664 mlir::IntegerType i8Ty = builder.getIntegerType (8 );
16631665 mlir::Type i8Ptr = builder.getRefType (i8Ty);
1664- mlir::Type seqTy = builder.getRefType (builder.getVarLenSeqTy (i8Ty));
1666+ fir::SequenceType::Shape shape (1 , commonSize);
1667+ mlir::Type seqTy = builder.getRefType (fir::SequenceType::get (shape, i8Ty));
16651668 mlir::Value base = builder.createConvert (loc, seqTy, commonValue);
16661669
16671670 mlir::Value offs =
@@ -1670,6 +1673,8 @@ mlir::Value Fortran::lower::genCommonBlockMember(
16701673 mlir::ValueRange{offs});
16711674 mlir::Type symType = converter.genType (sym);
16721675
1676+ converter.bindSymbolStorage (sym, {base, byteOffset});
1677+
16731678 return Fortran::semantics::FindEquivalenceSet (sym) != nullptr
16741679 ? castAliasToPointer (builder, loc, symType, varAddr)
16751680 : builder.createConvert (loc, builder.getRefType (symType), varAddr);
@@ -1698,7 +1703,8 @@ static void instantiateCommon(Fortran::lower::AbstractConverter &converter,
16981703 symMap.addSymbol (common, commonAddr);
16991704 }
17001705
1701- mlir::Value local = genCommonBlockMember (converter, loc, varSym, commonAddr);
1706+ mlir::Value local =
1707+ genCommonBlockMember (converter, loc, varSym, commonAddr, common.size ());
17021708 Fortran::lower::StatementContext stmtCtx;
17031709 mapSymbolAttributes (converter, var, symMap, stmtCtx, local);
17041710}
@@ -1970,7 +1976,8 @@ static void genDeclareSymbol(Fortran::lower::AbstractConverter &converter,
19701976 // Declare a local pointer variable.
19711977 auto newBase = hlfir::DeclareOp::create (
19721978 builder, loc, boxAlloc, name, /* shape=*/ nullptr , lenParams,
1973- /* dummy_scope=*/ nullptr , attributes);
1979+ /* dummy_scope=*/ nullptr , /* storage=*/ nullptr ,
1980+ /* storage_offset=*/ 0 , attributes);
19741981 mlir::Value nullAddr = builder.createNullConstant (
19751982 loc, llvm::cast<fir::BaseBoxType>(ptrBoxType).getEleTy ());
19761983
@@ -2000,9 +2007,10 @@ static void genDeclareSymbol(Fortran::lower::AbstractConverter &converter,
20002007 mlir::Value dummyScope;
20012008 if (converter.isRegisteredDummySymbol (sym))
20022009 dummyScope = converter.dummyArgsScopeValue ();
2003- auto newBase =
2004- hlfir::DeclareOp::create (builder, loc, base, name, shapeOrShift,
2005- lenParams, dummyScope, attributes, dataAttr);
2010+ auto [storage, storageOffset] = converter.getSymbolStorage (sym);
2011+ auto newBase = hlfir::DeclareOp::create (
2012+ builder, loc, base, name, shapeOrShift, lenParams, dummyScope, storage,
2013+ storageOffset, attributes, dataAttr);
20062014 symMap.addVariableDefinition (sym, newBase, force);
20072015 return ;
20082016 }
@@ -2060,8 +2068,10 @@ void Fortran::lower::genDeclareSymbol(
20602068 base = genPackArray (converter, sym, exv);
20612069 dummyScope = converter.dummyArgsScopeValue ();
20622070 }
2063- hlfir::EntityWithAttributes declare = hlfir::genDeclare (
2064- loc, builder, base, name, attributes, dummyScope, dataAttr);
2071+ auto [storage, storageOffset] = converter.getSymbolStorage (sym);
2072+ hlfir::EntityWithAttributes declare =
2073+ hlfir::genDeclare (loc, builder, base, name, attributes, dummyScope,
2074+ storage, storageOffset, dataAttr);
20652075 symMap.addVariableDefinition (sym, declare.getIfVariableInterface (), force);
20662076 return ;
20672077 }
0 commit comments