[clang] [analyzer][NFC] Make RegionStore dumps deterministic (PR #115615)
DonĂ¡t Nagy via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 11 10:40:26 PST 2024
================
@@ -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
More information about the cfe-commits
mailing list