================ @@ -145,11 +145,294 @@ createMapInfoOp(fir::FirOpBuilder &builder, mlir::Location loc, builder.getIntegerAttr(builder.getIntegerType(64, false), mapType), builder.getAttr<mlir::omp::VariableCaptureKindAttr>(mapCaptureType), builder.getStringAttr(name), builder.getBoolAttr(partialMap)); - return op; } -static int +// This function gathers the individual omp::Object's that make up an +// larger omp::Object symbol. +// +// For example, provided the larger symbol: "parent%child%member", this +// function breaks it up into it's constituent components ("parent", +// "child", "member"), so we can access each individual component and +// introspect details, important to note this function breaks it up from +// RHS to LHS ("member" to "parent") and then we reverse it so that the +// returned omp::ObjectList is LHS to RHS, with the "parent" at the +// beginning. +omp::ObjectList gatherObjectsOf(omp::Object derivedTypeMember, + semantics::SemanticsContext &semaCtx) { + omp::ObjectList objList; + std::optional<omp::Object> baseObj = derivedTypeMember; + while (baseObj.has_value()) { + objList.push_back(baseObj.value()); + baseObj = getBaseObject(baseObj.value(), semaCtx); + } + return omp::ObjectList{llvm::reverse(objList)}; +} + +// This function generates a series of indices from a provided omp::Object, +// that devolves to an ArrayRef symbol, e.g. "array(2,3,4)", this function +// would generate a series of indices of "[1][2][3]" for the above example, +// offsetting by -1 to account for the non-zero fortran indexes. +// +// These indices can then be provided to a coordinate operation or other +// GEP-like operation to access the relevant positional member of the +// array. +// +// It is of note that the function only supports subscript integers currently +// and not Triplets i.e. Array(1:2:3). +static void generateArrayIndices(lower::AbstractConverter &converter, + fir::FirOpBuilder &firOpBuilder, + lower::StatementContext &stmtCtx, + mlir::Location clauseLocation, + llvm::SmallVectorImpl<mlir::Value> &indices, + omp::Object object) { + auto maybeRef = evaluate::ExtractDataRef(*object.ref()); + if (!maybeRef) + return; + + auto *arr = std::get_if<evaluate::ArrayRef>(&maybeRef->u); + if (!arr) + return; + + for (auto v : arr->subscript()) { + if (std::holds_alternative<Triplet>(v.u)) { + llvm_unreachable("Triplet indexing in map clause is unsupported"); + } else { ---------------- skatrak wrote:
Nit: This 'else' can be removed (only leaving its body), since `llvm_unreachable` does not return. Also, it looks like the 'if' + `llvm_unreachable` could be an `assert`. However, is this an invalid condition to assert on or should it trigger a TODO and inform the user instead? https://github.com/llvm/llvm-project/pull/113557 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits