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