blob: e6b682e0151d18d41ed63dced64853ce8b1b851d [file] [log] [blame]
//===- ConvertOpenACCToLLVM.h - OpenACC conversion pass entrypoint --------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_CONVERSION_OPENACCTOLLVM_CONVERTOPENACCTOLLVM_H
#define MLIR_CONVERSION_OPENACCTOLLVM_CONVERTOPENACCTOLLVM_H
#include "mlir/Conversion/LLVMCommon/StructBuilder.h"
#include <memory>
namespace mlir {
class LLVMTypeConverter;
class ModuleOp;
template <typename T>
class OperationPass;
class RewritePatternSet;
static constexpr unsigned kPtrBasePosInDataDescriptor = 0;
static constexpr unsigned kPtrPosInDataDescriptor = 1;
static constexpr unsigned kSizePosInDataDescriptor = 2;
/// Helper class to produce LLVM dialect operations inserting
/// elements to a Data descriptor. Wraps a Value pointing to the descriptor.
/// The Value may be null, in which case none of the operations are valid.
///
/// The data descriptor holds information needed to perform data operations
/// and movments with the runtime.
/// `BasePointer`: base of the pointer being mapped.
/// `Pointer`: actual pointer of the data being mapped.
/// `Size`: size of the data being mapped.
///
/// Example:
///
/// ```c
/// struct S {
/// int x;
/// int y;
/// };
/// ```
///
/// Mapping `s.y` will result if the following information in the data
/// descriptor:
/// - `BasePointer`: address of `s`
/// - `Pointer`: address of `s.y`
/// - `Size`: size of `s.y`
///
/// For a scalar variable BasePointer and Pointer will be the same.
class DataDescriptor : public StructBuilder {
public:
/// Construct a helper for the given descriptor value.
explicit DataDescriptor(Value descriptor);
/// Builds IR creating an `undef` value of the descriptor type.
static DataDescriptor undef(OpBuilder &builder, Location loc, Type basePtrTy,
Type ptrTy);
static bool isValid(Value descriptor);
void setPointer(OpBuilder &builder, Location loc, Value ptr);
void setBasePointer(OpBuilder &builder, Location loc, Value basePtr);
void setSize(OpBuilder &builder, Location loc, Value size);
};
/// Collect the patterns to convert from the OpenACC dialect LLVMIR dialect.
void populateOpenACCToLLVMConversionPatterns(LLVMTypeConverter &converter,
RewritePatternSet &patterns);
/// Create a pass to convert the OpenACC dialect into the LLVMIR dialect.
std::unique_ptr<OperationPass<ModuleOp>> createConvertOpenACCToLLVMPass();
} // namespace mlir
#endif // MLIR_CONVERSION_OPENACCTOLLVM_CONVERTOPENACCTOLLVM_H