]> granicus.if.org Git - clang/commitdiff
Revert "[Coverage] Adopt llvm::coverage::encodeFilenamesAndRawMappings (NFC)"
authorVedant Kumar <vsk@apple.com>
Wed, 29 Jun 2016 05:33:09 +0000 (05:33 +0000)
committerVedant Kumar <vsk@apple.com>
Wed, 29 Jun 2016 05:33:09 +0000 (05:33 +0000)
This reverts commit 161ff9db3a3d0d62880d1cb18d58182cd3034912 (r273056).

This is breaking stage2 instrumented builds with "malformed coverage
data" errors.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274104 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CoverageMappingGen.cpp

index b56cd077c8b4acc477dd85844bb69170117c6db3..3980c4704ce284315775ded1c7c96dc8a17be0d2 100644 (file)
@@ -1013,27 +1013,35 @@ void CoverageMappingModuleGen::emit() {
 
   // Create the filenames and merge them with coverage mappings
   llvm::SmallVector<std::string, 16> FilenameStrs;
+  llvm::SmallVector<StringRef, 16> FilenameRefs;
   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());
+    FilenameRefs[I] = FilenameStrs[I];
   }
 
-  size_t FilenamesSize;
-  size_t CoverageMappingSize;
-  llvm::Expected<std::string> CoverageDataOrErr = encodeFilenamesAndRawMappings(
-      FilenameStrs, CoverageMappings, FilenamesSize, CoverageMappingSize);
-  if (llvm::Error E = CoverageDataOrErr.takeError()) {
-    llvm::handleAllErrors(std::move(E), [](llvm::ErrorInfoBase &EI) {
-      llvm::report_fatal_error(EI.message());
-    });
+  std::string FilenamesAndCoverageMappings;
+  llvm::raw_string_ostream OS(FilenamesAndCoverageMappings);
+  CoverageFilenamesSectionWriter(FilenameRefs).write(OS);
+  std::string RawCoverageMappings =
+      llvm::join(CoverageMappings.begin(), CoverageMappings.end(), "");
+  OS << RawCoverageMappings;
+  size_t CoverageMappingSize = RawCoverageMappings.size();
+  size_t FilenamesSize = OS.str().size() - CoverageMappingSize;
+  // Append extra zeroes if necessary to ensure that the size of the filenames
+  // and coverage mappings is a multiple of 8.
+  if (size_t Rem = OS.str().size() % 8) {
+    CoverageMappingSize += 8 - Rem;
+    for (size_t I = 0, S = 8 - Rem; I < S; ++I)
+      OS << '\0';
   }
-  std::string CoverageData = std::move(CoverageDataOrErr.get());
   auto *FilenamesAndMappingsVal =
-      llvm::ConstantDataArray::getString(Ctx, CoverageData, false);
+      llvm::ConstantDataArray::getString(Ctx, OS.str(), false);
 
   // Create the deferred function records array
   auto RecordsTy =