summaryrefslogtreecommitdiffstats
path: root/clang/utils/analyzer/exploded-graph-rewriter.py
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-07-01 23:01:59 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-07-01 23:01:59 +0000
commit02f91ddf1b353b28697b288edbe6a8a828705781 (patch)
tree37c17f62e2ba95dbdc5a744351ed98448e924e92 /clang/utils/analyzer/exploded-graph-rewriter.py
parent5a72338bf50e29c034443d5075cb83a5386851d5 (diff)
downloadbcm5719-llvm-02f91ddf1b353b28697b288edbe6a8a828705781.tar.gz
bcm5719-llvm-02f91ddf1b353b28697b288edbe6a8a828705781.zip
[analyzer] exploded-graph-rewriter: Add support for dynamic types.
Slightly cleanup emission of horizontal lines and unhardcode the title for generic maps. Differential Revision: https://reviews.llvm.org/D64041 llvm-svn: 364865
Diffstat (limited to 'clang/utils/analyzer/exploded-graph-rewriter.py')
-rwxr-xr-xclang/utils/analyzer/exploded-graph-rewriter.py42
1 files changed, 25 insertions, 17 deletions
diff --git a/clang/utils/analyzer/exploded-graph-rewriter.py b/clang/utils/analyzer/exploded-graph-rewriter.py
index c4b015e5ded..b033814ed97 100755
--- a/clang/utils/analyzer/exploded-graph-rewriter.py
+++ b/clang/utils/analyzer/exploded-graph-rewriter.py
@@ -27,8 +27,8 @@ def diff_dicts(curr, prev):
# Represents any program state trait that is a dictionary of key-value pairs.
class GenericMap(object):
- def __init__(self, generic_map):
- self.generic_map = generic_map
+ def __init__(self, items):
+ self.generic_map = collections.OrderedDict(items)
def diff(self, prev):
return diff_dicts(self.generic_map, prev.generic_map)
@@ -218,11 +218,17 @@ class ProgramState(object):
if json_ps['store'] is not None else None
self.environment = Environment(json_ps['environment']) \
if json_ps['environment'] is not None else None
- self.constraints = GenericMap(collections.OrderedDict([
+ self.constraints = GenericMap([
(c['symbol'], c['range']) for c in json_ps['constraints']
- ])) if json_ps['constraints'] is not None else None
+ ]) if json_ps['constraints'] is not None else None
+ self.dynamic_types = GenericMap([
+ (t['region'], '%s%s' % (t['dyn_type'],
+ ' (or a sub-class)'
+ if t['sub_classable'] else ''))
+ for t in json_ps['dynamic_types']]) \
+ if json_ps['dynamic_types'] is not None else None
+
# TODO: Objects under construction.
- # TODO: Dynamic types of objects.
# TODO: Checker messages.
@@ -435,8 +441,7 @@ class DotDumpVisitor(object):
self._dump('</table>')
def visit_environment_in_state(self, s, prev_s=None):
- self._dump('<tr><td align="left">'
- '<b>Environment: </b>')
+ self._dump('<hr /><tr><td align="left"><b>Environment: </b>')
if s.environment is None:
self._dump('<i> Nothing!</i>')
else:
@@ -491,7 +496,7 @@ class DotDumpVisitor(object):
self._dump('</table>')
def visit_store_in_state(self, s, prev_s=None):
- self._dump('<tr><td align="left"><b>Store: </b>')
+ self._dump('<hr /><tr><td align="left"><b>Store: </b>')
if s.store is None:
self._dump('<i> Nothing!</i>')
else:
@@ -528,16 +533,19 @@ class DotDumpVisitor(object):
self._dump('</table>')
- def visit_generic_map_in_state(self, selector, s, prev_s=None):
- self._dump('<tr><td align="left">'
- '<b>Ranges: </b>')
+ def visit_generic_map_in_state(self, selector, title, s, prev_s=None):
m = getattr(s, selector)
+ prev_m = getattr(prev_s, selector) if prev_s is not None else None
+ if m is None and prev_m is None:
+ return
+
+ self._dump('<hr />')
+ self._dump('<tr><td align="left">'
+ '<b>%s: </b>' % title)
if m is None:
self._dump('<i> Nothing!</i>')
else:
- prev_m = None
if prev_s is not None:
- prev_m = getattr(prev_s, selector)
if prev_m is not None:
if m.is_different(prev_m):
self._dump('</td></tr><tr><td align="left">')
@@ -551,10 +559,11 @@ class DotDumpVisitor(object):
def visit_state(self, s, prev_s):
self.visit_store_in_state(s, prev_s)
- self._dump('<hr />')
self.visit_environment_in_state(s, prev_s)
- self._dump('<hr />')
- self.visit_generic_map_in_state('constraints', s, prev_s)
+ self.visit_generic_map_in_state('constraints', 'Ranges',
+ s, prev_s)
+ self.visit_generic_map_in_state('dynamic_types', 'Dynamic Types',
+ s, prev_s)
def visit_node(self, node):
self._dump('%s [shape=record,label=<<table border="0">'
@@ -576,7 +585,6 @@ class DotDumpVisitor(object):
self._dump('</table></td></tr>')
if node.state is not None:
- self._dump('<hr />')
prev_s = None
# Do diffs only when we have a unique predecessor.
# Don't do diffs on the leaf nodes because they're
OpenPOWER on IntegriCloud