Я пытаюсь использовать demangler с инструментом отчетов llvm-cov. Следующая команда, которую я запускаю:
llvm-cov report /path/to/executable -instr-profile /path/to/default.profdata /path/to/src/ -Xdemangler c++filt -Xdemangler -n
Я попытался переупорядочить параметры и попытался использовать «-Xdemangler = c ++ фильтр -Xdemangler = -n» вместо этого, а также использовать —no-strip-underscore вместо -n. Он не жалуется на деманглера, тогда как, если я делаю очевидную ошибку с командным синтаксисом, он говорит мне, но вывод не деформируется.
Из документации llvm-cov:
-Xdemangler =< ИНСТРУМЕНТ> |< ИНСТРУМЕНТ-ОПЦИЯ>
Укажите символ деманглера. Это может использоваться, чтобы сделать отчеты более удобочитаемыми. Эта опция может быть указана несколько раз для предоставления аргументов деманглеру (например, -Xdemangler c ++ Filter -Xdemangler -n для C ++). Ожидается, что demangler будет читать список символов, разделенных новой строкой, из stdin и записывать список строк, разделенных новой строкой, той же длины в стандартный вывод.
Я использовал следующее, чтобы убедиться, что C ++ Filter работает, и это работает:
c++filt -n _ZN4core6ZipperC2ENSt3__110shared_ptrIN8core_gen14PlatformZipperEEE
Выход:
core::Zipper::Zipper(std::__1::shared_ptr<core_gen::PlatformZipper>)
Я должен использовать опцию -n, иначе она не будет разобрана, но я в растерянности, почему llvm-cov, похоже, не использует ее правильно.
Я также пытался использовать сценарий оболочки, чтобы попытаться перехватить ввод, который llvm-cov дает деманглеру, и записать его в файл перед вызовом c ++ фильт, но файл был пустым, когда я посмотрел после выполнения команды.
Я делаю что-то неправильно?
Похоже, что использование имен разделенных функций не везде подключено в llvm-cov.
Этот отчет ( -name-regex
опция необходима для получения имен функций) отвечает на -Xdemangler
опция:
llvm-cov report /path/to/exe -name-regex=\.* -instr-profile=default.profdata -Xdemangler=c++filt
Я вижу, это исправлено в https://reviews.llvm.org/rL294136
Других решений пока нет …