| mod covfun; |
| mod covmap; |
| mod llvm_utils; |
| mod parser; |
| mod prf_names; |
| |
| fn main() -> anyhow::Result<()> { |
| use anyhow::Context as _; |
| |
| let args = std::env::args().collect::<Vec<_>>(); |
| |
| // The coverage-dump tool already needs `rustc_demangle` in order to read |
| // coverage metadata, so it's very easy to also have a separate mode that |
| // turns it into a command-line demangler for use by coverage-run tests. |
| if &args[1..] == &["--demangle"] { |
| return demangle(); |
| } |
| |
| let llvm_ir_path = args.get(1).context("LLVM IR file not specified")?; |
| let llvm_ir = std::fs::read_to_string(llvm_ir_path).context("couldn't read LLVM IR file")?; |
| |
| let filename_tables = covmap::make_filename_tables(&llvm_ir)?; |
| let function_names = crate::prf_names::make_function_names_table(&llvm_ir)?; |
| crate::covfun::dump_covfun_mappings(&llvm_ir, &filename_tables, &function_names)?; |
| |
| Ok(()) |
| } |
| |
| fn demangle() -> anyhow::Result<()> { |
| use std::fmt::Write as _; |
| |
| let stdin = std::io::read_to_string(std::io::stdin())?; |
| let mut output = String::with_capacity(stdin.len()); |
| for line in stdin.lines() { |
| writeln!(output, "{:#}", rustc_demangle::demangle(line))?; |
| } |
| print!("{output}"); |
| Ok(()) |
| } |