1 //===-- include/flang/Common/OpenMP-utils.cpp ------------------*- C++ -*-====// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "flang/Common/OpenMP-utils.h" 10 11 #include "mlir/IR/OpDefinition.h" 12 13 namespace Fortran::common::openmp { 14 mlir::Block *genEntryBlock(mlir::OpBuilder &builder, const EntryBlockArgs &args, 15 mlir::Region ®ion) { 16 assert(args.isValid() && "invalid args"); 17 assert(region.empty() && "non-empty region"); 18 19 llvm::SmallVector<mlir::Type> types; 20 llvm::SmallVector<mlir::Location> locs; 21 unsigned numVars = args.hostEvalVars.size() + args.inReduction.vars.size() + 22 args.map.vars.size() + args.priv.vars.size() + 23 args.reduction.vars.size() + args.taskReduction.vars.size() + 24 args.useDeviceAddr.vars.size() + args.useDevicePtr.vars.size(); 25 types.reserve(numVars); 26 locs.reserve(numVars); 27 28 auto extractTypeLoc = [&types, &locs](llvm::ArrayRef<mlir::Value> vals) { 29 llvm::transform(vals, std::back_inserter(types), 30 [](mlir::Value v) { return v.getType(); }); 31 llvm::transform(vals, std::back_inserter(locs), 32 [](mlir::Value v) { return v.getLoc(); }); 33 }; 34 35 // Populate block arguments in clause name alphabetical order to match 36 // expected order by the BlockArgOpenMPOpInterface. 37 extractTypeLoc(args.hostEvalVars); 38 extractTypeLoc(args.inReduction.vars); 39 extractTypeLoc(args.map.vars); 40 extractTypeLoc(args.priv.vars); 41 extractTypeLoc(args.reduction.vars); 42 extractTypeLoc(args.taskReduction.vars); 43 extractTypeLoc(args.useDeviceAddr.vars); 44 extractTypeLoc(args.useDevicePtr.vars); 45 46 return builder.createBlock(®ion, {}, types, locs); 47 } 48 } // namespace Fortran::common::openmp 49