@@ -594,6 +594,11 @@ class EquivalenceClass : public llvm::FoldingSetNode {
594
594
RangeSet::Factory &F,
595
595
ProgramStateRef State);
596
596
597
+ void dumpToStream (ProgramStateRef State, raw_ostream &os) const ;
598
+ LLVM_DUMP_METHOD void dump (ProgramStateRef State) const {
599
+ dumpToStream (State, llvm::errs ());
600
+ }
601
+
597
602
// / Check equivalence data for consistency.
598
603
LLVM_NODISCARD LLVM_ATTRIBUTE_UNUSED static bool
599
604
isClassDataConsistent (ProgramStateRef State);
@@ -1414,6 +1419,17 @@ class RangeConstraintManager : public RangedConstraintManager {
1414
1419
1415
1420
void printJson (raw_ostream &Out, ProgramStateRef State, const char *NL = " \n " ,
1416
1421
unsigned int Space = 0 , bool IsDot = false ) const override ;
1422
+ void printConstraints (raw_ostream &Out, ProgramStateRef State,
1423
+ const char *NL = " \n " , unsigned int Space = 0 ,
1424
+ bool IsDot = false ) const ;
1425
+ void printEquivalenceClasses (raw_ostream &Out, ProgramStateRef State,
1426
+ const char *NL = " \n " , unsigned int Space = 0 ,
1427
+ bool IsDot = false ) const ;
1428
+ void printEquivalenceClass (raw_ostream &Out, ProgramStateRef State,
1429
+ EquivalenceClass Class) const ;
1430
+ void printDisequalities (raw_ostream &Out, ProgramStateRef State,
1431
+ const char *NL = " \n " , unsigned int Space = 0 ,
1432
+ bool IsDot = false ) const ;
1417
1433
1418
1434
// ===------------------------------------------------------------------===//
1419
1435
// Implementation for interface from RangedConstraintManager.
@@ -1637,6 +1653,15 @@ ConstraintMap ento::getConstraintMap(ProgramStateRef State) {
1637
1653
// EqualityClass implementation details
1638
1654
// ===----------------------------------------------------------------------===//
1639
1655
1656
+ LLVM_DUMP_METHOD void EquivalenceClass::dumpToStream (ProgramStateRef State,
1657
+ raw_ostream &os) const {
1658
+ SymbolSet ClassMembers = getClassMembers (State);
1659
+ for (const SymbolRef &MemberSym : ClassMembers) {
1660
+ MemberSym->dump ();
1661
+ os << " \n " ;
1662
+ }
1663
+ }
1664
+
1640
1665
inline EquivalenceClass EquivalenceClass::find (ProgramStateRef State,
1641
1666
SymbolRef Sym) {
1642
1667
assert (State && " State should not be null" );
@@ -2483,6 +2508,16 @@ ProgramStateRef RangeConstraintManager::assumeSymOutsideInclusiveRange(
2483
2508
void RangeConstraintManager::printJson (raw_ostream &Out, ProgramStateRef State,
2484
2509
const char *NL, unsigned int Space,
2485
2510
bool IsDot) const {
2511
+ printConstraints (Out, State, NL, Space, IsDot);
2512
+ printEquivalenceClasses (Out, State, NL, Space, IsDot);
2513
+ printDisequalities (Out, State, NL, Space, IsDot);
2514
+ }
2515
+
2516
+ void RangeConstraintManager::printConstraints (raw_ostream &Out,
2517
+ ProgramStateRef State,
2518
+ const char *NL,
2519
+ unsigned int Space,
2520
+ bool IsDot) const {
2486
2521
ConstraintRangeTy Constraints = State->get <ConstraintRange>();
2487
2522
2488
2523
Indent (Out, Space, IsDot) << " \" constraints\" : " ;
@@ -2516,3 +2551,106 @@ void RangeConstraintManager::printJson(raw_ostream &Out, ProgramStateRef State,
2516
2551
--Space;
2517
2552
Indent (Out, Space, IsDot) << " ]," << NL;
2518
2553
}
2554
+
2555
+ void RangeConstraintManager::printEquivalenceClass (
2556
+ raw_ostream &Out, ProgramStateRef State, EquivalenceClass Class) const {
2557
+ bool FirstMember = true ;
2558
+ SymbolSet ClassMembers = Class.getClassMembers (State);
2559
+ Out << " [ " ;
2560
+ for (SymbolRef ClassMember : ClassMembers) {
2561
+ if (FirstMember)
2562
+ FirstMember = false ;
2563
+ else
2564
+ Out << " , " ;
2565
+ Out << " \" " << ClassMember << " \" " ;
2566
+ }
2567
+ Out << " ]" ;
2568
+ }
2569
+
2570
+ void RangeConstraintManager::printEquivalenceClasses (raw_ostream &Out,
2571
+ ProgramStateRef State,
2572
+ const char *NL,
2573
+ unsigned int Space,
2574
+ bool IsDot) const {
2575
+ ClassMembersTy Members = State->get <ClassMembers>();
2576
+
2577
+ Indent (Out, Space, IsDot) << " \" equivalence_classes\" : " ;
2578
+ if (Members.isEmpty ()) {
2579
+ Out << " null," << NL;
2580
+ return ;
2581
+ }
2582
+
2583
+ ++Space;
2584
+ Out << ' [' << NL;
2585
+ bool FirstClass = true ;
2586
+ for (std::pair<EquivalenceClass, SymbolSet> ClassToSymbolSet : Members) {
2587
+ EquivalenceClass Class = ClassToSymbolSet.first ;
2588
+
2589
+ if (FirstClass) {
2590
+ FirstClass = false ;
2591
+ } else {
2592
+ Out << ' ,' ;
2593
+ Out << NL;
2594
+ }
2595
+ Indent (Out, Space, IsDot);
2596
+ printEquivalenceClass (Out, State, Class);
2597
+ }
2598
+ Out << NL;
2599
+
2600
+ --Space;
2601
+ Indent (Out, Space, IsDot) << " ]," << NL;
2602
+ }
2603
+
2604
+ void RangeConstraintManager::printDisequalities (raw_ostream &Out,
2605
+ ProgramStateRef State,
2606
+ const char *NL,
2607
+ unsigned int Space,
2608
+ bool IsDot) const {
2609
+ DisequalityMapTy Disequalities = State->get <DisequalityMap>();
2610
+
2611
+ Indent (Out, Space, IsDot) << " \" disequality_info\" : " ;
2612
+ if (Disequalities.isEmpty ()) {
2613
+ Out << " null," << NL;
2614
+ return ;
2615
+ }
2616
+
2617
+ ++Space;
2618
+ Out << ' [' << NL;
2619
+ bool FirstClass = true ;
2620
+ for (std::pair<EquivalenceClass, ClassSet> ClassToDisEqSet : Disequalities) {
2621
+ EquivalenceClass Class = ClassToDisEqSet.first ;
2622
+ if (FirstClass) {
2623
+ FirstClass = false ;
2624
+ } else {
2625
+ Out << ' ,' ;
2626
+ Out << NL;
2627
+ }
2628
+ Indent (Out, Space, IsDot) << " {" << NL;
2629
+ unsigned int DisEqSpace = Space + 1 ;
2630
+ Indent (Out, DisEqSpace, IsDot) << " \" class\" : " ;
2631
+ printEquivalenceClass (Out, State, Class);
2632
+ ClassSet DisequalClasses = ClassToDisEqSet.second ;
2633
+ if (!DisequalClasses.isEmpty ()) {
2634
+ Out << " ," << NL;
2635
+ Indent (Out, DisEqSpace, IsDot) << " \" disequal_to\" : [" << NL;
2636
+ unsigned int DisEqClassSpace = DisEqSpace + 1 ;
2637
+ Indent (Out, DisEqClassSpace, IsDot);
2638
+ bool FirstDisEqClass = true ;
2639
+ for (EquivalenceClass DisEqClass : DisequalClasses) {
2640
+ if (FirstDisEqClass) {
2641
+ FirstDisEqClass = false ;
2642
+ } else {
2643
+ Out << ' ,' << NL;
2644
+ Indent (Out, DisEqClassSpace, IsDot);
2645
+ }
2646
+ printEquivalenceClass (Out, State, DisEqClass);
2647
+ }
2648
+ Out << " ]" << NL;
2649
+ }
2650
+ Indent (Out, Space, IsDot) << " }" ;
2651
+ }
2652
+ Out << NL;
2653
+
2654
+ --Space;
2655
+ Indent (Out, Space, IsDot) << " ]," << NL;
2656
+ }
0 commit comments