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-exception
6//
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 &region) {
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 match
37 // 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(&region, {}, types, locs);
49}
50} // namespace Fortran::common::openmp
51

source code of flang/lib/Support/OpenMP-utils.cpp