1 //===-- DebugSupport.h ------------------------------------------*- 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 #ifndef LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_DEBUGSUPPORT_H_
15 #define LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_DEBUGSUPPORT_H_
16 
17 #include <string>
18 #include <vector>
19 
20 #include "clang/Analysis/FlowSensitive/Solver.h"
21 #include "clang/Analysis/FlowSensitive/Value.h"
22 #include "llvm/ADT/DenseMap.h"
23 #include "llvm/ADT/StringRef.h"
24 
25 namespace clang {
26 namespace dataflow {
27 
28 /// Returns a string representation of a value kind.
29 llvm::StringRef debugString(Value::Kind Kind);
30 
31 /// Returns a string representation of a boolean assignment to true or false.
32 llvm::StringRef debugString(Solver::Result::Assignment Assignment);
33 
34 /// Returns a string representation of the result status of a SAT check.
35 llvm::StringRef debugString(Solver::Result::Status Status);
36 
37 /// Returns a string representation for the boolean value `B`.
38 ///
39 /// Atomic booleans appearing in the boolean value `B` are assigned to labels
40 /// either specified in `AtomNames` or created by default rules as B0, B1, ...
41 ///
42 /// Requirements:
43 ///
44 ///   Names assigned to atoms should not be repeated in `AtomNames`.
45 std::string debugString(
46     const BoolValue &B,
47     llvm::DenseMap<const AtomicBoolValue *, std::string> AtomNames = {{}});
48 
49 /// Returns a string representation for `Constraints` - a collection of boolean
50 /// formulas.
51 ///
52 /// Atomic booleans appearing in the boolean value `Constraints` are assigned to
53 /// labels either specified in `AtomNames` or created by default rules as B0,
54 /// B1, ...
55 ///
56 /// Requirements:
57 ///
58 ///   Names assigned to atoms should not be repeated in `AtomNames`.
59 std::string debugString(
60     const llvm::DenseSet<BoolValue *> &Constraints,
61     llvm::DenseMap<const AtomicBoolValue *, std::string> AtomNames = {{}});
62 
63 /// Returns a string representation for `Constraints` - a collection of boolean
64 /// formulas and the `Result` of satisfiability checking.
65 ///
66 /// Atomic booleans appearing in `Constraints` and `Result` are assigned to
67 /// labels either specified in `AtomNames` or created by default rules as B0,
68 /// B1, ...
69 ///
70 /// Requirements:
71 ///
72 ///   Names assigned to atoms should not be repeated in `AtomNames`.
73 std::string debugString(
74     ArrayRef<BoolValue *> Constraints, const Solver::Result &Result,
75     llvm::DenseMap<const AtomicBoolValue *, std::string> AtomNames = {{}});
76 inline std::string debugString(
77     const llvm::DenseSet<BoolValue *> &Constraints,
78     const Solver::Result &Result,
79     llvm::DenseMap<const AtomicBoolValue *, std::string> AtomNames = {{}}) {
80   std::vector<BoolValue *> ConstraintsVec(Constraints.begin(),
81                                           Constraints.end());
82   return debugString(ConstraintsVec, Result, std::move(AtomNames));
83 }
84 
85 } // namespace dataflow
86 } // namespace clang
87 
88 #endif // LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_DEBUGSUPPORT_H_
89