1 //===- DebugSupport.cpp -----------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file defines functions which generate more readable forms of data
10 // structures used in the dataflow analyses, for debugging purposes.
12 //===----------------------------------------------------------------------===//
16 #include "clang/Analysis/FlowSensitive/DebugSupport.h"
17 #include "clang/Analysis/FlowSensitive/Solver.h"
18 #include "clang/Analysis/FlowSensitive/Value.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/Support/ErrorHandling.h"
25 llvm::StringRef
debugString(Value::Kind Kind
) {
27 case Value::Kind::Integer
:
29 case Value::Kind::Pointer
:
31 case Value::Kind::Record
:
33 case Value::Kind::AtomicBool
:
35 case Value::Kind::TopBool
:
37 case Value::Kind::FormulaBool
:
40 llvm_unreachable("Unhandled value kind");
43 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
,
44 Solver::Result::Assignment Assignment
) {
46 case Solver::Result::Assignment::AssignedFalse
:
48 case Solver::Result::Assignment::AssignedTrue
:
51 llvm_unreachable("Booleans can only be assigned true/false");
54 llvm::StringRef
debugString(Solver::Result::Status Status
) {
56 case Solver::Result::Status::Satisfiable
:
58 case Solver::Result::Status::Unsatisfiable
:
59 return "Unsatisfiable";
60 case Solver::Result::Status::TimedOut
:
63 llvm_unreachable("Unhandled SAT check result status");
66 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, const Solver::Result
&R
) {
67 OS
<< debugString(R
.getStatus()) << "\n";
68 if (auto Solution
= R
.getSolution()) {
69 std::vector
<std::pair
<Atom
, Solver::Result::Assignment
>> Sorted
= {
70 Solution
->begin(), Solution
->end()};
72 for (const auto &Entry
: Sorted
)
73 OS
<< Entry
.first
<< " = " << Entry
.second
<< "\n";
78 } // namespace dataflow