51 lines · cpp
1//===-- lib/Support/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-exception6//7//===----------------------------------------------------------------------===//8 9#include "flang/Support/OpenMP-utils.h"10 11#include "mlir/IR/OpDefinition.h"12 13namespace Fortran::common::openmp {14mlir::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.hasDeviceAddr.vars.size() + args.hostEvalVars.size() +22 args.inReduction.vars.size() + args.map.vars.size() +23 args.priv.vars.size() + args.reduction.vars.size() +24 args.taskReduction.vars.size() + args.useDeviceAddr.vars.size() +25 args.useDevicePtr.vars.size();26 types.reserve(numVars);27 locs.reserve(numVars);28 29 auto extractTypeLoc = [&types, &locs](llvm::ArrayRef<mlir::Value> vals) {30 llvm::transform(vals, std::back_inserter(types),31 [](mlir::Value v) { return v.getType(); });32 llvm::transform(vals, std::back_inserter(locs),33 [](mlir::Value v) { return v.getLoc(); });34 };35 36 // Populate block arguments in clause name alphabetical order to match37 // expected order by the BlockArgOpenMPOpInterface.38 extractTypeLoc(args.hasDeviceAddr.vars);39 extractTypeLoc(args.hostEvalVars);40 extractTypeLoc(args.inReduction.vars);41 extractTypeLoc(args.map.vars);42 extractTypeLoc(args.priv.vars);43 extractTypeLoc(args.reduction.vars);44 extractTypeLoc(args.taskReduction.vars);45 extractTypeLoc(args.useDeviceAddr.vars);46 extractTypeLoc(args.useDevicePtr.vars);47 48 return builder.createBlock(®ion, {}, types, locs);49}50} // namespace Fortran::common::openmp51