This patch is based on a previous PR https://reviews.llvm.org/D144657 that added alloca address space handling to MLIR's DataLayout and DLTI interface. This patch aims to add identical features to import and access the global and program memory space through MLIR's DataLayout/DLTI system.
120 lines
4.5 KiB
C++
120 lines
4.5 KiB
C++
//===- DataLayoutImporter.h - LLVM to MLIR data layout conversion -*- 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 implements the translation between the LLVMIR data layout and the
|
|
// corresponding MLIR representation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef MLIR_LIB_TARGET_LLVMIR_DATALAYOUTIMPORTER_H_
|
|
#define MLIR_LIB_TARGET_LLVMIR_DATALAYOUTIMPORTER_H_
|
|
|
|
#include "mlir/Dialect/LLVMIR/LLVMTypes.h"
|
|
#include "mlir/IR/BuiltinAttributes.h"
|
|
#include "mlir/Interfaces/DataLayoutInterfaces.h"
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
class DataLayout;
|
|
} // namespace llvm
|
|
|
|
namespace mlir {
|
|
class FloatType;
|
|
class MLIRContext;
|
|
class Operation;
|
|
|
|
namespace LLVM {
|
|
class LLVMFuncOp;
|
|
|
|
namespace detail {
|
|
|
|
/// Returns a supported MLIR floating point type of the given bit width or
|
|
/// null if the bit width is not supported.
|
|
FloatType getFloatType(MLIRContext *context, unsigned width);
|
|
|
|
/// Helper class that translates an LLVM data layout to an MLIR data layout
|
|
/// specification. Only integer, float, pointer, alloca memory space, stack
|
|
/// alignment, and endianness entries are translated. The class also returns all
|
|
/// entries from the default data layout specification found in the language
|
|
/// reference (https://llvm.org/docs/LangRef.html#data-layout) if they are not
|
|
/// overwritten by the provided data layout.
|
|
class DataLayoutImporter {
|
|
public:
|
|
DataLayoutImporter(MLIRContext *context,
|
|
const llvm::DataLayout &llvmDataLayout)
|
|
: context(context) {
|
|
translateDataLayout(llvmDataLayout);
|
|
}
|
|
|
|
/// Returns the MLIR data layout specification translated from the LLVM
|
|
/// data layout.
|
|
DataLayoutSpecInterface getDataLayout() const { return dataLayout; }
|
|
|
|
/// Returns the last data layout token that has been processed before
|
|
/// the data layout translation failed.
|
|
StringRef getLastToken() const { return lastToken; }
|
|
|
|
/// Returns the data layout tokens that have not been handled during the
|
|
/// data layout translation.
|
|
ArrayRef<StringRef> getUnhandledTokens() const { return unhandledTokens; }
|
|
|
|
private:
|
|
/// Translates the LLVM `dataLayout` to an MLIR data layout specification.
|
|
void translateDataLayout(const llvm::DataLayout &llvmDataLayout);
|
|
|
|
/// Tries to parse the letter only prefix that identifies the specification
|
|
/// and removes the consumed characters from the beginning of the string.
|
|
FailureOr<StringRef> tryToParseAlphaPrefix(StringRef &token) const;
|
|
|
|
/// Tries to parse an integer parameter and removes the integer from the
|
|
/// beginning of the string.
|
|
FailureOr<uint64_t> tryToParseInt(StringRef &token) const;
|
|
|
|
/// Tries to parse an integer parameter array.
|
|
FailureOr<SmallVector<uint64_t>> tryToParseIntList(StringRef token) const;
|
|
|
|
/// Tries to parse the parameters of a type alignment entry.
|
|
FailureOr<DenseIntElementsAttr> tryToParseAlignment(StringRef token) const;
|
|
|
|
/// Tries to parse the parameters of a pointer alignment entry.
|
|
FailureOr<DenseIntElementsAttr>
|
|
tryToParsePointerAlignment(StringRef token) const;
|
|
|
|
/// Adds a type alignment entry if there is none yet.
|
|
LogicalResult tryToEmplaceAlignmentEntry(Type type, StringRef token);
|
|
|
|
/// Adds a pointer alignment entry if there is none yet.
|
|
LogicalResult tryToEmplacePointerAlignmentEntry(LLVMPointerType type,
|
|
StringRef token);
|
|
|
|
/// Adds an endianness entry if there is none yet.
|
|
LogicalResult tryToEmplaceEndiannessEntry(StringRef endianness,
|
|
StringRef token);
|
|
|
|
/// Adds an alloca address space entry if there is none yet.
|
|
LogicalResult tryToEmplaceAddrSpaceEntry(StringRef token,
|
|
llvm::StringLiteral spaceKey);
|
|
|
|
/// Adds a stack alignment entry if there is none yet.
|
|
LogicalResult tryToEmplaceStackAlignmentEntry(StringRef token);
|
|
|
|
std::string layoutStr = {};
|
|
StringRef lastToken = {};
|
|
SmallVector<StringRef> unhandledTokens;
|
|
DenseMap<StringAttr, DataLayoutEntryInterface> keyEntries;
|
|
DenseMap<TypeAttr, DataLayoutEntryInterface> typeEntries;
|
|
MLIRContext *context;
|
|
DataLayoutSpecInterface dataLayout;
|
|
};
|
|
|
|
} // namespace detail
|
|
} // namespace LLVM
|
|
} // namespace mlir
|
|
|
|
#endif // MLIR_LIB_TARGET_LLVMIR_DATALAYOUTIMPORTER_H_
|