diff options
author | Vedant Kumar <vsk@apple.com> | 2020-10-13 16:20:40 -0700 |
---|---|---|
committer | Vedant Kumar <vsk@apple.com> | 2020-10-13 16:46:03 -0700 |
commit | 7fafaa07bcaddd6cad8323940b73c0df98a8f02a (patch) | |
tree | 5488db2e84ff41e8c43c4128bd9ea374792ea5d4 /llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | |
parent | 7d67c06391bba00a043c23eb6bb478484831de98 (diff) | |
download | llvm-7fafaa07bcaddd6cad8323940b73c0df98a8f02a.zip llvm-7fafaa07bcaddd6cad8323940b73c0df98a8f02a.tar.gz llvm-7fafaa07bcaddd6cad8323940b73c0df98a8f02a.tar.bz2 |
[llvm-cov] Warn when -arch spec is missing/invalid for universal binary (reland)
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.
(This version of the patch avoids using llvm::none_of -- the way I used
the utility caused compile errors on many bots, possibly because the
wrong overload of `none_of` was selected.)
rdar://40312677
Diffstat (limited to 'llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp')
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index b75738b..4936638 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -950,6 +950,19 @@ loadBinaryFormat(std::unique_ptr<Binary> 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<MachOUniversalBinary>(Bin)) { + for (auto &ObjForArch : Universal->objects()) + if (Arch == ObjForArch.getArchFlagName()) + return false; + return true; + } + return false; +} + Expected<std::vector<std::unique_ptr<BinaryCoverageReader>>> BinaryCoverageReader::create( MemoryBufferRef ObjectBuffer, StringRef Arch, @@ -970,6 +983,10 @@ BinaryCoverageReader::create( return BinOrErr.takeError(); std::unique_ptr<Binary> Bin = std::move(BinOrErr.get()); + if (isArchSpecifierInvalidOrMissing(Bin.get(), Arch)) + return make_error<CoverageMapError>( + 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<MachOUniversalBinary>(Bin.get())) { |