1c9666d23SWei Yi Tee //===- DebugSupport.cpp -----------------------------------------*- C++ -*-===// 2c9666d23SWei Yi Tee // 3c9666d23SWei Yi Tee // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4c9666d23SWei Yi Tee // See https://llvm.org/LICENSE.txt for license information. 5c9666d23SWei Yi Tee // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c9666d23SWei Yi Tee // 7c9666d23SWei Yi Tee //===----------------------------------------------------------------------===// 8c9666d23SWei Yi Tee // 9c9666d23SWei Yi Tee // This file defines functions which generate more readable forms of data 10c9666d23SWei Yi Tee // structures used in the dataflow analyses, for debugging purposes. 11c9666d23SWei Yi Tee // 12c9666d23SWei Yi Tee //===----------------------------------------------------------------------===// 13c9666d23SWei Yi Tee 14b8d83e80SWei Yi Tee #include <utility> 15b8d83e80SWei Yi Tee 16c9666d23SWei Yi Tee #include "clang/Analysis/FlowSensitive/DebugSupport.h" 17b8d83e80SWei Yi Tee #include "clang/Analysis/FlowSensitive/Solver.h" 18c9666d23SWei Yi Tee #include "clang/Analysis/FlowSensitive/Value.h" 19dbb95c2aSWei Yi Tee #include "llvm/ADT/StringRef.h" 20c9666d23SWei Yi Tee #include "llvm/Support/ErrorHandling.h" 21c9666d23SWei Yi Tee 22c9666d23SWei Yi Tee namespace clang { 23c9666d23SWei Yi Tee namespace dataflow { 24c9666d23SWei Yi Tee debugString(Value::Kind Kind)25dbb95c2aSWei Yi Teellvm::StringRef debugString(Value::Kind Kind) { 26dbb95c2aSWei Yi Tee switch (Kind) { 27dbb95c2aSWei Yi Tee case Value::Kind::Integer: 28dbb95c2aSWei Yi Tee return "Integer"; 29dbb95c2aSWei Yi Tee case Value::Kind::Pointer: 30dbb95c2aSWei Yi Tee return "Pointer"; 31dbb95c2aSWei Yi Tee case Value::Kind::AtomicBool: 32dbb95c2aSWei Yi Tee return "AtomicBool"; 3339b9d4f1SYitzhak Mandelbaum case Value::Kind::TopBool: 3439b9d4f1SYitzhak Mandelbaum return "TopBool"; 35*fc9821a8SSam McCall case Value::Kind::FormulaBool: 36*fc9821a8SSam McCall return "FormulaBool"; 37dbb95c2aSWei Yi Tee } 38dbb95c2aSWei Yi Tee llvm_unreachable("Unhandled value kind"); 39dbb95c2aSWei Yi Tee } 40dbb95c2aSWei Yi Tee operator <<(llvm::raw_ostream & OS,Solver::Result::Assignment Assignment)41*fc9821a8SSam McCallllvm::raw_ostream &operator<<(llvm::raw_ostream &OS, 42*fc9821a8SSam McCall Solver::Result::Assignment Assignment) { 43ee6aba85SDmitri Gribenko switch (Assignment) { 44ee6aba85SDmitri Gribenko case Solver::Result::Assignment::AssignedFalse: 45*fc9821a8SSam McCall return OS << "False"; 46ee6aba85SDmitri Gribenko case Solver::Result::Assignment::AssignedTrue: 47*fc9821a8SSam McCall return OS << "True"; 48ee6aba85SDmitri Gribenko } 49ee6aba85SDmitri Gribenko llvm_unreachable("Booleans can only be assigned true/false"); 50ee6aba85SDmitri Gribenko } 51ee6aba85SDmitri Gribenko debugString(Solver::Result::Status Status)52dbb95c2aSWei Yi Teellvm::StringRef debugString(Solver::Result::Status Status) { 53ee6aba85SDmitri Gribenko switch (Status) { 54ee6aba85SDmitri Gribenko case Solver::Result::Status::Satisfiable: 55ee6aba85SDmitri Gribenko return "Satisfiable"; 56ee6aba85SDmitri Gribenko case Solver::Result::Status::Unsatisfiable: 57ee6aba85SDmitri Gribenko return "Unsatisfiable"; 58ee6aba85SDmitri Gribenko case Solver::Result::Status::TimedOut: 59ee6aba85SDmitri Gribenko return "TimedOut"; 60ee6aba85SDmitri Gribenko } 61ee6aba85SDmitri Gribenko llvm_unreachable("Unhandled SAT check result status"); 62ee6aba85SDmitri Gribenko } 63ee6aba85SDmitri Gribenko operator <<(llvm::raw_ostream & OS,const Solver::Result & R)64*fc9821a8SSam McCallllvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Solver::Result &R) { 65*fc9821a8SSam McCall OS << debugString(R.getStatus()) << "\n"; 66*fc9821a8SSam McCall if (auto Solution = R.getSolution()) { 67*fc9821a8SSam McCall std::vector<std::pair<Atom, Solver::Result::Assignment>> Sorted = { 68*fc9821a8SSam McCall Solution->begin(), Solution->end()}; 69*fc9821a8SSam McCall llvm::sort(Sorted); 70*fc9821a8SSam McCall for (const auto &Entry : Sorted) 71*fc9821a8SSam McCall OS << Entry.first << " = " << Entry.second << "\n"; 72c9666d23SWei Yi Tee } 73*fc9821a8SSam McCall return OS; 74b8d83e80SWei Yi Tee } 75b8d83e80SWei Yi Tee 76c9666d23SWei Yi Tee } // namespace dataflow 77c9666d23SWei Yi Tee } // namespace clang 78