@@ -1355,6 +1355,7 @@ static void instantiateAlias(Fortran::lower::AbstractConverter &converter,
13551355 mlir::Value bytePtr = fir::CoordinateOp::create (
13561356 builder, loc, i8Ptr, storeAddr, mlir::ValueRange{offset});
13571357 mlir::Value typedPtr = castAliasToPointer (builder, loc, symType, bytePtr);
1358+ converter.bindSymbolStorage (sym, {storeAddr, off});
13581359 Fortran::lower::StatementContext stmtCtx;
13591360 mapSymbolAttributes (converter, var, symMap, stmtCtx, typedPtr);
13601361 // Default initialization is possible for equivalence members: see
@@ -1594,13 +1595,15 @@ void Fortran::lower::defineCommonBlocks(
15941595
15951596mlir::Value Fortran::lower::genCommonBlockMember (
15961597 Fortran::lower::AbstractConverter &converter, mlir::Location loc,
1597- const Fortran::semantics::Symbol &sym, mlir::Value commonValue) {
1598+ const Fortran::semantics::Symbol &sym, mlir::Value commonValue,
1599+ std::size_t commonSize) {
15981600 fir::FirOpBuilder &builder = converter.getFirOpBuilder ();
15991601
16001602 std::size_t byteOffset = sym.GetUltimate ().offset ();
16011603 mlir::IntegerType i8Ty = builder.getIntegerType (8 );
16021604 mlir::Type i8Ptr = builder.getRefType (i8Ty);
1603- mlir::Type seqTy = builder.getRefType (builder.getVarLenSeqTy (i8Ty));
1605+ fir::SequenceType::Shape shape (1 , commonSize);
1606+ mlir::Type seqTy = builder.getRefType (fir::SequenceType::get (shape, i8Ty));
16041607 mlir::Value base = builder.createConvert (loc, seqTy, commonValue);
16051608
16061609 mlir::Value offs =
@@ -1609,6 +1612,8 @@ mlir::Value Fortran::lower::genCommonBlockMember(
16091612 mlir::ValueRange{offs});
16101613 mlir::Type symType = converter.genType (sym);
16111614
1615+ converter.bindSymbolStorage (sym, {base, byteOffset});
1616+
16121617 return Fortran::semantics::FindEquivalenceSet (sym) != nullptr
16131618 ? castAliasToPointer (builder, loc, symType, varAddr)
16141619 : builder.createConvert (loc, builder.getRefType (symType), varAddr);
@@ -1637,7 +1642,8 @@ static void instantiateCommon(Fortran::lower::AbstractConverter &converter,
16371642 symMap.addSymbol (common, commonAddr);
16381643 }
16391644
1640- mlir::Value local = genCommonBlockMember (converter, loc, varSym, commonAddr);
1645+ mlir::Value local =
1646+ genCommonBlockMember (converter, loc, varSym, commonAddr, common.size ());
16411647 Fortran::lower::StatementContext stmtCtx;
16421648 mapSymbolAttributes (converter, var, symMap, stmtCtx, local);
16431649}
@@ -1909,7 +1915,8 @@ static void genDeclareSymbol(Fortran::lower::AbstractConverter &converter,
19091915 // Declare a local pointer variable.
19101916 auto newBase = hlfir::DeclareOp::create (
19111917 builder, loc, boxAlloc, name, /* shape=*/ nullptr , lenParams,
1912- /* dummy_scope=*/ nullptr , attributes);
1918+ /* dummy_scope=*/ nullptr , /* storage=*/ nullptr ,
1919+ /* storage_offset=*/ 0 , attributes);
19131920 mlir::Value nullAddr = builder.createNullConstant (
19141921 loc, llvm::cast<fir::BaseBoxType>(ptrBoxType).getEleTy ());
19151922
@@ -1939,9 +1946,10 @@ static void genDeclareSymbol(Fortran::lower::AbstractConverter &converter,
19391946 mlir::Value dummyScope;
19401947 if (converter.isRegisteredDummySymbol (sym))
19411948 dummyScope = converter.dummyArgsScopeValue ();
1942- auto newBase =
1943- hlfir::DeclareOp::create (builder, loc, base, name, shapeOrShift,
1944- lenParams, dummyScope, attributes, dataAttr);
1949+ auto [storage, storageOffset] = converter.getSymbolStorage (sym);
1950+ auto newBase = hlfir::DeclareOp::create (
1951+ builder, loc, base, name, shapeOrShift, lenParams, dummyScope, storage,
1952+ storageOffset, attributes, dataAttr);
19451953 symMap.addVariableDefinition (sym, newBase, force);
19461954 return ;
19471955 }
@@ -1999,8 +2007,10 @@ void Fortran::lower::genDeclareSymbol(
19992007 base = genPackArray (converter, sym, exv);
20002008 dummyScope = converter.dummyArgsScopeValue ();
20012009 }
2002- hlfir::EntityWithAttributes declare = hlfir::genDeclare (
2003- loc, builder, base, name, attributes, dummyScope, dataAttr);
2010+ auto [storage, storageOffset] = converter.getSymbolStorage (sym);
2011+ hlfir::EntityWithAttributes declare =
2012+ hlfir::genDeclare (loc, builder, base, name, attributes, dummyScope,
2013+ storage, storageOffset, dataAttr);
20042014 symMap.addVariableDefinition (sym, declare.getIfVariableInterface (), force);
20052015 return ;
20062016 }
0 commit comments