@@ -91,11 +91,12 @@ def main():
91
91
return
92
92
suffix = sys .argv [1 ]
93
93
94
- blocks = {}
94
+ block_list = []
95
+ block_map = {}
95
96
cur_block = None
96
97
sil_block_pattern = re .compile (r'^(\S+)(\(.*\))?: *(\/\/ *Preds:(.*))?$' )
97
98
llvm_block_pattern1 = re .compile (r'^(\S+): *; *preds =(.*)?$' )
98
- llvm_block_pattern2 = re .compile (r'^; <label>:(\d+) *; *preds =(.*)?$' )
99
+ llvm_block_pattern2 = re .compile (r'^; <label>:(\d+):? *; *preds =(.*)?$' )
99
100
100
101
# Scan the input file.
101
102
@@ -118,39 +119,40 @@ def main():
118
119
if cur_block is not None :
119
120
cur_block .add_line (line )
120
121
elif not line [:1 ].isspace ():
121
- if line .startswith ('}' ) and blocks :
122
+ if line .startswith ('}' ) and block_map :
122
123
break
123
124
cur_block = None
124
125
125
126
if block_name is not None :
126
127
cur_block = Block (block_name , preds )
127
128
cur_block .add_line (line )
128
- blocks [block_name ] = cur_block
129
+ block_list .append (cur_block )
130
+ block_map [block_name ] = cur_block
129
131
130
132
# Add empty blocks which we didn't see, but which are referenced.
131
133
new_blocks = {}
132
- for name , block in blocks . iteritems () :
134
+ for block in block_list :
133
135
for adj_name in (block .preds + block .get_succs ()):
134
- if adj_name not in blocks :
136
+ if adj_name not in block_map :
135
137
new_blocks [adj_name ] = Block (adj_name , None )
136
138
137
- blocks = dict (blocks .items () + new_blocks .items ())
139
+ block_map = dict (block_map .items () + new_blocks .items ())
138
140
139
141
# Add missing edges if we didn't see a successor in the terminator
140
142
# but the block is mentioned in the pred list of the successor.
141
143
142
- for name , block in blocks . iteritems () :
144
+ for block in block_list :
143
145
for pred_name in block .preds :
144
- pred_block = blocks [pred_name ]
145
- if name not in pred_block .get_succs ():
146
- pred_block .get_succs ().append (name )
146
+ pred_block = block_map [pred_name ]
147
+ if block . name not in pred_block .get_succs ():
148
+ pred_block .get_succs ().append (block . name )
147
149
148
150
# Write the output dot file.
149
151
150
152
file_name = tempfile .gettempdir () + "/viewcfg" + suffix + ".dot"
151
153
with open (file_name , 'w' ) as out_file :
152
154
out_file .write ('digraph "CFG" {\n ' )
153
- for name , block in blocks . iteritems () :
155
+ for block in block_list :
154
156
if block .content is not None :
155
157
out_file .write (
156
158
"\t Node" + str (block .index ) +
@@ -162,7 +164,7 @@ def main():
162
164
block .name + "}\" ];\n " )
163
165
164
166
for succ_name in block .get_succs ():
165
- succ_block = blocks [succ_name ]
167
+ succ_block = block_map [succ_name ]
166
168
out_file .write (
167
169
"\t Node" + str (block .index ) + " -> Node" +
168
170
str (succ_block .index ) + ";\n " )
0 commit comments