Skip to content

Commit

Permalink
[Coverage] Normalize '..' out of filename strings
Browse files Browse the repository at this point in the history
This fixes the issue of having duplicate entries for the same file in a
coverage report s.t none of the entries actually displayed the correct
coverage information.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275913 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
vedantk committed Jul 18, 2016
1 parent 5de4c50 commit bca87a6
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
22 changes: 14 additions & 8 deletions lib/CodeGen/CoverageMappingGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "llvm/ProfileData/Coverage/CoverageMappingWriter.h"
#include "llvm/ProfileData/InstrProfReader.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/Path.h"

using namespace clang;
using namespace CodeGen;
Expand Down Expand Up @@ -920,16 +921,24 @@ struct CounterCoverageMappingBuilder
// propagate counts into them.
}
};
}

static bool isMachO(const CodeGenModule &CGM) {
bool isMachO(const CodeGenModule &CGM) {
return CGM.getTarget().getTriple().isOSBinFormatMachO();
}

static StringRef getCoverageSection(const CodeGenModule &CGM) {
StringRef getCoverageSection(const CodeGenModule &CGM) {
return llvm::getInstrProfCoverageSectionName(isMachO(CGM));
}

std::string normalizeFilename(StringRef Filename) {
llvm::SmallString<256> Path(Filename);
llvm::sys::path::remove_dots(Path, /*remove_dot_dots=*/true);
llvm::sys::fs::make_absolute(Path);
return Path.str().str();
}

} // end anonymous namespace

static void dump(llvm::raw_ostream &OS, StringRef FunctionName,
ArrayRef<CounterExpression> Expressions,
ArrayRef<CounterMappingRegion> Regions) {
Expand Down Expand Up @@ -994,7 +1003,7 @@ void CoverageMappingModuleGen::addFunctionMappingRecord(
llvm::SmallVector<StringRef, 16> FilenameRefs;
FilenameRefs.resize(FileEntries.size());
for (const auto &Entry : FileEntries)
FilenameRefs[Entry.second] = Entry.first->getName();
FilenameRefs[Entry.second] = normalizeFilename(Entry.first->getName());
RawCoverageMappingReader Reader(CoverageMapping, FilenameRefs, Filenames,
Expressions, Regions);
if (Reader.read())
Expand All @@ -1015,11 +1024,8 @@ void CoverageMappingModuleGen::emit() {
FilenameStrs.resize(FileEntries.size());
FilenameRefs.resize(FileEntries.size());
for (const auto &Entry : FileEntries) {
llvm::SmallString<256> Path(Entry.first->getName());
llvm::sys::fs::make_absolute(Path);

auto I = Entry.second;
FilenameStrs[I] = std::string(Path.begin(), Path.end());
FilenameStrs[I] = normalizeFilename(Entry.first->getName());
FilenameRefs[I] = FilenameStrs[I];
}

Expand Down
7 changes: 7 additions & 0 deletions test/CoverageMapping/abspath.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// RUN: %clang_cc1 -fprofile-instrument=clang -fcoverage-mapping -emit-llvm -main-file-name abspath.cpp %S/Inputs/../abspath.cpp -o - | FileCheck %s

// CHECK: @__llvm_coverage_mapping = {{.*}}"\01
// CHECK-NOT: Inputs
// CHECK: "

void f1() {}

0 comments on commit bca87a6

Please sign in to comment.