//===--- CodeGenHwModes.cpp -----------------------------------------------===//
//
// 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
//===----------------------------------------------------------------------===//

#include "CodeGenHwModes.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"

using namespace llvm;

StringRef CodeGenHwModes::DefaultModeName = "DefaultMode";

HwMode::HwMode(Record *R) {
  Name = R->getName();
  Features = R->getValueAsString("Features");
}

LLVM_DUMP_METHOD
void HwMode::dump() const {
  dbgs() << Name << ": " << Features << '\n';
}

HwModeSelect::HwModeSelect(Record *R, CodeGenHwModes &CGH) {
  std::vector<Record*> Modes = R->getValueAsListOfDefs("Modes");
  std::vector<Record*> Objects = R->getValueAsListOfDefs("Objects");
  if (Modes.size() != Objects.size()) {
    PrintError(R->getLoc(), "in record " + R->getName() +
        " derived from HwModeSelect: the lists Modes and Objects should "
        "have the same size");
    report_fatal_error("error in target description.");
  }
  for (unsigned i = 0, e = Modes.size(); i != e; ++i) {
    unsigned ModeId = CGH.getHwModeId(Modes[i]->getName());
    Items.push_back(std::make_pair(ModeId, Objects[i]));
  }
}

LLVM_DUMP_METHOD
void HwModeSelect::dump() const {
  dbgs() << '{';
  for (const PairType &P : Items)
    dbgs() << " (" << P.first << ',' << P.second->getName() << ')';
  dbgs() << " }\n";
}

CodeGenHwModes::CodeGenHwModes(RecordKeeper &RK) : Records(RK) {
  std::vector<Record*> MRs = Records.getAllDerivedDefinitions("HwMode");
  // The default mode needs a definition in the .td sources for TableGen
  // to accept references to it. We need to ignore the definition here.
  for (auto I = MRs.begin(), E = MRs.end(); I != E; ++I) {
    if ((*I)->getName() != DefaultModeName)
      continue;
    MRs.erase(I);
    break;
  }

  for (Record *R : MRs) {
    Modes.emplace_back(R);
    unsigned NewId = Modes.size();
    ModeIds.insert(std::make_pair(Modes[NewId-1].Name, NewId));
  }

  std::vector<Record*> MSs = Records.getAllDerivedDefinitions("HwModeSelect");
  for (Record *R : MSs) {
    auto P = ModeSelects.emplace(std::make_pair(R, HwModeSelect(R, *this)));
    assert(P.second);
    (void)P;
  }
}

unsigned CodeGenHwModes::getHwModeId(StringRef Name) const {
  if (Name == DefaultModeName)
    return DefaultMode;
  auto F = ModeIds.find(Name);
  assert(F != ModeIds.end() && "Unknown mode name");
  return F->second;
}

const HwModeSelect &CodeGenHwModes::getHwModeSelect(Record *R) const {
  auto F = ModeSelects.find(R);
  assert(F != ModeSelects.end() && "Record is not a \"mode select\"");
  return F->second;
}

LLVM_DUMP_METHOD
void CodeGenHwModes::dump() const {
  dbgs() << "Modes: {\n";
  for (const HwMode &M : Modes) {
    dbgs() << "  ";
    M.dump();
  }
  dbgs() << "}\n";

  dbgs() << "ModeIds: {\n";
  for (const auto &P : ModeIds)
    dbgs() << "  " << P.first() << " -> " << P.second << '\n';
  dbgs() << "}\n";

  dbgs() << "ModeSelects: {\n";
  for (const auto &P : ModeSelects) {
    dbgs() << "  " << P.first->getName() << " -> ";
    P.second.dump();
  }
  dbgs() << "}\n";
}
