xref: /llvm-project/flang/lib/Optimizer/Builder/Runtime/TemporaryStack.cpp (revision 0446bfcc5ca206701b511796ed1c8316daa2d169)
1f3c3f636SJean Perier //===- TemporaryStack.cpp ---- temporary stack runtime API calls ----------===//
2f3c3f636SJean Perier //
3f3c3f636SJean Perier // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f3c3f636SJean Perier // See https://llvm.org/LICENSE.txt for license information.
5f3c3f636SJean Perier // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f3c3f636SJean Perier //
7f3c3f636SJean Perier //===----------------------------------------------------------------------===//
8f3c3f636SJean Perier 
9f3c3f636SJean Perier #include "flang/Optimizer/Builder/Runtime/TemporaryStack.h"
10f3c3f636SJean Perier #include "flang/Optimizer/Builder/FIRBuilder.h"
11f3c3f636SJean Perier #include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
12f3c3f636SJean Perier #include "flang/Runtime/temporary-stack.h"
13f3c3f636SJean Perier 
14f3c3f636SJean Perier using namespace Fortran::runtime;
15f3c3f636SJean Perier 
genCreateValueStack(mlir::Location loc,fir::FirOpBuilder & builder)16f3c3f636SJean Perier mlir::Value fir::runtime::genCreateValueStack(mlir::Location loc,
17f3c3f636SJean Perier                                               fir::FirOpBuilder &builder) {
18f3c3f636SJean Perier   mlir::func::FuncOp func =
19f3c3f636SJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(CreateValueStack)>(loc, builder);
20f3c3f636SJean Perier   mlir::FunctionType funcType = func.getFunctionType();
21f3c3f636SJean Perier   mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
22f3c3f636SJean Perier   mlir::Value sourceLine =
23f3c3f636SJean Perier       fir::factory::locationToLineNo(builder, loc, funcType.getInput(1));
24f3c3f636SJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, sourceFile,
25f3c3f636SJean Perier                                             sourceLine);
26f3c3f636SJean Perier   return builder.create<fir::CallOp>(loc, func, args).getResult(0);
27f3c3f636SJean Perier }
28f3c3f636SJean Perier 
genPushValue(mlir::Location loc,fir::FirOpBuilder & builder,mlir::Value opaquePtr,mlir::Value boxValue)29f3c3f636SJean Perier void fir::runtime::genPushValue(mlir::Location loc, fir::FirOpBuilder &builder,
30f3c3f636SJean Perier                                 mlir::Value opaquePtr, mlir::Value boxValue) {
31f3c3f636SJean Perier   mlir::func::FuncOp func =
32f3c3f636SJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(PushValue)>(loc, builder);
33f3c3f636SJean Perier   mlir::FunctionType funcType = func.getFunctionType();
34f3c3f636SJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr,
35f3c3f636SJean Perier                                             boxValue);
36f3c3f636SJean Perier   builder.create<fir::CallOp>(loc, func, args);
37f3c3f636SJean Perier }
38f3c3f636SJean Perier 
genValueAt(mlir::Location loc,fir::FirOpBuilder & builder,mlir::Value opaquePtr,mlir::Value i,mlir::Value retValueBox)39f3c3f636SJean Perier void fir::runtime::genValueAt(mlir::Location loc, fir::FirOpBuilder &builder,
40f3c3f636SJean Perier                               mlir::Value opaquePtr, mlir::Value i,
41f3c3f636SJean Perier                               mlir::Value retValueBox) {
42f3c3f636SJean Perier   mlir::func::FuncOp func =
43f3c3f636SJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(ValueAt)>(loc, builder);
44f3c3f636SJean Perier   mlir::FunctionType funcType = func.getFunctionType();
45f3c3f636SJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr,
46f3c3f636SJean Perier                                             i, retValueBox);
47f3c3f636SJean Perier   builder.create<fir::CallOp>(loc, func, args);
48f3c3f636SJean Perier }
49f3c3f636SJean Perier 
genDestroyValueStack(mlir::Location loc,fir::FirOpBuilder & builder,mlir::Value opaquePtr)50f3c3f636SJean Perier void fir::runtime::genDestroyValueStack(mlir::Location loc,
51f3c3f636SJean Perier                                         fir::FirOpBuilder &builder,
52f3c3f636SJean Perier                                         mlir::Value opaquePtr) {
53f3c3f636SJean Perier   mlir::func::FuncOp func =
54f3c3f636SJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(DestroyValueStack)>(loc, builder);
55f3c3f636SJean Perier   mlir::FunctionType funcType = func.getFunctionType();
56f3c3f636SJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr);
57f3c3f636SJean Perier   builder.create<fir::CallOp>(loc, func, args);
58f3c3f636SJean Perier }
59*0446bfccSJean Perier 
genCreateDescriptorStack(mlir::Location loc,fir::FirOpBuilder & builder)60*0446bfccSJean Perier mlir::Value fir::runtime::genCreateDescriptorStack(mlir::Location loc,
61*0446bfccSJean Perier                                                    fir::FirOpBuilder &builder) {
62*0446bfccSJean Perier   mlir::func::FuncOp func =
63*0446bfccSJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(CreateDescriptorStack)>(loc,
64*0446bfccSJean Perier                                                                    builder);
65*0446bfccSJean Perier   mlir::FunctionType funcType = func.getFunctionType();
66*0446bfccSJean Perier   mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
67*0446bfccSJean Perier   mlir::Value sourceLine =
68*0446bfccSJean Perier       fir::factory::locationToLineNo(builder, loc, funcType.getInput(1));
69*0446bfccSJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, sourceFile,
70*0446bfccSJean Perier                                             sourceLine);
71*0446bfccSJean Perier   return builder.create<fir::CallOp>(loc, func, args).getResult(0);
72*0446bfccSJean Perier }
73*0446bfccSJean Perier 
genPushDescriptor(mlir::Location loc,fir::FirOpBuilder & builder,mlir::Value opaquePtr,mlir::Value boxDescriptor)74*0446bfccSJean Perier void fir::runtime::genPushDescriptor(mlir::Location loc,
75*0446bfccSJean Perier                                      fir::FirOpBuilder &builder,
76*0446bfccSJean Perier                                      mlir::Value opaquePtr,
77*0446bfccSJean Perier                                      mlir::Value boxDescriptor) {
78*0446bfccSJean Perier   mlir::func::FuncOp func =
79*0446bfccSJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(PushDescriptor)>(loc, builder);
80*0446bfccSJean Perier   mlir::FunctionType funcType = func.getFunctionType();
81*0446bfccSJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr,
82*0446bfccSJean Perier                                             boxDescriptor);
83*0446bfccSJean Perier   builder.create<fir::CallOp>(loc, func, args);
84*0446bfccSJean Perier }
85*0446bfccSJean Perier 
genDescriptorAt(mlir::Location loc,fir::FirOpBuilder & builder,mlir::Value opaquePtr,mlir::Value i,mlir::Value retDescriptorBox)86*0446bfccSJean Perier void fir::runtime::genDescriptorAt(mlir::Location loc,
87*0446bfccSJean Perier                                    fir::FirOpBuilder &builder,
88*0446bfccSJean Perier                                    mlir::Value opaquePtr, mlir::Value i,
89*0446bfccSJean Perier                                    mlir::Value retDescriptorBox) {
90*0446bfccSJean Perier   mlir::func::FuncOp func =
91*0446bfccSJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(DescriptorAt)>(loc, builder);
92*0446bfccSJean Perier   mlir::FunctionType funcType = func.getFunctionType();
93*0446bfccSJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr,
94*0446bfccSJean Perier                                             i, retDescriptorBox);
95*0446bfccSJean Perier   builder.create<fir::CallOp>(loc, func, args);
96*0446bfccSJean Perier }
97*0446bfccSJean Perier 
genDestroyDescriptorStack(mlir::Location loc,fir::FirOpBuilder & builder,mlir::Value opaquePtr)98*0446bfccSJean Perier void fir::runtime::genDestroyDescriptorStack(mlir::Location loc,
99*0446bfccSJean Perier                                              fir::FirOpBuilder &builder,
100*0446bfccSJean Perier                                              mlir::Value opaquePtr) {
101*0446bfccSJean Perier   mlir::func::FuncOp func =
102*0446bfccSJean Perier       fir::runtime::getRuntimeFunc<mkRTKey(DestroyDescriptorStack)>(loc,
103*0446bfccSJean Perier                                                                     builder);
104*0446bfccSJean Perier   mlir::FunctionType funcType = func.getFunctionType();
105*0446bfccSJean Perier   auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr);
106*0446bfccSJean Perier   builder.create<fir::CallOp>(loc, func, args);
107*0446bfccSJean Perier }
108