|
@@ -227,17 +227,23 @@ private:
|
|
AnalysisDeclContext *Ctx;
|
|
AnalysisDeclContext *Ctx;
|
|
|
|
|
|
const LocationContext *Parent;
|
|
const LocationContext *Parent;
|
|
|
|
+ int64_t ID;
|
|
|
|
|
|
protected:
|
|
protected:
|
|
LocationContext(ContextKind k, AnalysisDeclContext *ctx,
|
|
LocationContext(ContextKind k, AnalysisDeclContext *ctx,
|
|
- const LocationContext *parent)
|
|
|
|
- : Kind(k), Ctx(ctx), Parent(parent) {}
|
|
|
|
|
|
+ const LocationContext *parent,
|
|
|
|
+ int64_t ID)
|
|
|
|
+ : Kind(k), Ctx(ctx), Parent(parent), ID(ID) {}
|
|
|
|
|
|
public:
|
|
public:
|
|
virtual ~LocationContext();
|
|
virtual ~LocationContext();
|
|
|
|
|
|
ContextKind getKind() const { return Kind; }
|
|
ContextKind getKind() const { return Kind; }
|
|
|
|
|
|
|
|
+ int64_t getID() const {
|
|
|
|
+ return ID;
|
|
|
|
+ }
|
|
|
|
+
|
|
AnalysisDeclContext *getAnalysisDeclContext() const { return Ctx; }
|
|
AnalysisDeclContext *getAnalysisDeclContext() const { return Ctx; }
|
|
|
|
|
|
const LocationContext *getParent() const { return Parent; }
|
|
const LocationContext *getParent() const { return Parent; }
|
|
@@ -297,8 +303,9 @@ class StackFrameContext : public LocationContext {
|
|
|
|
|
|
StackFrameContext(AnalysisDeclContext *ctx, const LocationContext *parent,
|
|
StackFrameContext(AnalysisDeclContext *ctx, const LocationContext *parent,
|
|
const Stmt *s, const CFGBlock *blk,
|
|
const Stmt *s, const CFGBlock *blk,
|
|
- unsigned idx)
|
|
|
|
- : LocationContext(StackFrame, ctx, parent), CallSite(s),
|
|
|
|
|
|
+ unsigned idx,
|
|
|
|
+ int64_t ID)
|
|
|
|
+ : LocationContext(StackFrame, ctx, parent, ID), CallSite(s),
|
|
Block(blk), Index(idx) {}
|
|
Block(blk), Index(idx) {}
|
|
|
|
|
|
public:
|
|
public:
|
|
@@ -334,8 +341,8 @@ class ScopeContext : public LocationContext {
|
|
const Stmt *Enter;
|
|
const Stmt *Enter;
|
|
|
|
|
|
ScopeContext(AnalysisDeclContext *ctx, const LocationContext *parent,
|
|
ScopeContext(AnalysisDeclContext *ctx, const LocationContext *parent,
|
|
- const Stmt *s)
|
|
|
|
- : LocationContext(Scope, ctx, parent), Enter(s) {}
|
|
|
|
|
|
+ const Stmt *s, int64_t ID)
|
|
|
|
+ : LocationContext(Scope, ctx, parent, ID), Enter(s) {}
|
|
|
|
|
|
public:
|
|
public:
|
|
~ScopeContext() override = default;
|
|
~ScopeContext() override = default;
|
|
@@ -361,9 +368,10 @@ class BlockInvocationContext : public LocationContext {
|
|
const void *ContextData;
|
|
const void *ContextData;
|
|
|
|
|
|
BlockInvocationContext(AnalysisDeclContext *ctx,
|
|
BlockInvocationContext(AnalysisDeclContext *ctx,
|
|
- const LocationContext *parent,
|
|
|
|
- const BlockDecl *bd, const void *contextData)
|
|
|
|
- : LocationContext(Block, ctx, parent), BD(bd), ContextData(contextData) {}
|
|
|
|
|
|
+ const LocationContext *parent, const BlockDecl *bd,
|
|
|
|
+ const void *contextData, int64_t ID)
|
|
|
|
+ : LocationContext(Block, ctx, parent, ID), BD(bd),
|
|
|
|
+ ContextData(contextData) {}
|
|
|
|
|
|
public:
|
|
public:
|
|
~BlockInvocationContext() override = default;
|
|
~BlockInvocationContext() override = default;
|
|
@@ -389,6 +397,9 @@ public:
|
|
class LocationContextManager {
|
|
class LocationContextManager {
|
|
llvm::FoldingSet<LocationContext> Contexts;
|
|
llvm::FoldingSet<LocationContext> Contexts;
|
|
|
|
|
|
|
|
+ /// ID used for generating a new location context.
|
|
|
|
+ int64_t NewID = 0;
|
|
|
|
+
|
|
public:
|
|
public:
|
|
~LocationContextManager();
|
|
~LocationContextManager();
|
|
|
|
|