//===--- 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/StringMap.h"
#include <cassert>
#include <map>
#include <string>
#include <vector>

// HwModeId -> list of predicates (definition)

namespace llvm {
  class Record;
  class RecordKeeper;

  struct CodeGenHwModes;

  struct HwMode {
    HwMode(Record *R);
    StringRef Name;
    std::string Features;
    void dump() const;
  };

  struct HwModeSelect {
    HwModeSelect(Record *R, CodeGenHwModes &CGH);
    typedef std::pair<unsigned, Record*> PairType;
    std::vector<PairType> Items;
    void dump() const;
  };

  struct CodeGenHwModes {
    enum : unsigned { DefaultMode = 0 };
    static StringRef DefaultModeName;

    CodeGenHwModes(RecordKeeper &R);
    unsigned getHwModeId(StringRef Name) const;
    const HwMode &getMode(unsigned Id) const {
      assert(Id != 0 && "Mode id of 0 is reserved for the default mode");
      return Modes[Id-1];
    }
    const HwModeSelect &getHwModeSelect(Record *R) const;
    unsigned getNumModeIds() const { return Modes.size()+1; }
    void dump() const;

  private:
    RecordKeeper &Records;
    StringMap<unsigned> ModeIds;  // HwMode (string) -> HwModeId
    std::vector<HwMode> Modes;
    std::map<Record*,HwModeSelect> ModeSelects;
  };
}

#endif // LLVM_UTILS_TABLEGEN_CODEGENHWMODES_H
