From b81d4bfb44c14575130bb06c047728b69c3213aa Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 13 Oct 2020 16:20:40 -0700 Subject: [llvm-cov] Warn when -arch spec is missing/invalid for universal binary llvm-cov reports a poor error message when the -arch specifier is missing or invalid, and a binary has multiple slices. Make the error message more specific. rdar://40312677 --- llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp') diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index b75738b..c110ab7 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -950,6 +950,18 @@ loadBinaryFormat(std::unique_ptr Bin, StringRef Arch) { BytesInAddress, Endian); } +/// Determine whether \p Arch is invalid or empty, given \p Bin. +static bool isArchSpecifierInvalidOrMissing(Binary *Bin, StringRef Arch) { + // If we have a universal binary and Arch doesn't identify any of its slices, + // it's user error. + if (auto *Universal = dyn_cast(Bin)) + return none_of(Universal->objects(), + [Arch](const MachOUniversalBinary::ObjectForArch &Obj) { + return Obj.getArchFlagName() == Arch; + }); + return false; +} + Expected>> BinaryCoverageReader::create( MemoryBufferRef ObjectBuffer, StringRef Arch, @@ -970,6 +982,10 @@ BinaryCoverageReader::create( return BinOrErr.takeError(); std::unique_ptr Bin = std::move(BinOrErr.get()); + if (isArchSpecifierInvalidOrMissing(Bin.get(), Arch)) + return make_error( + coveragemap_error::invalid_or_missing_arch_specifier); + // MachO universal binaries which contain archives need to be treated as // archives, not as regular binaries. if (auto *Universal = dyn_cast(Bin.get())) { -- cgit v1.1