119 lines
4.5 KiB
C++
119 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_
|