================ @@ -232,27 +233,86 @@ class RegionBindingsRef : public llvm::ImmutableMapRef<const MemRegion *, void printJson(raw_ostream &Out, const char *NL = "\n", unsigned int Space = 0, bool IsDot = false) const { - for (iterator I = begin(), E = end(); I != E; ++I) { - // TODO: We might need a .printJson for I.getKey() as well. + using namespace llvm; + DenseMap<const MemRegion *, std::string> StringifyCache; + auto ToString = [&StringifyCache](const MemRegion *R) { + auto [Place, Inserted] = StringifyCache.try_emplace(R); + if (!Inserted) + return Place->second; + std::string Res; + raw_string_ostream OS(Res); + OS << R; + Place->second = Res; + return Res; + }; + + using Cluster = + std::pair<const MemRegion *, ImmutableMap<BindingKey, SVal>>; + using Binding = std::pair<BindingKey, SVal>; + + const auto MemSpaceBeforeRegionName = [&ToString](const Cluster *L, + const Cluster *R) { + if (isa<MemSpaceRegion>(L->first) && !isa<MemSpaceRegion>(R->first)) + return true; + if (!isa<MemSpaceRegion>(L->first) && isa<MemSpaceRegion>(R->first)) + return false; + return ToString(L->first) < ToString(R->first); + }; + + const auto SymbolicBeforeOffset = [&ToString](const BindingKey &L, + const BindingKey &R) { + if (L.hasSymbolicOffset() && !R.hasSymbolicOffset()) + return true; + if (!L.hasSymbolicOffset() && R.hasSymbolicOffset()) + return false; + if (L.hasSymbolicOffset() && R.hasSymbolicOffset()) + return ToString(L.getRegion()) < ToString(R.getRegion()); + return L.getOffset() < R.getOffset(); + }; + + const auto DefaultBindingBeforeDirectBindings = + [&SymbolicBeforeOffset](const Binding *LPtr, const Binding *RPtr) { + const BindingKey &L = LPtr->first; + const BindingKey &R = RPtr->first; + if (L.isDefault() && !R.isDefault()) + return true; + if (!L.isDefault() && R.isDefault()) + return false; + assert(L.isDefault() == R.isDefault()); + return SymbolicBeforeOffset(L, R); + }; + ---------------- NagyDonat wrote:
Yes, that's a good point about eager stringification. https://github.com/llvm/llvm-project/pull/115615 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits