@@ -49,6 +49,7 @@ class SymbolRegionValue : public SymbolData {
49
49
const TypedValueRegion *R;
50
50
51
51
friend class SymExprAllocator ;
52
+ friend class SymbolManager ;
52
53
SymbolRegionValue (SymbolID sym, const TypedValueRegion *r)
53
54
: SymbolData(ClassKind, sym), R(r) {
54
55
assert (r);
@@ -91,6 +92,7 @@ class SymbolConjured : public SymbolData {
91
92
const void *SymbolTag;
92
93
93
94
friend class SymExprAllocator ;
95
+ friend class SymbolManager ;
94
96
SymbolConjured (SymbolID sym, ConstCFGElementRef elem,
95
97
const LocationContext *lctx, QualType t, unsigned count,
96
98
const void *symbolTag)
@@ -146,6 +148,7 @@ class SymbolOverlyComplex final : public SymbolData {
146
148
const SymExpr *OverlyComplicatedSymbol;
147
149
148
150
friend class SymExprAllocator ;
151
+ friend class SymbolManager ;
149
152
150
153
SymbolOverlyComplex (SymbolID Sym, const SymExpr *OverlyComplicatedSymbol)
151
154
: SymbolData(ClassKind, Sym),
@@ -185,6 +188,7 @@ class SymbolDerived : public SymbolData {
185
188
const TypedValueRegion *R;
186
189
187
190
friend class SymExprAllocator ;
191
+ friend class SymbolManager ;
188
192
SymbolDerived (SymbolID sym, SymbolRef parent, const TypedValueRegion *r)
189
193
: SymbolData(ClassKind, sym), parentSymbol(parent), R(r) {
190
194
assert (parent);
@@ -229,6 +233,7 @@ class SymbolExtent : public SymbolData {
229
233
const SubRegion *R;
230
234
231
235
friend class SymExprAllocator ;
236
+ friend class SymbolManager ;
232
237
SymbolExtent (SymbolID sym, const SubRegion *r)
233
238
: SymbolData(ClassKind, sym), R(r) {
234
239
assert (r);
@@ -274,6 +279,7 @@ class SymbolMetadata : public SymbolData {
274
279
const void *Tag;
275
280
276
281
friend class SymExprAllocator ;
282
+ friend class SymbolManager ;
277
283
SymbolMetadata (SymbolID sym, const MemRegion *r, const Stmt *s, QualType t,
278
284
const LocationContext *LCtx, unsigned count, const void *tag)
279
285
: SymbolData(ClassKind, sym), R(r), S(s), T(t), LCtx(LCtx), Count(count),
@@ -340,6 +346,7 @@ class SymbolCast : public SymExpr {
340
346
QualType ToTy;
341
347
342
348
friend class SymExprAllocator ;
349
+ friend class SymbolManager ;
343
350
SymbolCast (SymbolID Sym, const SymExpr *In, QualType From, QualType To)
344
351
: SymExpr(ClassKind, Sym, computeComplexity(In, From, To)), Operand(In),
345
352
FromTy (From), ToTy(To) {
@@ -387,6 +394,7 @@ class UnarySymExpr : public SymExpr {
387
394
QualType T;
388
395
389
396
friend class SymExprAllocator ;
397
+ friend class SymbolManager ;
390
398
UnarySymExpr (SymbolID Sym, const SymExpr *In, UnaryOperator::Opcode Op,
391
399
QualType T)
392
400
: SymExpr(ClassKind, Sym, computeComplexity(In, Op, T)), Operand(In),
@@ -484,6 +492,7 @@ class BinarySymExprImpl : public BinarySymExpr {
484
492
RHSTYPE RHS;
485
493
486
494
friend class SymExprAllocator ;
495
+ friend class SymbolManager ;
487
496
BinarySymExprImpl (SymbolID Sym, LHSTYPE lhs, BinaryOperator::Opcode op,
488
497
RHSTYPE rhs, QualType t)
489
498
: BinarySymExpr(Sym, ClassKind, op, t,
@@ -728,18 +737,38 @@ class SymbolVisitor {
728
737
// Returns a const pointer to T if T is a SymbolData, otherwise SymExpr.
729
738
template <typename T, typename ... Args, typename Ret>
730
739
const Ret *SymbolManager::acquire (Args &&...args) {
731
- llvm::FoldingSetNodeID profile;
732
- T::Profile (profile, args...);
733
- void *InsertPos;
734
- SymExpr *SD = DataSet.FindNodeOrInsertPos (profile, InsertPos);
735
- if (!SD) {
736
- SD = Alloc.make <T>(std::forward<Args>(args)...);
737
- DataSet.InsertNode (SD, InsertPos);
738
- if (SD->complexity () > MaxCompComplexity) {
739
- return cast<Ret>(acquire<SymbolOverlyComplex>(SD));
740
+ T Dummy (/* SymbolID=*/ 0 , args...);
741
+ llvm::FoldingSetNodeID DummyProfile;
742
+ Dummy.Profile (DummyProfile);
743
+
744
+ if (Dummy.complexity () <= MaxCompComplexity) {
745
+ void *InsertPos;
746
+ SymExpr *SD = DataSet.FindNodeOrInsertPos (DummyProfile, InsertPos);
747
+ if (!SD) {
748
+ SD = Alloc.make <T>(args...);
749
+ DataSet.InsertNode (SD, InsertPos);
740
750
}
751
+ return cast<Ret>(SD);
752
+ }
753
+ void *WrappedSymInsertPos;
754
+ SymExpr *WrappedSym =
755
+ DataSet.FindNodeOrInsertPos (DummyProfile, WrappedSymInsertPos);
756
+ if (!WrappedSym) {
757
+ WrappedSym = Alloc.make <T>(args...);
758
+ DataSet.InsertNode (WrappedSym, WrappedSymInsertPos);
741
759
}
742
760
761
+ SymbolOverlyComplex OverlyComplexSym (/* SymbolID=*/ 0 , WrappedSym);
762
+ llvm::FoldingSetNodeID OverlyComplexSymProfile;
763
+ OverlyComplexSym.Profile (OverlyComplexSymProfile);
764
+
765
+ void *OverlyComplexSymInsertPos;
766
+ SymExpr *SD = DataSet.FindNodeOrInsertPos (OverlyComplexSymProfile,
767
+ OverlyComplexSymInsertPos);
768
+ if (!SD) {
769
+ SD = Alloc.make <SymbolOverlyComplex>(WrappedSym);
770
+ DataSet.InsertNode (SD, OverlyComplexSymInsertPos);
771
+ }
743
772
return cast<Ret>(SD);
744
773
}
745
774
0 commit comments