19f41c03fSDjordje Todorovic#!/usr/bin/env python 29f41c03fSDjordje Todorovic# 39f41c03fSDjordje Todorovic# Debugify summary for the original debug info testing. 49f41c03fSDjordje Todorovic# 59f41c03fSDjordje Todorovic 69f41c03fSDjordje Todorovicfrom __future__ import print_function 79f41c03fSDjordje Todorovicimport argparse 89f41c03fSDjordje Todorovicimport os 99f41c03fSDjordje Todorovicimport sys 109f41c03fSDjordje Todorovicfrom json import loads 119f41c03fSDjordje Todorovicfrom collections import defaultdict 129f41c03fSDjordje Todorovicfrom collections import OrderedDict 139f41c03fSDjordje Todorovic 14*b71edfaaSTobias Hieta 159f41c03fSDjordje Todorovicclass DILocBug: 169f41c03fSDjordje Todorovic def __init__(self, action, bb_name, fn_name, instr): 179f41c03fSDjordje Todorovic self.action = action 189f41c03fSDjordje Todorovic self.bb_name = bb_name 199f41c03fSDjordje Todorovic self.fn_name = fn_name 209f41c03fSDjordje Todorovic self.instr = instr 21*b71edfaaSTobias Hieta 228b38a2c0SNikola Tesic def __str__(self): 238b38a2c0SNikola Tesic return self.action + self.bb_name + self.fn_name + self.instr 249f41c03fSDjordje Todorovic 25*b71edfaaSTobias Hieta 269f41c03fSDjordje Todorovicclass DISPBug: 279f41c03fSDjordje Todorovic def __init__(self, action, fn_name): 289f41c03fSDjordje Todorovic self.action = action 299f41c03fSDjordje Todorovic self.fn_name = fn_name 30*b71edfaaSTobias Hieta 318b38a2c0SNikola Tesic def __str__(self): 328b38a2c0SNikola Tesic return self.action + self.fn_name 339f41c03fSDjordje Todorovic 34*b71edfaaSTobias Hieta 35b9076d11SDjordje Todorovicclass DIVarBug: 36b9076d11SDjordje Todorovic def __init__(self, action, name, fn_name): 37b9076d11SDjordje Todorovic self.action = action 38b9076d11SDjordje Todorovic self.name = name 39b9076d11SDjordje Todorovic self.fn_name = fn_name 40*b71edfaaSTobias Hieta 418b38a2c0SNikola Tesic def __str__(self): 428b38a2c0SNikola Tesic return self.action + self.name + self.fn_name 43b9076d11SDjordje Todorovic 44*b71edfaaSTobias Hieta 459f41c03fSDjordje Todorovic# Report the bugs in form of html. 46*b71edfaaSTobias Hietadef generate_html_report( 47*b71edfaaSTobias Hieta di_location_bugs, 48*b71edfaaSTobias Hieta di_subprogram_bugs, 49*b71edfaaSTobias Hieta di_var_bugs, 50*b71edfaaSTobias Hieta di_location_bugs_summary, 51*b71edfaaSTobias Hieta di_sp_bugs_summary, 52*b71edfaaSTobias Hieta di_var_bugs_summary, 53*b71edfaaSTobias Hieta html_file, 54*b71edfaaSTobias Hieta): 559f41c03fSDjordje Todorovic fileout = open(html_file, "w") 569f41c03fSDjordje Todorovic 579f41c03fSDjordje Todorovic html_header = """ <html> 589f41c03fSDjordje Todorovic <head> 599f41c03fSDjordje Todorovic <style> 609f41c03fSDjordje Todorovic table, th, td { 619f41c03fSDjordje Todorovic border: 1px solid black; 629f41c03fSDjordje Todorovic } 639f41c03fSDjordje Todorovic table.center { 649f41c03fSDjordje Todorovic margin-left: auto; 659f41c03fSDjordje Todorovic margin-right: auto; 669f41c03fSDjordje Todorovic } 679f41c03fSDjordje Todorovic </style> 689f41c03fSDjordje Todorovic </head> 699f41c03fSDjordje Todorovic <body> 709f41c03fSDjordje Todorovic """ 719f41c03fSDjordje Todorovic 729f41c03fSDjordje Todorovic # Create the table for Location bugs. 739f41c03fSDjordje Todorovic table_title_di_loc = "Location Bugs found by the Debugify" 749f41c03fSDjordje Todorovic 759f41c03fSDjordje Todorovic table_di_loc = """<table> 769f41c03fSDjordje Todorovic <caption><b>{}</b></caption> 779f41c03fSDjordje Todorovic <tr> 78*b71edfaaSTobias Hieta """.format( 79*b71edfaaSTobias Hieta table_title_di_loc 80*b71edfaaSTobias Hieta ) 819f41c03fSDjordje Todorovic 82*b71edfaaSTobias Hieta header_di_loc = [ 83*b71edfaaSTobias Hieta "File", 84*b71edfaaSTobias Hieta "LLVM Pass Name", 85*b71edfaaSTobias Hieta "LLVM IR Instruction", 86*b71edfaaSTobias Hieta "Function Name", 87*b71edfaaSTobias Hieta "Basic Block Name", 88*b71edfaaSTobias Hieta "Action", 89*b71edfaaSTobias Hieta ] 909f41c03fSDjordje Todorovic 919f41c03fSDjordje Todorovic for column in header_di_loc: 929f41c03fSDjordje Todorovic table_di_loc += " <th>{0}</th>\n".format(column.strip()) 939f41c03fSDjordje Todorovic table_di_loc += " </tr>\n" 949f41c03fSDjordje Todorovic 959f41c03fSDjordje Todorovic at_least_one_bug_found = False 969f41c03fSDjordje Todorovic 979f41c03fSDjordje Todorovic # Handle loction bugs. 989f41c03fSDjordje Todorovic for file, per_file_bugs in di_location_bugs.items(): 999f41c03fSDjordje Todorovic for llvm_pass, per_pass_bugs in per_file_bugs.items(): 1009f41c03fSDjordje Todorovic # No location bugs for the pass. 1019f41c03fSDjordje Todorovic if len(per_pass_bugs) == 0: 1029f41c03fSDjordje Todorovic continue 1039f41c03fSDjordje Todorovic at_least_one_bug_found = True 1049f41c03fSDjordje Todorovic row = [] 1059f41c03fSDjordje Todorovic table_di_loc += " </tr>\n" 1069f41c03fSDjordje Todorovic # Get the bugs info. 1079f41c03fSDjordje Todorovic for x in per_pass_bugs: 1089f41c03fSDjordje Todorovic row.append(" <tr>\n") 1099f41c03fSDjordje Todorovic row.append(file) 1109f41c03fSDjordje Todorovic row.append(llvm_pass) 1119f41c03fSDjordje Todorovic row.append(x.instr) 1129f41c03fSDjordje Todorovic row.append(x.fn_name) 1139f41c03fSDjordje Todorovic row.append(x.bb_name) 1149f41c03fSDjordje Todorovic row.append(x.action) 1159f41c03fSDjordje Todorovic row.append(" </tr>\n") 1169f41c03fSDjordje Todorovic # Dump the bugs info into the table. 1179f41c03fSDjordje Todorovic for column in row: 1189f41c03fSDjordje Todorovic # The same file-pass pair can have multiple bugs. 119*b71edfaaSTobias Hieta if column == " <tr>\n" or column == " </tr>\n": 1209f41c03fSDjordje Todorovic table_di_loc += column 1219f41c03fSDjordje Todorovic continue 1229f41c03fSDjordje Todorovic table_di_loc += " <td>{0}</td>\n".format(column.strip()) 1239f41c03fSDjordje Todorovic table_di_loc += " <tr>\n" 1249f41c03fSDjordje Todorovic 1259f41c03fSDjordje Todorovic if not at_least_one_bug_found: 1269f41c03fSDjordje Todorovic table_di_loc += """ <tr> 1279f41c03fSDjordje Todorovic <td colspan='7'> No bugs found </td> 1289f41c03fSDjordje Todorovic </tr> 1299f41c03fSDjordje Todorovic """ 1309f41c03fSDjordje Todorovic table_di_loc += "</table>\n" 1319f41c03fSDjordje Todorovic 1329f41c03fSDjordje Todorovic # Create the summary table for the loc bugs. 1339f41c03fSDjordje Todorovic table_title_di_loc_sum = "Summary of Location Bugs" 1349f41c03fSDjordje Todorovic table_di_loc_sum = """<table> 1359f41c03fSDjordje Todorovic <caption><b>{}</b></caption> 1369f41c03fSDjordje Todorovic <tr> 137*b71edfaaSTobias Hieta """.format( 138*b71edfaaSTobias Hieta table_title_di_loc_sum 139*b71edfaaSTobias Hieta ) 1409f41c03fSDjordje Todorovic 1419f41c03fSDjordje Todorovic header_di_loc_sum = ["LLVM Pass Name", "Number of bugs"] 1429f41c03fSDjordje Todorovic 1439f41c03fSDjordje Todorovic for column in header_di_loc_sum: 1449f41c03fSDjordje Todorovic table_di_loc_sum += " <th>{0}</th>\n".format(column.strip()) 1459f41c03fSDjordje Todorovic table_di_loc_sum += " </tr>\n" 1469f41c03fSDjordje Todorovic 1479f41c03fSDjordje Todorovic # Print the summary. 1489f41c03fSDjordje Todorovic row = [] 1499f41c03fSDjordje Todorovic for llvm_pass, num in sorted(di_location_bugs_summary.items()): 1509f41c03fSDjordje Todorovic row.append(" <tr>\n") 1519f41c03fSDjordje Todorovic row.append(llvm_pass) 1529f41c03fSDjordje Todorovic row.append(str(num)) 1539f41c03fSDjordje Todorovic row.append(" </tr>\n") 1549f41c03fSDjordje Todorovic for column in row: 155*b71edfaaSTobias Hieta if column == " <tr>\n" or column == " </tr>\n": 1569f41c03fSDjordje Todorovic table_di_loc_sum += column 1579f41c03fSDjordje Todorovic continue 1589f41c03fSDjordje Todorovic table_di_loc_sum += " <td>{0}</td>\n".format(column.strip()) 1599f41c03fSDjordje Todorovic table_di_loc_sum += " <tr>\n" 1609f41c03fSDjordje Todorovic 1619f41c03fSDjordje Todorovic if not at_least_one_bug_found: 1629f41c03fSDjordje Todorovic table_di_loc_sum += """<tr> 1639f41c03fSDjordje Todorovic <td colspan='2'> No bugs found </td> 1649f41c03fSDjordje Todorovic </tr> 1659f41c03fSDjordje Todorovic """ 1669f41c03fSDjordje Todorovic table_di_loc_sum += "</table>\n" 1679f41c03fSDjordje Todorovic 1689f41c03fSDjordje Todorovic # Create the table for SP bugs. 1699f41c03fSDjordje Todorovic table_title_di_sp = "SP Bugs found by the Debugify" 1709f41c03fSDjordje Todorovic table_di_sp = """<table> 1719f41c03fSDjordje Todorovic <caption><b>{}</b></caption> 1729f41c03fSDjordje Todorovic <tr> 173*b71edfaaSTobias Hieta """.format( 174*b71edfaaSTobias Hieta table_title_di_sp 175*b71edfaaSTobias Hieta ) 1769f41c03fSDjordje Todorovic 1779f41c03fSDjordje Todorovic header_di_sp = ["File", "LLVM Pass Name", "Function Name", "Action"] 1789f41c03fSDjordje Todorovic 1799f41c03fSDjordje Todorovic for column in header_di_sp: 1809f41c03fSDjordje Todorovic table_di_sp += " <th>{0}</th>\n".format(column.strip()) 1819f41c03fSDjordje Todorovic table_di_sp += " </tr>\n" 1829f41c03fSDjordje Todorovic 1839f41c03fSDjordje Todorovic at_least_one_bug_found = False 1849f41c03fSDjordje Todorovic 185b9076d11SDjordje Todorovic # Handle fn bugs. 1869f41c03fSDjordje Todorovic for file, per_file_bugs in di_subprogram_bugs.items(): 1879f41c03fSDjordje Todorovic for llvm_pass, per_pass_bugs in per_file_bugs.items(): 1889f41c03fSDjordje Todorovic # No SP bugs for the pass. 1899f41c03fSDjordje Todorovic if len(per_pass_bugs) == 0: 1909f41c03fSDjordje Todorovic continue 1919f41c03fSDjordje Todorovic at_least_one_bug_found = True 1929f41c03fSDjordje Todorovic row = [] 1939f41c03fSDjordje Todorovic table_di_sp += " </tr>\n" 1949f41c03fSDjordje Todorovic # Get the bugs info. 1959f41c03fSDjordje Todorovic for x in per_pass_bugs: 1969f41c03fSDjordje Todorovic row.append(" <tr>\n") 1979f41c03fSDjordje Todorovic row.append(file) 1989f41c03fSDjordje Todorovic row.append(llvm_pass) 1999f41c03fSDjordje Todorovic row.append(x.fn_name) 2009f41c03fSDjordje Todorovic row.append(x.action) 2019f41c03fSDjordje Todorovic row.append(" </tr>\n") 2029f41c03fSDjordje Todorovic # Dump the bugs info into the table. 2039f41c03fSDjordje Todorovic for column in row: 2049f41c03fSDjordje Todorovic # The same file-pass pair can have multiple bugs. 205*b71edfaaSTobias Hieta if column == " <tr>\n" or column == " </tr>\n": 2069f41c03fSDjordje Todorovic table_di_sp += column 2079f41c03fSDjordje Todorovic continue 2089f41c03fSDjordje Todorovic table_di_sp += " <td>{0}</td>\n".format(column.strip()) 2099f41c03fSDjordje Todorovic table_di_sp += " <tr>\n" 2109f41c03fSDjordje Todorovic 2119f41c03fSDjordje Todorovic if not at_least_one_bug_found: 2129f41c03fSDjordje Todorovic table_di_sp += """<tr> 2139f41c03fSDjordje Todorovic <td colspan='4'> No bugs found </td> 2149f41c03fSDjordje Todorovic </tr> 2159f41c03fSDjordje Todorovic """ 2169f41c03fSDjordje Todorovic table_di_sp += "</table>\n" 2179f41c03fSDjordje Todorovic 2189f41c03fSDjordje Todorovic # Create the summary table for the sp bugs. 2199f41c03fSDjordje Todorovic table_title_di_sp_sum = "Summary of SP Bugs" 2209f41c03fSDjordje Todorovic table_di_sp_sum = """<table> 2219f41c03fSDjordje Todorovic <caption><b>{}</b></caption> 2229f41c03fSDjordje Todorovic <tr> 223*b71edfaaSTobias Hieta """.format( 224*b71edfaaSTobias Hieta table_title_di_sp_sum 225*b71edfaaSTobias Hieta ) 2269f41c03fSDjordje Todorovic 2279f41c03fSDjordje Todorovic header_di_sp_sum = ["LLVM Pass Name", "Number of bugs"] 2289f41c03fSDjordje Todorovic 2299f41c03fSDjordje Todorovic for column in header_di_sp_sum: 2309f41c03fSDjordje Todorovic table_di_sp_sum += " <th>{0}</th>\n".format(column.strip()) 2319f41c03fSDjordje Todorovic table_di_sp_sum += " </tr>\n" 2329f41c03fSDjordje Todorovic 2339f41c03fSDjordje Todorovic # Print the summary. 2349f41c03fSDjordje Todorovic row = [] 2359f41c03fSDjordje Todorovic for llvm_pass, num in sorted(di_sp_bugs_summary.items()): 2369f41c03fSDjordje Todorovic row.append(" <tr>\n") 2379f41c03fSDjordje Todorovic row.append(llvm_pass) 2389f41c03fSDjordje Todorovic row.append(str(num)) 2399f41c03fSDjordje Todorovic row.append(" </tr>\n") 2409f41c03fSDjordje Todorovic for column in row: 241*b71edfaaSTobias Hieta if column == " <tr>\n" or column == " </tr>\n": 2429f41c03fSDjordje Todorovic table_di_sp_sum += column 2439f41c03fSDjordje Todorovic continue 2449f41c03fSDjordje Todorovic table_di_sp_sum += " <td>{0}</td>\n".format(column.strip()) 2459f41c03fSDjordje Todorovic table_di_sp_sum += " <tr>\n" 2469f41c03fSDjordje Todorovic 2479f41c03fSDjordje Todorovic if not at_least_one_bug_found: 2489f41c03fSDjordje Todorovic table_di_sp_sum += """<tr> 2499f41c03fSDjordje Todorovic <td colspan='2'> No bugs found </td> 2509f41c03fSDjordje Todorovic </tr> 2519f41c03fSDjordje Todorovic """ 2529f41c03fSDjordje Todorovic table_di_sp_sum += "</table>\n" 2539f41c03fSDjordje Todorovic 254b9076d11SDjordje Todorovic # Create the table for Variable bugs. 255b9076d11SDjordje Todorovic table_title_di_var = "Variable Location Bugs found by the Debugify" 256b9076d11SDjordje Todorovic table_di_var = """<table> 257b9076d11SDjordje Todorovic <caption><b>{}</b></caption> 258b9076d11SDjordje Todorovic <tr> 259*b71edfaaSTobias Hieta """.format( 260*b71edfaaSTobias Hieta table_title_di_var 261*b71edfaaSTobias Hieta ) 262b9076d11SDjordje Todorovic 263b9076d11SDjordje Todorovic header_di_var = ["File", "LLVM Pass Name", "Variable", "Function", "Action"] 264b9076d11SDjordje Todorovic 265b9076d11SDjordje Todorovic for column in header_di_var: 266b9076d11SDjordje Todorovic table_di_var += " <th>{0}</th>\n".format(column.strip()) 267b9076d11SDjordje Todorovic table_di_var += " </tr>\n" 268b9076d11SDjordje Todorovic 269b9076d11SDjordje Todorovic at_least_one_bug_found = False 270b9076d11SDjordje Todorovic 271b9076d11SDjordje Todorovic # Handle var bugs. 272b9076d11SDjordje Todorovic for file, per_file_bugs in di_var_bugs.items(): 273b9076d11SDjordje Todorovic for llvm_pass, per_pass_bugs in per_file_bugs.items(): 274b9076d11SDjordje Todorovic # No SP bugs for the pass. 275b9076d11SDjordje Todorovic if len(per_pass_bugs) == 0: 276b9076d11SDjordje Todorovic continue 277b9076d11SDjordje Todorovic at_least_one_bug_found = True 278b9076d11SDjordje Todorovic row = [] 279b9076d11SDjordje Todorovic table_di_var += " </tr>\n" 280b9076d11SDjordje Todorovic # Get the bugs info. 281b9076d11SDjordje Todorovic for x in per_pass_bugs: 282b9076d11SDjordje Todorovic row.append(" <tr>\n") 283b9076d11SDjordje Todorovic row.append(file) 284b9076d11SDjordje Todorovic row.append(llvm_pass) 285b9076d11SDjordje Todorovic row.append(x.name) 286b9076d11SDjordje Todorovic row.append(x.fn_name) 287b9076d11SDjordje Todorovic row.append(x.action) 288b9076d11SDjordje Todorovic row.append(" </tr>\n") 289b9076d11SDjordje Todorovic # Dump the bugs info into the table. 290b9076d11SDjordje Todorovic for column in row: 291b9076d11SDjordje Todorovic # The same file-pass pair can have multiple bugs. 292*b71edfaaSTobias Hieta if column == " <tr>\n" or column == " </tr>\n": 293b9076d11SDjordje Todorovic table_di_var += column 294b9076d11SDjordje Todorovic continue 295b9076d11SDjordje Todorovic table_di_var += " <td>{0}</td>\n".format(column.strip()) 296b9076d11SDjordje Todorovic table_di_var += " <tr>\n" 297b9076d11SDjordje Todorovic 298b9076d11SDjordje Todorovic if not at_least_one_bug_found: 299b9076d11SDjordje Todorovic table_di_var += """<tr> 300b9076d11SDjordje Todorovic <td colspan='4'> No bugs found </td> 301b9076d11SDjordje Todorovic </tr> 302b9076d11SDjordje Todorovic """ 303b9076d11SDjordje Todorovic table_di_var += "</table>\n" 304b9076d11SDjordje Todorovic 305b9076d11SDjordje Todorovic # Create the summary table for the sp bugs. 306b9076d11SDjordje Todorovic table_title_di_var_sum = "Summary of Variable Location Bugs" 307b9076d11SDjordje Todorovic table_di_var_sum = """<table> 308b9076d11SDjordje Todorovic <caption><b>{}</b></caption> 309b9076d11SDjordje Todorovic <tr> 310*b71edfaaSTobias Hieta """.format( 311*b71edfaaSTobias Hieta table_title_di_var_sum 312*b71edfaaSTobias Hieta ) 313b9076d11SDjordje Todorovic 314b9076d11SDjordje Todorovic header_di_var_sum = ["LLVM Pass Name", "Number of bugs"] 315b9076d11SDjordje Todorovic 316b9076d11SDjordje Todorovic for column in header_di_var_sum: 317b9076d11SDjordje Todorovic table_di_var_sum += " <th>{0}</th>\n".format(column.strip()) 318b9076d11SDjordje Todorovic table_di_var_sum += " </tr>\n" 319b9076d11SDjordje Todorovic 320b9076d11SDjordje Todorovic # Print the summary. 321b9076d11SDjordje Todorovic row = [] 322b9076d11SDjordje Todorovic for llvm_pass, num in sorted(di_var_bugs_summary.items()): 323b9076d11SDjordje Todorovic row.append(" <tr>\n") 324b9076d11SDjordje Todorovic row.append(llvm_pass) 325b9076d11SDjordje Todorovic row.append(str(num)) 326b9076d11SDjordje Todorovic row.append(" </tr>\n") 327b9076d11SDjordje Todorovic for column in row: 328*b71edfaaSTobias Hieta if column == " <tr>\n" or column == " </tr>\n": 329b9076d11SDjordje Todorovic table_di_var_sum += column 330b9076d11SDjordje Todorovic continue 331b9076d11SDjordje Todorovic table_di_var_sum += " <td>{0}</td>\n".format(column.strip()) 332b9076d11SDjordje Todorovic table_di_var_sum += " <tr>\n" 333b9076d11SDjordje Todorovic 334b9076d11SDjordje Todorovic if not at_least_one_bug_found: 335b9076d11SDjordje Todorovic table_di_var_sum += """<tr> 336b9076d11SDjordje Todorovic <td colspan='2'> No bugs found </td> 337b9076d11SDjordje Todorovic </tr> 338b9076d11SDjordje Todorovic """ 339b9076d11SDjordje Todorovic table_di_var_sum += "</table>\n" 340b9076d11SDjordje Todorovic 3419f41c03fSDjordje Todorovic # Finish the html page. 3429f41c03fSDjordje Todorovic html_footer = """</body> 3439f41c03fSDjordje Todorovic </html>""" 3449f41c03fSDjordje Todorovic 3459f41c03fSDjordje Todorovic new_line = "<br>\n" 3469f41c03fSDjordje Todorovic 3479f41c03fSDjordje Todorovic fileout.writelines(html_header) 3489f41c03fSDjordje Todorovic fileout.writelines(table_di_loc) 3499f41c03fSDjordje Todorovic fileout.writelines(new_line) 3509f41c03fSDjordje Todorovic fileout.writelines(table_di_loc_sum) 3519f41c03fSDjordje Todorovic fileout.writelines(new_line) 3529f41c03fSDjordje Todorovic fileout.writelines(new_line) 3539f41c03fSDjordje Todorovic fileout.writelines(table_di_sp) 3549f41c03fSDjordje Todorovic fileout.writelines(new_line) 3559f41c03fSDjordje Todorovic fileout.writelines(table_di_sp_sum) 356b9076d11SDjordje Todorovic fileout.writelines(new_line) 357b9076d11SDjordje Todorovic fileout.writelines(new_line) 358b9076d11SDjordje Todorovic fileout.writelines(table_di_var) 359b9076d11SDjordje Todorovic fileout.writelines(new_line) 360b9076d11SDjordje Todorovic fileout.writelines(table_di_var_sum) 3619f41c03fSDjordje Todorovic fileout.writelines(html_footer) 3629f41c03fSDjordje Todorovic fileout.close() 3639f41c03fSDjordje Todorovic 3649f41c03fSDjordje Todorovic print("The " + html_file + " generated.") 3659f41c03fSDjordje Todorovic 366*b71edfaaSTobias Hieta 3678b38a2c0SNikola Tesic# Read the JSON file in chunks. 3688b38a2c0SNikola Tesicdef get_json_chunk(file, start, size): 3699f41c03fSDjordje Todorovic json_parsed = None 3709f41c03fSDjordje Todorovic di_checker_data = [] 371b5d28f3eSNikola Tesic skipped_lines = 0 3728b38a2c0SNikola Tesic line = 0 3739f41c03fSDjordje Todorovic 3749f41c03fSDjordje Todorovic # The file contains json object per line. 3759f41c03fSDjordje Todorovic # An example of the line (formatted json): 3769f41c03fSDjordje Todorovic # { 3779f41c03fSDjordje Todorovic # "file": "simple.c", 3789f41c03fSDjordje Todorovic # "pass": "Deduce function attributes in RPO", 3799f41c03fSDjordje Todorovic # "bugs": [ 3809f41c03fSDjordje Todorovic # [ 3819f41c03fSDjordje Todorovic # { 3829f41c03fSDjordje Todorovic # "action": "drop", 3839f41c03fSDjordje Todorovic # "metadata": "DISubprogram", 3849f41c03fSDjordje Todorovic # "name": "fn2" 3859f41c03fSDjordje Todorovic # }, 3869f41c03fSDjordje Todorovic # { 3879f41c03fSDjordje Todorovic # "action": "drop", 3889f41c03fSDjordje Todorovic # "metadata": "DISubprogram", 3899f41c03fSDjordje Todorovic # "name": "fn1" 3909f41c03fSDjordje Todorovic # } 3919f41c03fSDjordje Todorovic # ] 3929f41c03fSDjordje Todorovic # ] 3939f41c03fSDjordje Todorovic # } 3949f41c03fSDjordje Todorovic with open(file) as json_objects_file: 3959f41c03fSDjordje Todorovic for json_object_line in json_objects_file: 3968b38a2c0SNikola Tesic line += 1 3978b38a2c0SNikola Tesic if line < start: 3988b38a2c0SNikola Tesic continue 3998b38a2c0SNikola Tesic if line >= start + size: 4008b38a2c0SNikola Tesic break 4019f41c03fSDjordje Todorovic try: 4029f41c03fSDjordje Todorovic json_object = loads(json_object_line) 4039f41c03fSDjordje Todorovic except: 404b5d28f3eSNikola Tesic skipped_lines += 1 405b5d28f3eSNikola Tesic else: 4069f41c03fSDjordje Todorovic di_checker_data.append(json_object) 4079f41c03fSDjordje Todorovic 4088b38a2c0SNikola Tesic return (di_checker_data, skipped_lines, line) 4099f41c03fSDjordje Todorovic 410*b71edfaaSTobias Hieta 4119f41c03fSDjordje Todorovic# Parse the program arguments. 4129f41c03fSDjordje Todorovicdef parse_program_args(parser): 4139f41c03fSDjordje Todorovic parser.add_argument("file_name", type=str, help="json file to process") 4149f41c03fSDjordje Todorovic parser.add_argument("html_file", type=str, help="html file to output data") 415*b71edfaaSTobias Hieta parser.add_argument( 416*b71edfaaSTobias Hieta "-compress", action="store_true", help="create reduced html report" 417*b71edfaaSTobias Hieta ) 4189f41c03fSDjordje Todorovic 4199f41c03fSDjordje Todorovic return parser.parse_args() 4209f41c03fSDjordje Todorovic 421*b71edfaaSTobias Hieta 4229f41c03fSDjordje Todorovicdef Main(): 4239f41c03fSDjordje Todorovic parser = argparse.ArgumentParser() 4249f41c03fSDjordje Todorovic opts = parse_program_args(parser) 4259f41c03fSDjordje Todorovic 426*b71edfaaSTobias Hieta if not opts.html_file.endswith(".html"): 4279f41c03fSDjordje Todorovic print("error: The output file must be '.html'.") 4289f41c03fSDjordje Todorovic sys.exit(1) 4299f41c03fSDjordje Todorovic 4309f41c03fSDjordje Todorovic # Use the defaultdict in order to make multidim dicts. 4319f41c03fSDjordje Todorovic di_location_bugs = defaultdict(lambda: defaultdict(dict)) 4329f41c03fSDjordje Todorovic di_subprogram_bugs = defaultdict(lambda: defaultdict(dict)) 433b9076d11SDjordje Todorovic di_variable_bugs = defaultdict(lambda: defaultdict(dict)) 4349f41c03fSDjordje Todorovic 4359f41c03fSDjordje Todorovic # Use the ordered dict to make a summary. 4369f41c03fSDjordje Todorovic di_location_bugs_summary = OrderedDict() 4379f41c03fSDjordje Todorovic di_sp_bugs_summary = OrderedDict() 438b9076d11SDjordje Todorovic di_var_bugs_summary = OrderedDict() 4399f41c03fSDjordje Todorovic 4408b38a2c0SNikola Tesic # Compress similar bugs. 4418b38a2c0SNikola Tesic # DILocBugs with same pass & instruction name. 4428b38a2c0SNikola Tesic di_loc_pass_instr_set = set() 4438b38a2c0SNikola Tesic # DISPBugs with same pass & function name. 4448b38a2c0SNikola Tesic di_sp_pass_fn_set = set() 4458b38a2c0SNikola Tesic # DIVarBugs with same pass & variable name. 4468b38a2c0SNikola Tesic di_var_pass_var_set = set() 4478b38a2c0SNikola Tesic 4488b38a2c0SNikola Tesic start_line = 0 4498b38a2c0SNikola Tesic chunk_size = 1000000 4508b38a2c0SNikola Tesic end_line = chunk_size - 1 4518b38a2c0SNikola Tesic skipped_lines = 0 452b5d28f3eSNikola Tesic skipped_bugs = 0 4538b38a2c0SNikola Tesic # Process each chunk of 1 million JSON lines. 4548b38a2c0SNikola Tesic while True: 4558b38a2c0SNikola Tesic if start_line > end_line: 4568b38a2c0SNikola Tesic break 457*b71edfaaSTobias Hieta (debug_info_bugs, skipped, end_line) = get_json_chunk( 458*b71edfaaSTobias Hieta opts.file_name, start_line, chunk_size 459*b71edfaaSTobias Hieta ) 4608b38a2c0SNikola Tesic start_line += chunk_size 4618b38a2c0SNikola Tesic skipped_lines += skipped 4628b38a2c0SNikola Tesic 4639f41c03fSDjordje Todorovic # Map the bugs into the file-pass pairs. 4649f41c03fSDjordje Todorovic for bugs_per_pass in debug_info_bugs: 465b5d28f3eSNikola Tesic try: 4669f41c03fSDjordje Todorovic bugs_file = bugs_per_pass["file"] 4679f41c03fSDjordje Todorovic bugs_pass = bugs_per_pass["pass"] 4689f41c03fSDjordje Todorovic bugs = bugs_per_pass["bugs"][0] 469b5d28f3eSNikola Tesic except: 470b5d28f3eSNikola Tesic skipped_lines += 1 471b5d28f3eSNikola Tesic continue 4729f41c03fSDjordje Todorovic 4739f41c03fSDjordje Todorovic di_loc_bugs = [] 4749f41c03fSDjordje Todorovic di_sp_bugs = [] 475b9076d11SDjordje Todorovic di_var_bugs = [] 476b9076d11SDjordje Todorovic 4778b38a2c0SNikola Tesic # Omit duplicated bugs. 4788b38a2c0SNikola Tesic di_loc_set = set() 4798b38a2c0SNikola Tesic di_sp_set = set() 4808b38a2c0SNikola Tesic di_var_set = set() 4819f41c03fSDjordje Todorovic for bug in bugs: 482b5d28f3eSNikola Tesic try: 4839f41c03fSDjordje Todorovic bugs_metadata = bug["metadata"] 484b5d28f3eSNikola Tesic except: 485b5d28f3eSNikola Tesic skipped_bugs += 1 486b5d28f3eSNikola Tesic continue 487b5d28f3eSNikola Tesic 4889f41c03fSDjordje Todorovic if bugs_metadata == "DILocation": 489b5d28f3eSNikola Tesic try: 4909f41c03fSDjordje Todorovic action = bug["action"] 4919f41c03fSDjordje Todorovic bb_name = bug["bb-name"] 4929f41c03fSDjordje Todorovic fn_name = bug["fn-name"] 4939f41c03fSDjordje Todorovic instr = bug["instr"] 494b5d28f3eSNikola Tesic except: 495b5d28f3eSNikola Tesic skipped_bugs += 1 496b5d28f3eSNikola Tesic continue 4978b38a2c0SNikola Tesic di_loc_bug = DILocBug(action, bb_name, fn_name, instr) 4988b38a2c0SNikola Tesic if not str(di_loc_bug) in di_loc_set: 4998b38a2c0SNikola Tesic di_loc_set.add(str(di_loc_bug)) 5008b38a2c0SNikola Tesic if opts.compress: 5018b38a2c0SNikola Tesic pass_instr = bugs_pass + instr 5028b38a2c0SNikola Tesic if not pass_instr in di_loc_pass_instr_set: 5038b38a2c0SNikola Tesic di_loc_pass_instr_set.add(pass_instr) 5048b38a2c0SNikola Tesic di_loc_bugs.append(di_loc_bug) 5058b38a2c0SNikola Tesic else: 5068b38a2c0SNikola Tesic di_loc_bugs.append(di_loc_bug) 5079f41c03fSDjordje Todorovic 5089f41c03fSDjordje Todorovic # Fill the summary dict. 5099f41c03fSDjordje Todorovic if bugs_pass in di_location_bugs_summary: 5109f41c03fSDjordje Todorovic di_location_bugs_summary[bugs_pass] += 1 5119f41c03fSDjordje Todorovic else: 5129f41c03fSDjordje Todorovic di_location_bugs_summary[bugs_pass] = 1 5139f41c03fSDjordje Todorovic elif bugs_metadata == "DISubprogram": 514b5d28f3eSNikola Tesic try: 5159f41c03fSDjordje Todorovic action = bug["action"] 5169f41c03fSDjordje Todorovic name = bug["name"] 517b5d28f3eSNikola Tesic except: 518b5d28f3eSNikola Tesic skipped_bugs += 1 519b5d28f3eSNikola Tesic continue 5208b38a2c0SNikola Tesic di_sp_bug = DISPBug(action, name) 5218b38a2c0SNikola Tesic if not str(di_sp_bug) in di_sp_set: 5228b38a2c0SNikola Tesic di_sp_set.add(str(di_sp_bug)) 5238b38a2c0SNikola Tesic if opts.compress: 5248b38a2c0SNikola Tesic pass_fn = bugs_pass + name 5258b38a2c0SNikola Tesic if not pass_fn in di_sp_pass_fn_set: 5268b38a2c0SNikola Tesic di_sp_pass_fn_set.add(pass_fn) 5278b38a2c0SNikola Tesic di_sp_bugs.append(di_sp_bug) 5288b38a2c0SNikola Tesic else: 5298b38a2c0SNikola Tesic di_sp_bugs.append(di_sp_bug) 5309f41c03fSDjordje Todorovic 5319f41c03fSDjordje Todorovic # Fill the summary dict. 5329f41c03fSDjordje Todorovic if bugs_pass in di_sp_bugs_summary: 5339f41c03fSDjordje Todorovic di_sp_bugs_summary[bugs_pass] += 1 5349f41c03fSDjordje Todorovic else: 5359f41c03fSDjordje Todorovic di_sp_bugs_summary[bugs_pass] = 1 536b9076d11SDjordje Todorovic elif bugs_metadata == "dbg-var-intrinsic": 537b5d28f3eSNikola Tesic try: 538b9076d11SDjordje Todorovic action = bug["action"] 539b9076d11SDjordje Todorovic fn_name = bug["fn-name"] 540b9076d11SDjordje Todorovic name = bug["name"] 541b5d28f3eSNikola Tesic except: 542b5d28f3eSNikola Tesic skipped_bugs += 1 543b5d28f3eSNikola Tesic continue 5448b38a2c0SNikola Tesic di_var_bug = DIVarBug(action, name, fn_name) 5458b38a2c0SNikola Tesic if not str(di_var_bug) in di_var_set: 5468b38a2c0SNikola Tesic di_var_set.add(str(di_var_bug)) 5478b38a2c0SNikola Tesic if opts.compress: 5488b38a2c0SNikola Tesic pass_var = bugs_pass + name 5498b38a2c0SNikola Tesic if not pass_var in di_var_pass_var_set: 5508b38a2c0SNikola Tesic di_var_pass_var_set.add(pass_var) 5518b38a2c0SNikola Tesic di_var_bugs.append(di_var_bug) 5528b38a2c0SNikola Tesic else: 5538b38a2c0SNikola Tesic di_var_bugs.append(di_var_bug) 554b9076d11SDjordje Todorovic 555b9076d11SDjordje Todorovic # Fill the summary dict. 556b9076d11SDjordje Todorovic if bugs_pass in di_var_bugs_summary: 557b9076d11SDjordje Todorovic di_var_bugs_summary[bugs_pass] += 1 5589f41c03fSDjordje Todorovic else: 559b9076d11SDjordje Todorovic di_var_bugs_summary[bugs_pass] = 1 560b9076d11SDjordje Todorovic else: 561b5d28f3eSNikola Tesic # Unsupported metadata. 562b5d28f3eSNikola Tesic skipped_bugs += 1 563b5d28f3eSNikola Tesic continue 5649f41c03fSDjordje Todorovic 5659f41c03fSDjordje Todorovic di_location_bugs[bugs_file][bugs_pass] = di_loc_bugs 5669f41c03fSDjordje Todorovic di_subprogram_bugs[bugs_file][bugs_pass] = di_sp_bugs 567b9076d11SDjordje Todorovic di_variable_bugs[bugs_file][bugs_pass] = di_var_bugs 5689f41c03fSDjordje Todorovic 569*b71edfaaSTobias Hieta generate_html_report( 570*b71edfaaSTobias Hieta di_location_bugs, 571*b71edfaaSTobias Hieta di_subprogram_bugs, 572*b71edfaaSTobias Hieta di_variable_bugs, 573*b71edfaaSTobias Hieta di_location_bugs_summary, 574*b71edfaaSTobias Hieta di_sp_bugs_summary, 575*b71edfaaSTobias Hieta di_var_bugs_summary, 576*b71edfaaSTobias Hieta opts.html_file, 577*b71edfaaSTobias Hieta ) 5789f41c03fSDjordje Todorovic 579b5d28f3eSNikola Tesic if skipped_lines > 0: 580b5d28f3eSNikola Tesic print("Skipped lines: " + str(skipped_lines)) 581b5d28f3eSNikola Tesic if skipped_bugs > 0: 582b5d28f3eSNikola Tesic print("Skipped bugs: " + str(skipped_bugs)) 583b5d28f3eSNikola Tesic 584*b71edfaaSTobias Hieta 5859f41c03fSDjordje Todorovicif __name__ == "__main__": 5869f41c03fSDjordje Todorovic Main() 5879f41c03fSDjordje Todorovic sys.exit(0) 588