Index: llvm/lib/Transforms/Utils/Debugify.cpp
===================================================================
--- llvm/lib/Transforms/Utils/Debugify.cpp
+++ llvm/lib/Transforms/Utils/Debugify.cpp
@@ -502,15 +502,18 @@
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
+
+ File |
+ LLVM Pass Name |
+ LLVM IR Instruction |
+ Function Name |
+ Basic Block Name |
+ Action |
+
+
+
+ wrstabs.c |
+ Simplify the CFG |
+ br |
+ stab_function_type |
+ if.end |
+ drop |
+
+
+
+
+
+ Summary of Location Bugs
+
+ LLVM Pass Name |
+ Number of bugs |
+
+
+ Simplify the CFG |
+ 1 |
+
+
+
+
+
+
+ SP Bugs found by the Debugify
+
+ File |
+ LLVM Pass Name |
+ Function Name |
+ Action |
+
+
+ No bugs found |
+
+
+
+
+ Summary of SP Bugs
+
+ LLVM Pass Name |
+ Number of bugs |
+
+
+
+ No bugs found |
+
+
+
+
+
+ Variable Location Bugs found by the Debugify
+
+ File |
+ LLVM Pass Name |
+ Variable |
+ Function |
+ Action |
+
+
+
+ debug.c |
+ Simplify the CFG |
+ pf1 |
+ debug_class_type_samep |
+ drop |
+
+
+ debug.c |
+ Simplify the CFG |
+ pf2 |
+ debug_class_type_samep |
+ drop |
+
+
+ debug.c |
+ Simplify the CFG |
+ pv1 |
+ debug_class_type_samep |
+ drop |
+
+
+ debug.c |
+ Simplify the CFG |
+ pv2 |
+ debug_class_type_samep |
+ drop |
+
+
+
+
+ debug.c |
+ Combine redundant instructions |
+ n |
+ debug_write_block |
+ drop |
+
+
+ debug.c |
+ Combine redundant instructions |
+ b |
+ debug_write_block |
+ drop |
+
+
+
+
+ prdbg.c |
+ Simplify the CFG |
+ t |
+ pr_tag_type |
+ drop |
+
+
+ prdbg.c |
+ Simplify the CFG |
+ tag |
+ pr_tag_type |
+ drop |
+
+
+
+
+ objdump.c |
+ Simplify the CFG |
+ comma |
+ dump_section_header |
+ drop |
+
+
+ objdump.c |
+ Simplify the CFG |
+ ls |
+ dump_section_header |
+ drop |
+
+
+
+
+
+ Summary of Variable Location Bugs
+
+ LLVM Pass Name |
+ Number of bugs |
+
+
+ Combine redundant instructions |
+ 2 |
+
+
+ Simplify the CFG |
+ 9 |
+
+
+
+
+
\ 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,7 @@
-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
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,8 @@
print ("error: The output file must be '.html'.")
sys.exit(1)
- debug_info_bugs = get_json(opts.file_name)
+ skipped_lines = 0
+ (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))
@@ -391,22 +393,32 @@
# 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:
+ 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:
+ continue
di_loc_bugs.append(DILocBug(action, bb_name, fn_name, instr))
# Fill the summary dict.
@@ -415,8 +427,11 @@
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:
+ continue
di_sp_bugs.append(DISPBug(action, name))
# Fill the summary dict.
@@ -425,9 +440,12 @@
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:
+ continue
di_var_bugs.append(DIVarBug(action, name, fn_name))
# Fill the summary dict.
@@ -436,8 +454,8 @@
else:
di_var_bugs_summary[bugs_pass] = 1
else:
- print ("error: Unsupported metadata.")
- sys.exit(1)
+ # Unsupported metadata.
+ continue
di_location_bugs[bugs_file][bugs_pass] = di_loc_bugs
di_subprogram_bugs[bugs_file][bugs_pass] = di_sp_bugs
@@ -447,6 +465,9 @@
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 __name__ == "__main__":
Main()
sys.exit(0)