[PATCH] D103967: [Analyzer][solver] Add dump methods for (dis)equality classes.
Gabor Marton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 9 08:06:25 PDT 2021
martong created this revision.
martong added reviewers: vsavchenko, NoQ, steakhal.
Herald added subscribers: manas, ASDenysPetrov, gamesh411, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware, xazax.hun, whisperity.
Herald added a reviewer: Szelethus.
martong requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
This proved to be very useful during debugging.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D103967
Files:
clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
Index: clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
+++ clang/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
@@ -584,6 +584,11 @@
LLVM_NODISCARD static inline Optional<bool>
areEqual(ProgramStateRef State, SymbolRef First, SymbolRef Second);
+ void dumpToStream(ProgramStateRef State, raw_ostream &os) const;
+ LLVM_DUMP_METHOD void dump(ProgramStateRef State) const {
+ dumpToStream(State, llvm::errs());
+ }
+
/// Check equivalence data for consistency.
LLVM_NODISCARD LLVM_ATTRIBUTE_UNUSED static bool
isClassDataConsistent(ProgramStateRef State);
@@ -644,6 +649,46 @@
// Constraint functions
//===----------------------------------------------------------------------===//
+/// Dump all equivalence classes.
+LLVM_DUMP_METHOD static void dumpEqToStream(ProgramStateRef State,
+ raw_ostream &os) {
+ ClassMembersTy Members = State->get<ClassMembers>();
+ for (std::pair<EquivalenceClass, SymbolSet> ClassToSymbolSet : Members) {
+ EquivalenceClass Class = ClassToSymbolSet.first;
+ Class.dumpToStream(State, os);
+ os << "\n";
+ }
+}
+LLVM_DUMP_METHOD static void dumpEq(ProgramStateRef State) {
+ dumpEqToStream(State, llvm::errs());
+}
+
+/// Dump all equivalence classes along with their disequivalent classes if they
+/// have any.
+LLVM_DUMP_METHOD static void dumpDisEqToStream(ProgramStateRef State,
+ raw_ostream &os) {
+ DisequalityMapTy Disequalities = State->get<DisequalityMap>();
+ for (std::pair<EquivalenceClass, ClassSet> ClassToDisEqSet : Disequalities) {
+ EquivalenceClass Class = ClassToDisEqSet.first;
+ Class.dumpToStream(State, os);
+ ClassSet DisequalClasses = ClassToDisEqSet.second;
+ if (!DisequalClasses.isEmpty()) {
+ for (EquivalenceClass DisEqClass : DisequalClasses) {
+ os << "DisequalTo:\n";
+ DisEqClass.dumpToStream(State, os);
+ }
+ }
+ os << "\n";
+ }
+}
+LLVM_DUMP_METHOD static void dumpDisEq(ProgramStateRef State) {
+ dumpDisEqToStream(State, llvm::errs());
+}
+
+//===----------------------------------------------------------------------===//
+// Constraint functions
+//===----------------------------------------------------------------------===//
+
LLVM_NODISCARD LLVM_ATTRIBUTE_UNUSED bool
areFeasible(ConstraintRangeTy Constraints) {
return llvm::none_of(
@@ -1589,6 +1634,15 @@
// EqualityClass implementation details
//===----------------------------------------------------------------------===//
+LLVM_DUMP_METHOD void EquivalenceClass::dumpToStream(ProgramStateRef State,
+ raw_ostream &os) const {
+ SymbolSet ClassMembers = getClassMembers(State);
+ for (const SymbolRef &MemberSym : ClassMembers) {
+ MemberSym->dump();
+ os << "\n";
+ }
+}
+
inline EquivalenceClass EquivalenceClass::find(ProgramStateRef State,
SymbolRef Sym) {
// We store far from all Symbol -> Class mappings
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103967.350904.patch
Type: text/x-patch
Size: 3258 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210609/22d9ff51/attachment-0001.bin>
More information about the cfe-commits
mailing list