//===- DebugSupport.cpp -----------------------------------------*- 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 defines functions which generate more readable forms of data
//  structures used in the dataflow analyses, for debugging purposes.
//
//===----------------------------------------------------------------------===//

#include <utility>

#include "clang/Analysis/FlowSensitive/DebugSupport.h"
#include "clang/Analysis/FlowSensitive/Solver.h"
#include "clang/Analysis/FlowSensitive/Value.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ErrorHandling.h"

namespace clang {
namespace dataflow {

llvm::StringRef debugString(Value::Kind Kind) {
  switch (Kind) {
  case Value::Kind::Integer:
    return "Integer";
  case Value::Kind::Pointer:
    return "Pointer";
  case Value::Kind::Record:
    return "Record";
  case Value::Kind::AtomicBool:
    return "AtomicBool";
  case Value::Kind::TopBool:
    return "TopBool";
  case Value::Kind::FormulaBool:
    return "FormulaBool";
  }
  llvm_unreachable("Unhandled value kind");
}

llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
                              Solver::Result::Assignment Assignment) {
  switch (Assignment) {
  case Solver::Result::Assignment::AssignedFalse:
    return OS << "False";
  case Solver::Result::Assignment::AssignedTrue:
    return OS << "True";
  }
  llvm_unreachable("Booleans can only be assigned true/false");
}

llvm::StringRef debugString(Solver::Result::Status Status) {
  switch (Status) {
  case Solver::Result::Status::Satisfiable:
    return "Satisfiable";
  case Solver::Result::Status::Unsatisfiable:
    return "Unsatisfiable";
  case Solver::Result::Status::TimedOut:
    return "TimedOut";
  }
  llvm_unreachable("Unhandled SAT check result status");
}

llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Solver::Result &R) {
  OS << debugString(R.getStatus()) << "\n";
  if (auto Solution = R.getSolution()) {
    std::vector<std::pair<Atom, Solver::Result::Assignment>> Sorted = {
        Solution->begin(), Solution->end()};
    llvm::sort(Sorted);
    for (const auto &Entry : Sorted)
      OS << Entry.first << " = " << Entry.second << "\n";
  }
  return OS;
}

} // namespace dataflow
} // namespace clang
