[PATCH] Code coverage tool that uses the new coverage mapping format and clang's instrumentation based profiling data
Duncan P. N. Exon Smith
dexonsmith at apple.com
Thu Aug 21 12:44:44 PDT 2014
> On 2014-Aug-21, at 12:21, Alex Lorenz <arphaman at gmail.com> wrote:
>
> Thanks for the suggestions, I have updated the patch and have some comments:
>
> This pattern shows up a few times. It might be nicer to make an RAII
> object for it and write something like:
>
> {
> ColoredOutputRAII C(ViewOpts.Colors, outs(), raw_ostream::CYAN);
> outs() << Function.PrettyName << " from " << SourceFile << ":";
> }
>
> WDYT?
>
> I've implemented something similar to this in the updated patch, please take a look.
>
> I wonder if we really need both Regions and SortedRegions in this
> structure. It looks like regions is just used to unique the input, and
> then when we want to use it, we sort first.
>
> How many duplicate entries do we expect? Would it make sense to add
> items directly to the vector, and then std::unique it?
>
> std::unique isn't really suitable as we have to sum the execution counts somehow. The number of duplicate entries depends on the particular source code - the use of macros and templates will increase this.
`std::unique` is simple to write and customize. IIUC, your flow is to
gather and coalesce the regions, then sort them (for profit?). You can
change this to gather, then sort and coalesce. `std::unordered_map` is
a pretty heavy tool unless you actually need its iterator guarantees.
This is how you can sort and coalesce:
if (Regions.size() <= 1)
return;
std::sort(Regions.begin(), Regions.end());
auto O = Regions.begin();
for (auto I = O + 1, E = Regions.end(); I != E; ++I)
if (I->first == O->first)
O->second += I->second;
else
*++O = std::move(*I);
Regions.erase(++O, Regions.end());
> Any reason this can't be a DenseMap?
>
> It's simpler to use unordered_map here as DenseMap needs DenseMapInfo.
You've done most of the work already by writing a hash function.
`unordered_map<>` is a heavy tool, so you should prefer `DenseMap<>`
unless you need its guarantees.
>
> I've also removed the demangling support as it's something that can be committed in a later patch.
>
> http://reviews.llvm.org/D4445
>
> Files:
> tools/llvm-cov/CMakeLists.txt
> tools/llvm-cov/CodeCoverage.cpp
> tools/llvm-cov/CoverageFilters.cpp
> tools/llvm-cov/CoverageFilters.h
> tools/llvm-cov/CoverageReport.cpp
> tools/llvm-cov/CoverageReport.h
> tools/llvm-cov/CoverageSummary.cpp
> tools/llvm-cov/CoverageSummary.h
> tools/llvm-cov/CoverageSummaryInfo.cpp
> tools/llvm-cov/CoverageSummaryInfo.h
> tools/llvm-cov/CoverageViewOptions.h
> tools/llvm-cov/FunctionCoverageMapping.h
> tools/llvm-cov/LLVMBuild.txt
> tools/llvm-cov/Makefile
> tools/llvm-cov/RenderingSupport.h
> tools/llvm-cov/SourceCoverageDataManager.cpp
> tools/llvm-cov/SourceCoverageDataManager.h
> tools/llvm-cov/SourceCoverageView.cpp
> tools/llvm-cov/SourceCoverageView.h
> tools/llvm-cov/llvm-cov.cpp
> <D4445.12790.patch>
More information about the llvm-commits
mailing list