Files
clang-p2996/mlir/lib/AsmParser/ParserState.h
Tobias Gysi 728a8d5a81 [mlir] Add a builtin distinct attribute
A distinct attribute associates a referenced attribute with a unique
identifier. Every call to its create function allocates a new
distinct attribute instance. The address of the attribute instance
temporarily serves as its unique identifier. Similar to the names
of SSA values, the final unique identifiers are generated during
pretty printing.

Examples:
 #distinct = distinct[0]<42.0 : f32>
 #distinct1 = distinct[1]<42.0 : f32>
 #distinct2 = distinct[2]<array<i32: 10, 42>>

This mechanism is meant to generate attributes with a unique
identifier, which can be used to mark groups of operations
that share a common properties such as if they are aliasing.

The design of the distinct attribute ensures minimal memory
footprint per distinct attribute since it only contains a reference
to another attribute. All distinct attributes are stored outside of
the storage uniquer in a thread local store that is part of the
context. It uses one bump pointer allocator per thread to ensure
distinct attributes can be created in-parallel.

Reviewed By: rriddle, Dinistro, zero9178

Differential Revision: https://reviews.llvm.org/D153360
2023-07-11 07:33:16 +00:00

92 lines
3.3 KiB
C++

//===- ParserState.h - MLIR ParserState -------------------------*- 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
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_LIB_ASMPARSER_PARSERSTATE_H
#define MLIR_LIB_ASMPARSER_PARSERSTATE_H
#include "Lexer.h"
#include "mlir/IR/Attributes.h"
#include "mlir/IR/OpImplementation.h"
#include "llvm/ADT/StringMap.h"
namespace mlir {
class OpAsmDialectInterface;
namespace detail {
//===----------------------------------------------------------------------===//
// SymbolState
//===----------------------------------------------------------------------===//
/// This class contains record of any parsed top-level symbols.
struct SymbolState {
/// A map from attribute alias identifier to Attribute.
llvm::StringMap<Attribute> attributeAliasDefinitions;
/// A map from type alias identifier to Type.
llvm::StringMap<Type> typeAliasDefinitions;
/// A map of dialect resource keys to the resolved resource name and handle
/// to use during parsing.
DenseMap<const OpAsmDialectInterface *,
llvm::StringMap<std::pair<std::string, AsmDialectResourceHandle>>>
dialectResources;
/// A map from unique integer identifier to DistinctAttr.
DenseMap<uint64_t, DistinctAttr> distinctAttributes;
};
//===----------------------------------------------------------------------===//
// ParserState
//===----------------------------------------------------------------------===//
/// This class refers to all of the state maintained globally by the parser,
/// such as the current lexer position etc.
struct ParserState {
ParserState(const llvm::SourceMgr &sourceMgr, const ParserConfig &config,
SymbolState &symbols, AsmParserState *asmState,
AsmParserCodeCompleteContext *codeCompleteContext)
: config(config),
lex(sourceMgr, config.getContext(), codeCompleteContext),
curToken(lex.lexToken()), symbols(symbols), asmState(asmState),
codeCompleteContext(codeCompleteContext) {}
ParserState(const ParserState &) = delete;
void operator=(const ParserState &) = delete;
/// The configuration used to setup the parser.
const ParserConfig &config;
/// The lexer for the source file we're parsing.
Lexer lex;
/// This is the next token that hasn't been consumed yet.
Token curToken;
/// The current state for symbol parsing.
SymbolState &symbols;
/// An optional pointer to a struct containing high level parser state to be
/// populated during parsing.
AsmParserState *asmState;
/// An optional code completion context.
AsmParserCodeCompleteContext *codeCompleteContext;
// Contains the stack of default dialect to use when parsing regions.
// A new dialect get pushed to the stack before parsing regions nested
// under an operation implementing `OpAsmOpInterface`, and
// popped when done. At the top-level we start with "builtin" as the
// default, so that the top-level `module` operation parses as-is.
SmallVector<StringRef> defaultDialectStack{"builtin"};
};
} // namespace detail
} // namespace mlir
#endif // MLIR_LIB_ASMPARSER_PARSERSTATE_H