Skip to content

Commit faf6544

Browse files
[flang] Lower PAUSE statement with code and message operands
This patch adds lowering support for the Fortran PAUSE statement to FIR. It mirrors the STOP statement lowering logic to handle: - PAUSE with no operand - PAUSE <integer> - PAUSE 'message' Fixes #166821.
1 parent f55b55c commit faf6544

File tree

1 file changed

+44
-4
lines changed

1 file changed

+44
-4
lines changed

flang/lib/Lower/Runtime.cpp

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,12 +263,52 @@ void Fortran::lower::genSyncTeamStatement(
263263

264264
void Fortran::lower::genPauseStatement(
265265
Fortran::lower::AbstractConverter &converter,
266-
const Fortran::parser::PauseStmt &) {
266+
const Fortran::parser::PauseStmt &stmt) {
267267
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
268268
mlir::Location loc = converter.getCurrentLocation();
269-
mlir::func::FuncOp callee =
270-
fir::runtime::getRuntimeFunc<mkRTKey(PauseStatement)>(loc, builder);
271-
fir::CallOp::create(builder, loc, callee, mlir::ValueRange{});
269+
Fortran::lower::StatementContext stmtCtx;
270+
llvm::SmallVector<mlir::Value> operands;
271+
mlir::func::FuncOp callee;
272+
mlir::FunctionType calleeType;
273+
274+
if (stmt.v.has_value()) {
275+
const Fortran::parser::StopCode &code = stmt.v.value();
276+
auto expr = converter.genExprValue(*Fortran::semantics::GetExpr(code), stmtCtx);
277+
LLVM_DEBUG(llvm::dbgs() << "pause expression: "; expr.dump(); llvm::dbgs() << '\n');
278+
expr.match(
279+
[&](const fir::CharBoxValue &x) {
280+
callee = fir::runtime::getRuntimeFunc<mkRTKey(PauseStatementText)>(loc, builder);
281+
calleeType = callee.getFunctionType();
282+
operands.push_back(
283+
builder.createConvert(loc, calleeType.getInput(0), x.getAddr()));
284+
operands.push_back(
285+
builder.createConvert(loc, calleeType.getInput(1), x.getLen()));
286+
},
287+
[&](fir::UnboxedValue x) {
288+
callee = fir::runtime::getRuntimeFunc<mkRTKey(PauseStatement)>(loc, builder);
289+
calleeType = callee.getFunctionType();
290+
mlir::Value cast =
291+
builder.createConvert(loc, calleeType.getInput(0), x);
292+
operands.push_back(cast);
293+
},
294+
[&](auto) {
295+
mlir::emitError(loc, "unhandled expression in PAUSE");
296+
std::exit(1);
297+
});
298+
} else {
299+
callee = fir::runtime::getRuntimeFunc<mkRTKey(PauseStatement)>(loc, builder);
300+
calleeType = callee.getFunctionType();
301+
}
302+
303+
fir::CallOp::create(builder, loc, callee, operands);
304+
305+
auto blockIsUnterminated = [&builder]() {
306+
mlir::Block *currentBlock = builder.getBlock();
307+
return currentBlock->empty() ||
308+
!currentBlock->back().hasTrait<mlir::OpTrait::IsTerminator>();
309+
};
310+
if (blockIsUnterminated())
311+
genUnreachable(builder, loc);
272312
}
273313

274314
void Fortran::lower::genPointerAssociate(fir::FirOpBuilder &builder,

0 commit comments

Comments
 (0)