//===- 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 #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> 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