181f544d4SKareem Ergawy //===-- include/flang/Common/OpenMP-utils.cpp ------------------*- C++ -*-====// 281f544d4SKareem Ergawy // 381f544d4SKareem Ergawy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481f544d4SKareem Ergawy // See https://llvm.org/LICENSE.txt for license information. 581f544d4SKareem Ergawy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681f544d4SKareem Ergawy // 781f544d4SKareem Ergawy //===----------------------------------------------------------------------===// 881f544d4SKareem Ergawy 981f544d4SKareem Ergawy #include "flang/Common/OpenMP-utils.h" 1081f544d4SKareem Ergawy 1181f544d4SKareem Ergawy #include "mlir/IR/OpDefinition.h" 1281f544d4SKareem Ergawy 1381f544d4SKareem Ergawy namespace Fortran::common::openmp { 1481f544d4SKareem Ergawy mlir::Block *genEntryBlock(mlir::OpBuilder &builder, const EntryBlockArgs &args, 1581f544d4SKareem Ergawy mlir::Region ®ion) { 1681f544d4SKareem Ergawy assert(args.isValid() && "invalid args"); 1781f544d4SKareem Ergawy assert(region.empty() && "non-empty region"); 1881f544d4SKareem Ergawy 1981f544d4SKareem Ergawy llvm::SmallVector<mlir::Type> types; 2081f544d4SKareem Ergawy llvm::SmallVector<mlir::Location> locs; 21*8fe11a26SSergio Afonso unsigned numVars = args.hostEvalVars.size() + args.inReduction.vars.size() + 22*8fe11a26SSergio Afonso args.map.vars.size() + args.priv.vars.size() + 23*8fe11a26SSergio Afonso args.reduction.vars.size() + args.taskReduction.vars.size() + 24*8fe11a26SSergio Afonso args.useDeviceAddr.vars.size() + args.useDevicePtr.vars.size(); 2581f544d4SKareem Ergawy types.reserve(numVars); 2681f544d4SKareem Ergawy locs.reserve(numVars); 2781f544d4SKareem Ergawy 2881f544d4SKareem Ergawy auto extractTypeLoc = [&types, &locs](llvm::ArrayRef<mlir::Value> vals) { 2981f544d4SKareem Ergawy llvm::transform(vals, std::back_inserter(types), 3081f544d4SKareem Ergawy [](mlir::Value v) { return v.getType(); }); 3181f544d4SKareem Ergawy llvm::transform(vals, std::back_inserter(locs), 3281f544d4SKareem Ergawy [](mlir::Value v) { return v.getLoc(); }); 3381f544d4SKareem Ergawy }; 3481f544d4SKareem Ergawy 3581f544d4SKareem Ergawy // Populate block arguments in clause name alphabetical order to match 3681f544d4SKareem Ergawy // expected order by the BlockArgOpenMPOpInterface. 37*8fe11a26SSergio Afonso extractTypeLoc(args.hostEvalVars); 3881f544d4SKareem Ergawy extractTypeLoc(args.inReduction.vars); 3981f544d4SKareem Ergawy extractTypeLoc(args.map.vars); 4081f544d4SKareem Ergawy extractTypeLoc(args.priv.vars); 4181f544d4SKareem Ergawy extractTypeLoc(args.reduction.vars); 4281f544d4SKareem Ergawy extractTypeLoc(args.taskReduction.vars); 4381f544d4SKareem Ergawy extractTypeLoc(args.useDeviceAddr.vars); 4481f544d4SKareem Ergawy extractTypeLoc(args.useDevicePtr.vars); 4581f544d4SKareem Ergawy 4681f544d4SKareem Ergawy return builder.createBlock(®ion, {}, types, locs); 4781f544d4SKareem Ergawy } 4881f544d4SKareem Ergawy } // namespace Fortran::common::openmp 49