Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/Analysis/FlowSensitive/DebugSupport.cpp
35266 views
1
//===- DebugSupport.cpp -----------------------------------------*- C++ -*-===//
2
//
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
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file defines functions which generate more readable forms of data
10
// structures used in the dataflow analyses, for debugging purposes.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#include <utility>
15
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"
21
22
namespace clang {
23
namespace dataflow {
24
25
llvm::StringRef debugString(Value::Kind Kind) {
26
switch (Kind) {
27
case Value::Kind::Integer:
28
return "Integer";
29
case Value::Kind::Pointer:
30
return "Pointer";
31
case Value::Kind::AtomicBool:
32
return "AtomicBool";
33
case Value::Kind::TopBool:
34
return "TopBool";
35
case Value::Kind::FormulaBool:
36
return "FormulaBool";
37
}
38
llvm_unreachable("Unhandled value kind");
39
}
40
41
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
42
Solver::Result::Assignment Assignment) {
43
switch (Assignment) {
44
case Solver::Result::Assignment::AssignedFalse:
45
return OS << "False";
46
case Solver::Result::Assignment::AssignedTrue:
47
return OS << "True";
48
}
49
llvm_unreachable("Booleans can only be assigned true/false");
50
}
51
52
llvm::StringRef debugString(Solver::Result::Status Status) {
53
switch (Status) {
54
case Solver::Result::Status::Satisfiable:
55
return "Satisfiable";
56
case Solver::Result::Status::Unsatisfiable:
57
return "Unsatisfiable";
58
case Solver::Result::Status::TimedOut:
59
return "TimedOut";
60
}
61
llvm_unreachable("Unhandled SAT check result status");
62
}
63
64
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Solver::Result &R) {
65
OS << debugString(R.getStatus()) << "\n";
66
if (auto Solution = R.getSolution()) {
67
std::vector<std::pair<Atom, Solver::Result::Assignment>> Sorted = {
68
Solution->begin(), Solution->end()};
69
llvm::sort(Sorted);
70
for (const auto &Entry : Sorted)
71
OS << Entry.first << " = " << Entry.second << "\n";
72
}
73
return OS;
74
}
75
76
} // namespace dataflow
77
} // namespace clang
78
79