//===- LLVMDialect.h - MLIR LLVM IR dialect ---------------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // This file defines the LLVM IR dialect in MLIR, containing LLVM operations and // LLVM type system. // //===----------------------------------------------------------------------===// #ifndef MLIR_DIALECT_LLVMIR_LLVMDIALECT_H_ #define MLIR_DIALECT_LLVMIR_LLVMDIALECT_H_ #include "mlir/Bytecode/BytecodeOpInterface.h" #include "mlir/Dialect/LLVMIR/LLVMAttrs.h" #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" #include "mlir/Dialect/LLVMIR/LLVMTypes.h" #include "mlir/IR/BuiltinOps.h" #include "mlir/IR/Dialect.h" #include "mlir/IR/OpDefinition.h" #include "mlir/IR/OpImplementation.h" #include "mlir/IR/TypeSupport.h" #include "mlir/IR/Types.h" #include "mlir/Interfaces/CallInterfaces.h" #include "mlir/Interfaces/ControlFlowInterfaces.h" #include "mlir/Interfaces/FunctionInterfaces.h" #include "mlir/Interfaces/InferTypeOpInterface.h" #include "mlir/Interfaces/SideEffectInterfaces.h" #include "mlir/Support/ThreadLocalCache.h" #include "llvm/ADT/PointerEmbeddedInt.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Type.h" namespace llvm { class Type; class LLVMContext; namespace sys { template <bool mt_only> class SmartMutex; } // namespace sys } // namespace llvm namespace mlir { namespace LLVM { class LLVMDialect; namespace detail { struct LLVMTypeStorage; struct LLVMDialectImpl; } // namespace detail } // namespace LLVM } // namespace mlir namespace mlir { namespace LLVM { template <typename Values> class GEPIndicesAdaptor; /// Bit-width of a 'GEPConstantIndex' within GEPArg. constexpr int kGEPConstantBitWidth = …; /// Wrapper around a int32_t for use in a PointerUnion. GEPConstantIndex; /// Class used for building a 'llvm.getelementptr'. A single instance represents /// a sum type that is either a 'Value' or a constant 'GEPConstantIndex' index. /// The former represents a dynamic index in a GEP operation, while the later is /// a constant index as is required for indices into struct types. class GEPArg : public PointerUnion<Value, GEPConstantIndex> { … }; } // namespace LLVM } // namespace mlir ///// Ops ///// #define GET_OP_CLASSES #include "mlir/Dialect/LLVMIR/LLVMOps.h.inc" #define GET_OP_CLASSES #include "mlir/Dialect/LLVMIR/LLVMIntrinsicOps.h.inc" #include "mlir/Dialect/LLVMIR/LLVMOpsDialect.h.inc" namespace mlir { namespace LLVM { /// Class used for convenient access and iteration over GEP indices. /// This class is templated to support not only retrieving the dynamic operands /// of a GEP operation, but also as an adaptor during folding or conversion to /// LLVM IR. /// /// GEP indices may either be constant indices or dynamic indices. The /// 'rawConstantIndices' is specially encoded by GEPOp and contains either the /// constant index or the information that an index is a dynamic index. /// /// When an access to such an index is made it is done through the /// 'DynamicRange' of this class. This way it can be used as getter in GEPOp via /// 'GEPIndicesAdaptor<ValueRange>' or during folding via /// 'GEPIndicesAdaptor<ArrayRef<Attribute>>'. template <typename DynamicRange> class GEPIndicesAdaptor { … }; /// Create an LLVM global containing the string "value" at the module containing /// surrounding the insertion point of builder. Obtain the address of that /// global and use it to compute the address of the first character in the /// string (operations inserted at the builder insertion point). Value createGlobalString(Location loc, OpBuilder &builder, StringRef name, StringRef value, Linkage linkage); /// LLVM requires some operations to be inside of a Module operation. This /// function confirms that the Operation has the desired properties. bool satisfiesLLVMModule(Operation *op); /// Convert an array of integer attributes to a vector of integers that can be /// used as indices in LLVM operations. template <typename IntT = int64_t> SmallVector<IntT> convertArrayToIndices(ArrayRef<Attribute> attrs) { … } /// Convert an `ArrayAttr` of integer attributes to a vector of integers that /// can be used as indices in LLVM operations. template <typename IntT = int64_t> SmallVector<IntT> convertArrayToIndices(ArrayAttr attrs) { … } } // namespace LLVM } // namespace mlir namespace llvm { // Allow llvm::cast style functions. CastInfo<To, mlir::LLVM::GEPArg>; CastInfo<To, const mlir::LLVM::GEPArg>; } // namespace llvm #endif // MLIR_DIALECT_LLVMIR_LLVMDIALECT_H_