ASDenysPetrov created this revision. ASDenysPetrov added reviewers: steakhal, martong, NoQ, xazax.hun, isuckatcs. ASDenysPetrov added a project: clang. Herald added subscribers: manas, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware. Herald added a project: All. ASDenysPetrov requested review of this revision. Herald added a subscriber: cfe-commits.
Fix FIXME. Produce `QualType` once in `getLocationType` at the first call. Then cache the result and return it for the next calls. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D131707 Files: clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h @@ -529,6 +529,8 @@ /// TypedValueRegion - An abstract class representing regions having a typed value. class TypedValueRegion : public TypedRegion { + mutable QualType CachedLocationType; + void anchor() override; protected: @@ -540,12 +542,13 @@ virtual QualType getValueType() const = 0; QualType getLocationType() const override { - // FIXME: We can possibly optimize this later to cache this value. - QualType T = getValueType(); - ASTContext &ctx = getContext(); - if (T->getAs<ObjCObjectType>()) - return ctx.getObjCObjectPointerType(T); - return ctx.getPointerType(getValueType()); + if (CachedLocationType.isNull()) { + QualType T = getValueType(); + ASTContext &C = getContext(); + CachedLocationType = T->isObjCObjectType() ? C.getObjCObjectPointerType(T) + : C.getPointerType(T); + } + return CachedLocationType; } QualType getDesugaredValueType(ASTContext &Context) const {
Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h @@ -529,6 +529,8 @@ /// TypedValueRegion - An abstract class representing regions having a typed value. class TypedValueRegion : public TypedRegion { + mutable QualType CachedLocationType; + void anchor() override; protected: @@ -540,12 +542,13 @@ virtual QualType getValueType() const = 0; QualType getLocationType() const override { - // FIXME: We can possibly optimize this later to cache this value. - QualType T = getValueType(); - ASTContext &ctx = getContext(); - if (T->getAs<ObjCObjectType>()) - return ctx.getObjCObjectPointerType(T); - return ctx.getPointerType(getValueType()); + if (CachedLocationType.isNull()) { + QualType T = getValueType(); + ASTContext &C = getContext(); + CachedLocationType = T->isObjCObjectType() ? C.getObjCObjectPointerType(T) + : C.getPointerType(T); + } + return CachedLocationType; } QualType getDesugaredValueType(ASTContext &Context) const {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits