Summary: -
Reviewers: NoQ
Reviewed By: NoQ
Subscribers: xazax.hun, baloghadamsoftware, szepet, a.sidorin,
mikhail.ramalho, Szelethus, donat.nagy, dkrupp, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D63726
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@364271
91177308-0d34-0410-b5e6-
96231b3b80d8
const LocationContext *LCtx, const char *NL,
unsigned int Space, bool IsDot) const {
Indent(Out, Space, IsDot) << "\"environment\": ";
- ++Space;
if (ExprBindings.isEmpty()) {
Out << "null," << NL;
return;
}
+ ++Space;
if (!LCtx) {
// Find the freshest location context.
llvm::SmallPtrSet<const LocationContext *, 16> FoundContexts;
assert(LCtx);
- Out << '[' << NL; // Start of Environment.
+ Out << "{ \"pointer\": \"" << (const void *)LCtx->getStackFrame()
+ << "\", \"items\": [" << NL;
PrintingPolicy PP = Ctx.getPrintingPolicy();
LCtx->printJson(Out, NL, Space, IsDot, [&](const LocationContext *LC) {
Out << "null ";
});
- Indent(Out, --Space, IsDot) << "]," << NL; // End of Environment.
+ Indent(Out, --Space, IsDot) << "]}," << NL;
}
return;
}
- Out << '[' << NL;
- Bindings.printJson(Out, NL, ++Space, IsDot);
- Indent(Out, --Space, IsDot) << "]," << NL;
+ Out << "{ \"pointer\": \"" << Bindings.asStore() << "\", \"items\": [" << NL;
+ Bindings.printJson(Out, NL, Space + 1, IsDot);
+ Indent(Out, Space, IsDot) << "]}," << NL;
}
"program_state": {
"store": null,
"constraints": null,
- "environment": [
- {
- "location_context": "#0 Call",
- "lctx_id": 3,
- "calling": "foo",
- "call_line": 4,
- "items": [
- {
- "stmt_id": 5,
- "pretty": "bar()",
- "value": "Unknown"
- }
- ]
- }
- ]
+ "environment": {
+ "pointer": "0x2",
+ "items": [
+ {
+ "location_context": "#0 Call",
+ "lctx_id": 3,
+ "calling": "foo",
+ "call_line": 4,
+ "items": [
+ {
+ "stmt_id": 5,
+ "pretty": "bar()",
+ "value": "Unknown"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
"program_state": {
"store": null,
"constraints": null,
- "environment": [
- {
- "location_context": "#0 Call",
- "lctx_id": 3,
- "calling": "foo",
- "call_line": 4,
- "items": [
- {
- "stmt_id": 5,
- "pretty": "bar()",
- "value": "Unknown"
- }
- ]
- }
- ]
+ "environment": {
+ "pointer": "0x2",
+ "items": [
+ {
+ "location_context": "#0 Call",
+ "lctx_id": 3,
+ "calling": "foo",
+ "call_line": 4,
+ "items": [
+ {
+ "stmt_id": 5,
+ "pretty": "bar()",
+ "value": "Unknown"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
"program_state": {
"store": null,
"constraints": null,
- "environment": [
- {
- "location_context": "#0 Call",
- "lctx_id": 3,
- "calling": "foo",
- "call_line": 4,
- "items": [
- {
- "stmt_id": 9,
- "pretty": "baz()",
- "value": "Undefined"
- }
- ]
- }
- ]
+ "environment": {
+ "pointer": "0x2",
+ "items": [
+ {
+ "location_context": "#0 Call",
+ "lctx_id": 3,
+ "calling": "foo",
+ "call_line": 4,
+ "items": [
+ {
+ "stmt_id": 9,
+ "pretty": "baz()",
+ "value": "Undefined"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
"program_state": {
"store": null,
"constraints": null,
- "environment": [
- {
- "location_context": "#0 Call",
- "lctx_id": 3,
- "calling": "foo",
- "call_line": 4,
- "items": [
- {
- "stmt_id": 9,
- "pretty": "baz()",
- "value": "Undefined"
- }
- ]
- }
- ]
+ "environment": {
+ "pointer": "0x2",
+ "items": [
+ {
+ "location_context": "#0 Call",
+ "lctx_id": 3,
+ "calling": "foo",
+ "call_line": 4,
+ "items": [
+ {
+ "stmt_id": 9,
+ "pretty": "baz()",
+ "value": "Undefined"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
"program_state": {
"environment": null,
"constraints": null,
- "store": [
- {
- "cluster": "x",
- "pointer": "0x3",
- "items": [
- {
- "kind": "Default",
- "offset": 0,
- "value": "Undefined"
- }
- ]
- }
- ]
+ "store": {
+ "pointer": "0x2",
+ "items": [
+ {
+ "cluster": "x",
+ "pointer": "0x3",
+ "items": [
+ {
+ "kind": "Default",
+ "offset": 0,
+ "value": "Undefined"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
"program_state": {
"environment": null,
"constraints": null,
- "store": [
- {
- "cluster": "x",
- "pointer": "0x3",
- "items": [
- {
- "kind": "Default",
- "offset": 0,
- "value": "Undefined"
- }
- ]
- }
- ]
+ "store": {
+ "pointer": "0x2",
+ "items": [
+ {
+ "cluster": "x",
+ "pointer": "0x3",
+ "items": [
+ {
+ "kind": "Default",
+ "offset": 0,
+ "value": "Undefined"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
"program_state": {
"environment": null,
"constraints": null,
- "store": [
- {
- "cluster": "x",
- "pointer": "0x3",
- "items": [
- {
- "kind": "Default",
- "offset": 0,
- "value": "Unknown"
- }
- ]
- }
- ]
+ "store": {
+ "pointer": "0x5",
+ "items": [
+ {
+ "cluster": "x",
+ "pointer": "0x3",
+ "items": [
+ {
+ "kind": "Default",
+ "offset": 0,
+ "value": "Unknown"
+ }
+ ]
+ }
+ ]
+ }
}
}
\l}"];
}
// CHECK: "program_state": {
-// CHECK-NEXT: "store": [
+// CHECK-NEXT: "store": { "pointer": "{{0x[0-9a-f]+}}", "items": [
// CHECK-NEXT: { "cluster": "y", "pointer": "{{0x[0-9a-f]+}}", "items": [
// CHECK-NEXT: { "kind": "Direct", "offset": 0, "value": "2 S32b" }
// CHECK-NEXT: ]}
-// CHECK-NEXT: ],
-// CHECK-NEXT: "environment": [
+// CHECK-NEXT: ]},
+// CHECK-NEXT: "environment": { "pointer": "{{0x[0-9a-f]+}}", "items": [
// CHECK-NEXT: { "lctx_id": 1, "location_context": "#0 Call", "calling": "foo", "call_line": null, "items": [
// CHECK-NEXT: { "stmt_id": {{[0-9]+}}, "pretty": "clang_analyzer_printState", "value": "&code{clang_analyzer_printState}" }
// CHECK-NEXT: ]}
-// CHECK-NEXT: ],
+// CHECK-NEXT: ]},
// CHECK-NEXT: "constraints": [
// CHECK-NEXT: { "symbol": "reg_$0<int x>", "range": "{ [-2147483648, 13] }" }
// CHECK-NEXT: ],
class Environment(object):
def __init__(self, json_e):
super(Environment, self).__init__()
- self.frames = [EnvironmentFrame(f) for f in json_e]
+ self.ptr = json_e['pointer']
+ self.frames = [EnvironmentFrame(f) for f in json_e['items']]
def diff_frames(self, prev):
# TODO: It's difficult to display a good diff when frame numbers shift.
class Store(object):
def __init__(self, json_s):
super(Store, self).__init__()
+ self.ptr = json_s['pointer']
self.clusters = collections.OrderedDict(
- [(c['pointer'], StoreCluster(c)) for c in json_s])
+ [(c['pointer'], StoreCluster(c)) for c in json_s['items']])
def diff_clusters(self, prev):
removed = [k for k in prev.clusters if k not in self.clusters]