xref: /llvm-project/clang/lib/Analysis/FlowSensitive/DebugSupport.cpp (revision e8fce95887ecfd87a83db8dbb0cc55966b004d6f)
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 Tee llvm::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 McCall llvm::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 Tee llvm::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 McCall llvm::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