<div dir="ltr">The test was never executed because of its file extension, had errors and in it and also doesn't pass. See r231908.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 11, 2015 at 3:30 AM, Justin Bogner <span dir="ltr"><<a href="mailto:mail@justinbogner.com" target="_blank">mail@justinbogner.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: bogner<br>
Date: Tue Mar 10 21:30:51 2015<br>
New Revision: 231902<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=231902&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=231902&view=rev</a><br>
Log:<br>
InstrProf: Teach llvm-cov to handle universal binaries when given -arch<br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary   (with props)<br>
    llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary.proftext<br>
    llvm/trunk/test/tools/llvm-cov/universal-binary.c<br>
Modified:<br>
    llvm/trunk/include/llvm/ProfileData/CoverageMapping.h<br>
    llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h<br>
    llvm/trunk/lib/ProfileData/CoverageMapping.cpp<br>
    llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp<br>
    llvm/trunk/tools/llvm-cov/CodeCoverage.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ProfileData/CoverageMapping.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/CoverageMapping.h?rev=231902&r1=231901&r2=231902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/CoverageMapping.h?rev=231902&r1=231901&r2=231902&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ProfileData/CoverageMapping.h (original)<br>
+++ llvm/trunk/include/llvm/ProfileData/CoverageMapping.h Tue Mar 10 21:30:51 2015<br>
@@ -18,6 +18,7 @@<br>
 #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/DenseMap.h"<br>
 #include "llvm/ADT/Hashing.h"<br>
+#include "llvm/ADT/Triple.h"<br>
 #include "llvm/ADT/iterator.h"<br>
 #include "llvm/Support/Debug.h"<br>
 #include "llvm/Support/ErrorOr.h"<br>
@@ -408,7 +409,8 @@ public:<br>
<br>
   /// \brief Load the coverage mapping from the given files.<br>
   static ErrorOr<std::unique_ptr<CoverageMapping>><br>
-  load(StringRef ObjectFilename, StringRef ProfileFilename);<br>
+  load(StringRef ObjectFilename, StringRef ProfileFilename,<br>
+       Triple::ArchType Arch = Triple::ArchType::UnknownArch);<br>
<br>
   /// \brief The number of functions that couldn't have their profiles mapped.<br>
   ///<br>
<br>
Modified: llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h?rev=231902&r1=231901&r2=231902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h?rev=231902&r1=231901&r2=231902&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h (original)<br>
+++ llvm/trunk/include/llvm/ProfileData/CoverageMappingReader.h Tue Mar 10 21:30:51 2015<br>
@@ -17,6 +17,7 @@<br>
<br>
 #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
+#include "llvm/ADT/Triple.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
 #include "llvm/ProfileData/CoverageMapping.h"<br>
 #include "llvm/ProfileData/InstrProf.h"<br>
@@ -175,7 +176,8 @@ private:<br>
<br>
 public:<br>
   static ErrorOr<std::unique_ptr<BinaryCoverageReader>><br>
-  create(std::unique_ptr<MemoryBuffer> &ObjectBuffer);<br>
+  create(std::unique_ptr<MemoryBuffer> &ObjectBuffer,<br>
+         Triple::ArchType Arch = Triple::ArchType::UnknownArch);<br>
<br>
   std::error_code readNextRecord(CoverageMappingRecord &Record) override;<br>
 };<br>
<br>
Modified: llvm/trunk/lib/ProfileData/CoverageMapping.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/CoverageMapping.cpp?rev=231902&r1=231901&r2=231902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/CoverageMapping.cpp?rev=231902&r1=231901&r2=231902&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ProfileData/CoverageMapping.cpp (original)<br>
+++ llvm/trunk/lib/ProfileData/CoverageMapping.cpp Tue Mar 10 21:30:51 2015<br>
@@ -217,12 +217,13 @@ CoverageMapping::load(CoverageMappingRea<br>
 }<br>
<br>
 ErrorOr<std::unique_ptr<CoverageMapping>><br>
-CoverageMapping::load(StringRef ObjectFilename, StringRef ProfileFilename) {<br>
+CoverageMapping::load(StringRef ObjectFilename, StringRef ProfileFilename,<br>
+                      Triple::ArchType Arch) {<br>
   auto CounterMappingBuff = MemoryBuffer::getFileOrSTDIN(ObjectFilename);<br>
   if (std::error_code EC = CounterMappingBuff.getError())<br>
     return EC;<br>
   auto CoverageReaderOrErr =<br>
-      BinaryCoverageReader::create(CounterMappingBuff.get());<br>
+      BinaryCoverageReader::create(CounterMappingBuff.get(), Arch);<br>
   if (std::error_code EC = CoverageReaderOrErr.getError())<br>
     return EC;<br>
   auto CoverageReader = std::move(CoverageReaderOrErr.get());<br>
<br>
Modified: llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp?rev=231902&r1=231901&r2=231902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp?rev=231902&r1=231901&r2=231902&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp (original)<br>
+++ llvm/trunk/lib/ProfileData/CoverageMappingReader.cpp Tue Mar 10 21:30:51 2015<br>
@@ -14,6 +14,7 @@<br>
<br>
 #include "llvm/ProfileData/CoverageMappingReader.h"<br>
 #include "llvm/ADT/DenseSet.h"<br>
+#include "llvm/Object/MachOUniversal.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
 #include "llvm/Support/Debug.h"<br>
 #include "llvm/Support/LEB128.h"<br>
@@ -444,11 +445,31 @@ static std::error_code loadTestingFormat<br>
 static std::error_code loadBinaryFormat(MemoryBufferRef ObjectBuffer,<br>
                                         SectionData &ProfileNames,<br>
                                         StringRef &CoverageMapping,<br>
-                                        uint8_t &BytesInAddress) {<br>
-  auto ObjectFileOrErr = object::ObjectFile::createObjectFile(ObjectBuffer);<br>
-  if (std::error_code EC = ObjectFileOrErr.getError())<br>
+                                        uint8_t &BytesInAddress,<br>
+                                        Triple::ArchType Arch) {<br>
+  auto BinOrErr = object::createBinary(ObjectBuffer);<br>
+  if (std::error_code EC = BinOrErr.getError())<br>
     return EC;<br>
-  auto OF = std::move(ObjectFileOrErr.get());<br>
+  auto Bin = std::move(BinOrErr.get());<br>
+  std::unique_ptr<ObjectFile> OF;<br>
+  if (auto *Universal = dyn_cast<object::MachOUniversalBinary>(Bin.get())) {<br>
+    // If we have a universal binary, try to look up the object for the<br>
+    // appropriate architecture.<br>
+    auto ObjectFileOrErr = Universal->getObjectForArch(Arch);<br>
+    if (std::error_code EC = ObjectFileOrErr.getError())<br>
+      return EC;<br>
+    OF = std::move(ObjectFileOrErr.get());<br>
+  } else if (isa<object::ObjectFile>(Bin.get())) {<br>
+    // For any other object file, upcast and take ownership.<br>
+    OF.reset(cast<object::ObjectFile>(Bin.release()));<br>
+    // If we've asked for a particular arch, make sure they match.<br>
+    if (Arch != Triple::ArchType::UnknownArch && OF->getArch() != Arch)<br>
+      return object_error::arch_not_found;<br>
+  } else<br>
+    // We can only handle object files.<br>
+    return instrprof_error::malformed;<br>
+<br>
+  // The coverage uses native pointer sizes for the object it's written in.<br>
   BytesInAddress = OF->getBytesInAddress();<br>
<br>
   // Look for the sections that we are interested in.<br>
@@ -479,7 +500,8 @@ static std::error_code loadBinaryFormat(<br>
 }<br>
<br>
 ErrorOr<std::unique_ptr<BinaryCoverageReader>><br>
-BinaryCoverageReader::create(std::unique_ptr<MemoryBuffer> &ObjectBuffer) {<br>
+BinaryCoverageReader::create(std::unique_ptr<MemoryBuffer> &ObjectBuffer,<br>
+                             Triple::ArchType Arch) {<br>
   std::unique_ptr<BinaryCoverageReader> Reader(new BinaryCoverageReader());<br>
<br>
   SectionData Profile;<br>
@@ -492,7 +514,7 @@ BinaryCoverageReader::create(std::unique<br>
                            BytesInAddress);<br>
   else<br>
     EC = loadBinaryFormat(ObjectBuffer->getMemBufferRef(), Profile, Coverage,<br>
-                          BytesInAddress);<br>
+                          BytesInAddress, Arch);<br>
   if (EC)<br>
     return EC;<br>
<br>
<br>
Added: llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary?rev=231902&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary?rev=231902&view=auto</a><br>
==============================================================================<br>
Binary files llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary (added) and llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary Tue Mar 10 21:30:51 2015 differ<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary<br>
------------------------------------------------------------------------------<br>
    svn:executable = *<br>
<br>
Added: llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary.proftext<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary.proftext?rev=231902&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary.proftext?rev=231902&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary.proftext (added)<br>
+++ llvm/trunk/test/tools/llvm-cov/Inputs/universal-binary.proftext Tue Mar 10 21:30:51 2015<br>
@@ -0,0 +1,4 @@<br>
+main<br>
+0x0<br>
+1<br>
+100<br>
<br>
Added: llvm/trunk/test/tools/llvm-cov/universal-binary.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/universal-binary.c?rev=231902&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/universal-binary.c?rev=231902&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-cov/universal-binary.c (added)<br>
+++ llvm/trunk/test/tools/llvm-cov/universal-binary.c Tue Mar 10 21:30:51 2015<br>
@@ -0,0 +1,13 @@<br>
+// The coverage reader should be able to handle universal binaries<br>
+<br>
+//CHECK: 100| @[[LINE+1]]| int main<br>
+int main(int argc, const char *argv[]) {}<br>
+<br>
+// RUN: llvm-profdata merge %S/Inputs/universal-binary.proftext -o %t.profdata<br>
+// RUN: llvm-cov show %S/Inputs/universal-binary -instr-profile %t.profdata -no-colors -filename-equivalence %s -arch x86_64 | FileCheck %s<br>
+<br>
+// RUN: not llvm-cov show %S/Inputs/universal-binary -instr-profile %t.profdata -no-colors -filename-equivalence %s -arch i386 2>&1 | FileCheck --check-prefix=WRONG-ARCH %s<br>
+// WRONG-ARCH: Failed to load coverage<br>
+<br>
+// llvm-cov doesn't work on big endian yet<br>
+// XFAIL: powerpc64-, s390x, mips-, mips64-, sparc<br>
<br>
Modified: llvm/trunk/tools/llvm-cov/CodeCoverage.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/CodeCoverage.cpp?rev=231902&r1=231901&r2=231902&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/CodeCoverage.cpp?rev=231902&r1=231901&r2=231902&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-cov/CodeCoverage.cpp (original)<br>
+++ llvm/trunk/tools/llvm-cov/CodeCoverage.cpp Tue Mar 10 21:30:51 2015<br>
@@ -20,6 +20,7 @@<br>
 #include "SourceCoverageView.h"<br>
 #include "llvm/ADT/SmallString.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
+#include "llvm/ADT/Triple.h"<br>
 #include "llvm/ProfileData/CoverageMapping.h"<br>
 #include "llvm/ProfileData/InstrProfReader.h"<br>
 #include "llvm/Support/CommandLine.h"<br>
@@ -87,6 +88,7 @@ public:<br>
       LoadedSourceFiles;<br>
   bool CompareFilenamesOnly;<br>
   StringMap<std::string> RemappedFilenames;<br>
+  llvm::Triple::ArchType CoverageArch;<br>
 };<br>
 }<br>
<br>
@@ -193,7 +195,8 @@ CodeCoverageTool::createSourceFileView(S<br>
 }<br>
<br>
 std::unique_ptr<CoverageMapping> CodeCoverageTool::load() {<br>
-  auto CoverageOrErr = CoverageMapping::load(ObjectFilename, PGOFilename);<br>
+  auto CoverageOrErr = CoverageMapping::load(ObjectFilename, PGOFilename,<br>
+                                             CoverageArch);<br>
   if (std::error_code EC = CoverageOrErr.getError()) {<br>
     colored_ostream(errs(), raw_ostream::RED)<br>
         << "error: Failed to load coverage: " << EC.message();<br>
@@ -242,6 +245,9 @@ int CodeCoverageTool::run(Command Cmd, i<br>
       cl::desc(<br>
           "File with the profile data obtained after an instrumented run"));<br>
<br>
+  cl::opt<std::string> Arch(<br>
+      "arch", cl::desc("architecture of the coverage mapping binary"));<br>
+<br>
   cl::opt<bool> DebugDump("dump", cl::Optional,<br>
                           cl::desc("Show internal debug dump"));<br>
<br>
@@ -322,6 +328,16 @@ int CodeCoverageTool::run(Command Cmd, i<br>
       Filters.push_back(std::unique_ptr<CoverageFilter>(StatFilterer));<br>
     }<br>
<br>
+    if (Arch.empty())<br>
+      CoverageArch = llvm::Triple::ArchType::UnknownArch;<br>
+    else {<br>
+      CoverageArch = Triple(Arch).getArch();<br>
+      if (CoverageArch == llvm::Triple::ArchType::UnknownArch) {<br>
+        errs() << "error: Unknown architecture: " << Arch << "\n";<br>
+        return 1;<br>
+      }<br>
+    }<br>
+<br>
     for (const auto &File : InputSourceFiles) {<br>
       SmallString<128> Path(File);<br>
       if (!CompareFilenamesOnly)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>