//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "CIRGenBuilder.h" using namespace clang::CIRGen; mlir::Value CIRGenBuilderTy::maybeBuildArrayDecay(mlir::Location loc, mlir::Value arrayPtr, mlir::Type eltTy) { const auto arrayPtrTy = mlir::cast(arrayPtr.getType()); const auto arrayTy = mlir::dyn_cast(arrayPtrTy.getPointee()); if (arrayTy) { const cir::PointerType flatPtrTy = getPointerTo(arrayTy.getEltType()); return create(loc, flatPtrTy, cir::CastKind::array_to_ptrdecay, arrayPtr); } assert(arrayPtrTy.getPointee() == eltTy && "flat pointee type must match original array element type"); return arrayPtr; } mlir::Value CIRGenBuilderTy::getArrayElement(mlir::Location arrayLocBegin, mlir::Location arrayLocEnd, mlir::Value arrayPtr, mlir::Type eltTy, mlir::Value idx, bool shouldDecay) { mlir::Value basePtr = arrayPtr; if (shouldDecay) basePtr = maybeBuildArrayDecay(arrayLocBegin, arrayPtr, eltTy); const mlir::Type flatPtrTy = basePtr.getType(); return create(arrayLocEnd, flatPtrTy, basePtr, idx); }