//===--- CodeGenHwModes.h ---------------------------------------*- 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 // //===----------------------------------------------------------------------===// // Classes to parse and store HW mode information for instruction selection. //===----------------------------------------------------------------------===// #ifndef LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H #define LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringRef.h" #include #include #include #include #include // HwModeId -> list of predicates (definition) namespace llvm { class Record; class RecordKeeper; struct CodeGenHwModes; struct HwMode { HwMode(Record *R); StringRef Name; std::string Features; std::string Predicates; void dump() const; }; struct HwModeSelect { HwModeSelect(Record *R, CodeGenHwModes &CGH); typedef std::pair PairType; std::vector Items; void dump() const; }; struct CodeGenHwModes { enum : unsigned { DefaultMode = 0 }; static StringRef DefaultModeName; CodeGenHwModes(RecordKeeper &R); unsigned getHwModeId(Record *R) const; const HwMode &getMode(unsigned Id) const { assert(Id != 0 && "Mode id of 0 is reserved for the default mode"); return Modes[Id - 1]; } StringRef getModeName(unsigned Id, bool IncludeDefault = false) const { if (IncludeDefault && Id == CodeGenHwModes::DefaultMode) return DefaultModeName; return getMode(Id).Name; } const HwModeSelect &getHwModeSelect(Record *R) const; const std::map &getHwModeSelects() const { return ModeSelects; } unsigned getNumModeIds() const { return Modes.size() + 1; } void dump() const; private: RecordKeeper &Records; DenseMap ModeIds; // HwMode Record -> HwModeId std::vector Modes; std::map ModeSelects; }; } // namespace llvm #endif // LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H