xref: /llvm-project/llvm/utils/llvm-original-di-preservation.py (revision b71edfaa4ec3c998aadb35255ce2f60bba2940b0)
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