Index: llvm/lib/Transforms/Utils/Debugify.cpp =================================================================== --- llvm/lib/Transforms/Utils/Debugify.cpp +++ llvm/lib/Transforms/Utils/Debugify.cpp @@ -502,15 +502,19 @@ return; } - OS_FILE << "{\"file\":\"" << FileNameFromCU << "\", "; + if (auto L = OS_FILE.lock()) { + OS_FILE << "{\"file\":\"" << FileNameFromCU << "\", "; - StringRef PassName = NameOfWrappedPass != "" ? NameOfWrappedPass : "no-name"; - OS_FILE << "\"pass\":\"" << PassName << "\", "; + StringRef PassName = + NameOfWrappedPass != "" ? NameOfWrappedPass : "no-name"; + OS_FILE << "\"pass\":\"" << PassName << "\", "; - llvm::json::Value BugsToPrint{std::move(Bugs)}; - OS_FILE << "\"bugs\": " << BugsToPrint; + llvm::json::Value BugsToPrint{std::move(Bugs)}; + OS_FILE << "\"bugs\": " << BugsToPrint; - OS_FILE << "}\n"; + OS_FILE << "}\n"; + } + OS_FILE.close(); } bool llvm::checkDebugInfoMetadata(Module &M, Index: llvm/test/tools/llvm-original-di-preservation/Inputs/corrupted.json =================================================================== --- /dev/null +++ llvm/test/tools/llvm-original-di-preservation/Inputs/corrupted.json @@ -0,0 +1,10 @@ +{"file":"debug.c", "pass":"Simplify the CFG", "bugs": [[{"action":"drop","fn-name":"debug_class_type_samep","metadata":"dbg-var-intrinsic","name":"pf1"},{"action":"drop","fn-name":"debug_class_type_samep","metadata":"dbg-var-intrinsic","name":"pf2"},{"action":"drop","fn-name":"debug_class_type_samep","metadata":"dbg-var-intrinsic","name":"pv1"},{"action":"drop","fn-name":"debug_class_type_samep","metadata":"dbg-var-intrinsic","name":"pv2"}]]} +{"file":"debug.c", "pass":"Combine redundant instructions", "bugs": [[{"action":"drop","fn-name":"debug_write_block","metadata":"dbg-var-intrinsic","name":"n"},{"action":"drop","fn-name":"debug_write_block","metadata":"dbg-var-intrinsic","name":"b"}]]} +{"file":"ieee.c", "pass":"Interprocedural Sparse Conditional Constant Propagation", "bugs": [[{"action":"not-generate","bb-name":"land.lhs.true251","fn-name":"parse_ieee_bb","instr":"br","metadata":"DILocation"},{"action":"not-generate","bb-name":"cond.false70","fn-n{"file":"stabs.c", "pass":"Simplify the CFG", "bugs": [[{"action":"not-generate","bb-name":"land.lhs.true76","fn-name":"parse_stab","instr":"icmp","metadata":"DILocation"}]]} +ame":"ieee_end_class_type","instr":"br","metadata":"DILocation"},{"action":"not-generate","bb-name":"lor.lhs.false79","fn-name":"ieee_end_class_type","instr":"br","metadata":"DILocation"}]]} +{"file":"wrstabs.c", "pass":"Simplify the CFG", "bugs": [[{"action":"drop","fn-name":"stab_bool_type","metadata":"dbg-var-intrinsic","name":"tindex"}]]} +{"file":"prdbg.c", "pass":"Simplify the CFG", "bugs": [[{"action":"drop","fn-name":"pr_tag_type","metadata":"dbg-var-intrinsic","name":"t"},{"action":"drop","fn-name":"pr_tag_type","metadata":"dbg-var-intrinsic","name":"tag"}]]} +{"file":"objdump.c", "pass":"Simplify the CFG", "bugs": [[{"action":"drop","fn-name":"dump_section_header","metadata":"dbg-var-intrinsic","name":"comma"},{"action":"drop","fn-name":"dump_section_header","metadata":"dbg-var-intrinsic","name":"ls"}]]} +{"file":"objdump.c", "bad-field": [[{"action":"drop","fn-name":"dump_section_header","metadata":"dbg-var-intrinsic","name":"comma"},{"action":"drop","fn-name":"dump_section_header","metadata":"dbg-var-intrinsic","name":"ls"}]]} +{"file":"wrstabs.c", "pass":"Simplify the CFG", "bugs": [[{"bad-bug":"stab_function_type"}]]} +{"file":"wrstabs.c", "pass":"Simplify the CFG", "bugs": [[{"action":"drop","bb-name":"if.end","fn-name":"stab_function_type","instr":"br","metadata":"DILocation"}]]} Index: llvm/test/tools/llvm-original-di-preservation/Inputs/expected-skipped.html =================================================================== --- /dev/null +++ llvm/test/tools/llvm-original-di-preservation/Inputs/expected-skipped.html @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +
Location Bugs found by the Debugify
FileLLVM Pass NameLLVM IR InstructionFunction NameBasic Block NameAction
wrstabs.cSimplify the CFGbrstab_function_typeif.enddrop
+
+ + + + + + + + + + + +
Summary of Location Bugs
LLVM Pass NameNumber of bugs
Simplify the CFG1
+
+
+ + + + + + + + + + + +
SP Bugs found by the Debugify
FileLLVM Pass NameFunction NameAction
No bugs found
+
+ + + + + + + + + + +
Summary of SP Bugs
LLVM Pass NameNumber of bugs
No bugs found
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Variable Location Bugs found by the Debugify
FileLLVM Pass NameVariableFunctionAction
debug.cSimplify the CFGpf1debug_class_type_samepdrop
debug.cSimplify the CFGpf2debug_class_type_samepdrop
debug.cSimplify the CFGpv1debug_class_type_samepdrop
debug.cSimplify the CFGpv2debug_class_type_samepdrop
debug.cCombine redundant instructionsndebug_write_blockdrop
debug.cCombine redundant instructionsbdebug_write_blockdrop
prdbg.cSimplify the CFGtpr_tag_typedrop
prdbg.cSimplify the CFGtagpr_tag_typedrop
objdump.cSimplify the CFGcommadump_section_headerdrop
objdump.cSimplify the CFGlsdump_section_headerdrop
+
+ + + + + + + + + + + + + + + +
Summary of Variable Location Bugs
LLVM Pass NameNumber of bugs
Combine redundant instructions2
Simplify the CFG9
+ + \ No newline at end of file Index: llvm/test/tools/llvm-original-di-preservation/basic.test =================================================================== --- llvm/test/tools/llvm-original-di-preservation/basic.test +++ llvm/test/tools/llvm-original-di-preservation/basic.test @@ -1,2 +1,8 @@ -RUN: %llvm-original-di-preservation %p/Inputs/sample.json %t.html +RUN: %llvm-original-di-preservation %p/Inputs/sample.json %t.html | FileCheck %s RUN: diff -w %p/Inputs/expected-sample.html %t.html +CHECK-NOT: Skipped lines: + +RUN: %llvm-original-di-preservation %p/Inputs/corrupted.json %t2.html | FileCheck %s -check-prefix=CORRUPTED +RUN: diff -w %p/Inputs/expected-skipped.html %t2.html +CORRUPTED: Skipped lines: 3 +CORRUPTED: Skipped bugs: 1 Index: llvm/utils/llvm-original-di-preservation.py =================================================================== --- llvm/utils/llvm-original-di-preservation.py +++ llvm/utils/llvm-original-di-preservation.py @@ -330,6 +330,7 @@ def get_json(file): json_parsed = None di_checker_data = [] + skipped_lines = 0 # The file contains json object per line. # An example of the line (formatted json): @@ -356,11 +357,11 @@ try: json_object = loads(json_object_line) except: - print ("error: No valid di-checker data found.") - sys.exit(1) - di_checker_data.append(json_object) + skipped_lines += 1 + else: + di_checker_data.append(json_object) - return di_checker_data + return (di_checker_data, skipped_lines) # Parse the program arguments. def parse_program_args(parser): @@ -377,7 +378,7 @@ print ("error: The output file must be '.html'.") sys.exit(1) - debug_info_bugs = get_json(opts.file_name) + (debug_info_bugs, skipped_lines) = get_json(opts.file_name) # Use the defaultdict in order to make multidim dicts. di_location_bugs = defaultdict(lambda: defaultdict(dict)) @@ -389,24 +390,37 @@ di_sp_bugs_summary = OrderedDict() di_var_bugs_summary = OrderedDict() + skipped_bugs = 0 # Map the bugs into the file-pass pairs. for bugs_per_pass in debug_info_bugs: - bugs_file = bugs_per_pass["file"] - bugs_pass = bugs_per_pass["pass"] - - bugs = bugs_per_pass["bugs"][0] + try: + bugs_file = bugs_per_pass["file"] + bugs_pass = bugs_per_pass["pass"] + bugs = bugs_per_pass["bugs"][0] + except: + skipped_lines += 1 + continue di_loc_bugs = [] di_sp_bugs = [] di_var_bugs = [] for bug in bugs: - bugs_metadata = bug["metadata"] + try: + bugs_metadata = bug["metadata"] + except: + skipped_bugs += 1 + continue + if bugs_metadata == "DILocation": - action = bug["action"] - bb_name = bug["bb-name"] - fn_name = bug["fn-name"] - instr = bug["instr"] + try: + action = bug["action"] + bb_name = bug["bb-name"] + fn_name = bug["fn-name"] + instr = bug["instr"] + except: + skipped_bugs += 1 + continue di_loc_bugs.append(DILocBug(action, bb_name, fn_name, instr)) # Fill the summary dict. @@ -415,8 +429,12 @@ else: di_location_bugs_summary[bugs_pass] = 1 elif bugs_metadata == "DISubprogram": - action = bug["action"] - name = bug["name"] + try: + action = bug["action"] + name = bug["name"] + except: + skipped_bugs += 1 + continue di_sp_bugs.append(DISPBug(action, name)) # Fill the summary dict. @@ -425,9 +443,13 @@ else: di_sp_bugs_summary[bugs_pass] = 1 elif bugs_metadata == "dbg-var-intrinsic": - action = bug["action"] - fn_name = bug["fn-name"] - name = bug["name"] + try: + action = bug["action"] + fn_name = bug["fn-name"] + name = bug["name"] + except: + skipped_bugs += 1 + continue di_var_bugs.append(DIVarBug(action, name, fn_name)) # Fill the summary dict. @@ -436,8 +458,9 @@ else: di_var_bugs_summary[bugs_pass] = 1 else: - print ("error: Unsupported metadata.") - sys.exit(1) + # Unsupported metadata. + skipped_bugs += 1 + continue di_location_bugs[bugs_file][bugs_pass] = di_loc_bugs di_subprogram_bugs[bugs_file][bugs_pass] = di_sp_bugs @@ -447,6 +470,11 @@ di_location_bugs_summary, di_sp_bugs_summary, \ di_var_bugs_summary, opts.html_file) + if skipped_lines > 0: + print ("Skipped lines: " + str(skipped_lines)) + if skipped_bugs > 0: + print ("Skipped bugs: " + str(skipped_bugs)) + if __name__ == "__main__": Main() sys.exit(0)