[MachO] Add valid architecture function

Added array of valid architectures and function returning array.
Modified llvm-lipo to include list of valid architectures in error message for invalid arch.

Patch by Anusha Basana <anusha.basana@gmail.com>

Differential Revision: https://reviews.llvm.org/D63735

llvm-svn: 365099
This commit is contained in:
Shoaib Meenai 2019-07-04 00:17:02 +00:00
parent f5a885fddd
commit 995798d2d5
4 changed files with 22 additions and 23 deletions

View File

@ -571,6 +571,7 @@ public:
const char **McpuDefault = nullptr,
const char **ArchFlag = nullptr);
static bool isValidArch(StringRef ArchFlag);
static ArrayRef<StringRef> getValidArchs();
static Triple getHostArch();
bool isRelocatableObject() const override;

View File

@ -57,6 +57,12 @@ namespace {
} // end anonymous namespace
static const std::array<StringRef, 17> validArchs = {
"i386", "x86_64", "x86_64h", "armv4t", "arm", "armv5e",
"armv6", "armv6m", "armv7", "armv7em", "armv7k", "armv7m",
"armv7s", "arm64", "arm64_32", "ppc", "ppc64",
};
static Error malformedError(const Twine &Msg) {
return make_error<GenericBinaryError>("truncated or malformed object (" +
Msg + ")",
@ -2718,27 +2724,12 @@ Triple MachOObjectFile::getHostArch() {
}
bool MachOObjectFile::isValidArch(StringRef ArchFlag) {
return StringSwitch<bool>(ArchFlag)
.Case("i386", true)
.Case("x86_64", true)
.Case("x86_64h", true)
.Case("armv4t", true)
.Case("arm", true)
.Case("armv5e", true)
.Case("armv6", true)
.Case("armv6m", true)
.Case("armv7", true)
.Case("armv7em", true)
.Case("armv7k", true)
.Case("armv7m", true)
.Case("armv7s", true)
.Case("arm64", true)
.Case("arm64_32", true)
.Case("ppc", true)
.Case("ppc64", true)
.Default(false);
return std::find(validArchs.cbegin(), validArchs.cend(), ArchFlag) !=
validArchs.cend();
}
ArrayRef<StringRef> MachOObjectFile::getValidArchs() { return validArchs; }
Triple::ArchType MachOObjectFile::getArch() const {
return getArch(getCPUType(*this));
}

View File

@ -1,7 +1,7 @@
# RUN: yaml2obj %s > %t
# RUN: not llvm-lipo %t -thin arc -output %t.out 2>&1 | FileCheck --check-prefix=ARCH_NOT_IN_FILE %s
# ARCH_NOT_IN_FILE: does not contain the specified architecture arc to thin it to
# RUN: not llvm-lipo %t -thin arm64_32 -output %t.out 2>&1 | FileCheck --check-prefix=ARCH_NOT_IN_FILE %s
# ARCH_NOT_IN_FILE: does not contain the specified architecture arm64_32 to thin it to
# RUN: not llvm-lipo %t -thin aarch101 -output %t.out 2>&1 | FileCheck --check-prefix=INVALID_ARCH %s
# INVALID_ARCH: Invalid architecture: aarch101

View File

@ -93,8 +93,15 @@ struct Config {
} // end namespace
static void validateArchitectureName(StringRef ArchitectureName) {
if (Triple(ArchitectureName).getArch() == Triple::ArchType::UnknownArch)
reportError("Invalid architecture: " + ArchitectureName);
if (!MachOObjectFile::isValidArch(ArchitectureName)) {
std::string Buf;
raw_string_ostream OS(Buf);
OS << "Invalid architecture: " << ArchitectureName
<< "\nValid architecture names are:";
for (auto arch : MachOObjectFile::getValidArchs())
OS << " " << arch;
reportError(OS.str());
}
}
static Config parseLipoOptions(ArrayRef<const char *> ArgsArr) {